ansible-galaxy剧本

ansible-galaxy剧本


一、ansible-galaxy

  • 连接 https://galaxy.ansible.com 下载相应的roles
  • 列出所有已安装的galaxy

    • ansible-galaxy list
  • 安装galaxy

    • ansible-galaxy install geerlingguy.redis
  • 删除galaxy
    • ansible-galaxy remove geerlingguy.redis

ansible-pull

  • 推送命令至远程,效率无限提升,对运维要求较高

二、playbook

playbook是由一个或多个“play”组成的列表

play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task 定义好的角色。从根本上来讲,所谓task无非是调用ansible的一个module。 将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制 同唱一台大戏

Playbook采用YAML语言编写

三、YAML介绍

  • YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、 C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种 语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者
  • YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意 思其实是:”Yet Another Markup Language”(仍是一种标记语言)
  • 特性
    • YAML的可读性好
    • YAML和脚本语言的交互性好
    • YAML使用实现语言的数据类型
    • YAML有一个一致的信息模型
    • YAML易于实现
    • YAML可以基于流来处理
    • YAML表达能力强,扩展性好
    • 更多的内容及规范参见http://www.yaml.org

四、YAML语法简介

  • 在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三 个点号( … )用来表示档案结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过 缩进结合换行来实现的
  • YAML文件内容是区别大小写的,k/v的值均需大小写敏感
  • k/v的值可同行写也可换行写。同行使用:分隔
  • v可是个字符串,也可是另一个列表
  • 一个完整的代码块功能需最少元素需包括 name: task
  • 一个name只能包括一个task
  • YAML文件扩展名通常为yml或yaml

五、YAML语法简介

  • List:列表,其所有元素均使用“-”打头

  • Dictionary:字典,通常由多个key与value构成

六、YAML语法

  • YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构 (Structure)通过空格来展示,序列(Sequence)里的项用”-“来代表,Map里的键值对用”:”分隔

七、Playbook核心元素

  • Hosts 执行的远程主机列表
  • Tasks 任务集
  • Varniables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否 则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其 确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可 以通过tags跳过此些代码片断

ansible-playbook –t tagsname useradd.yml

八、playbook基础组件

  • Hosts:
    • playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用 户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机 清单中
  • 可以是如下形式:

    • one.example.com
    • one.example.com:two.example.com
    • 192.168.1.50 192.168.1.*
    • Websrvs:dbsrvs 两个组的并集
    • Websrvs:&dbsrvs 两个组的交集
    • webservers:!phoenix 在websrvs组,但不在dbsrvs组
    • 示例: - hosts: websrvs:dbsrvs
  • remote_user:可用于Host和task中。也可以通过指定其通过sudo的方式在远 程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使 用sudo_user指定sudo时切换的用户

  • - hosts: websrvs
    • remote_user: root
  • tasks:

    • - name: test connection
    • ping:
    • remote_user: magedu
    • sudo: yes 默认sudo为root
    • sudo_user:wang sudo为wang
  • task列表和action

  • play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定 的所有主机上执行,即在所有主机上完成第一个任务后,再开始第二个任务
  • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模 块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
  • 每个task都应该有其name,用于playbook的执行结果输出,建议其内容尽 可能清晰地描述任务执行步骤。如果未提供name,则action的结果将用于 输出

  • tasks:任务列表

  • 格式:
    • (1) action: module arguments
    • (2) module: arguments 建议使用
    • 注意:shell和command模块后面跟命令,而非key=value
  • 某任务的状态在运行后为changed时,可通过“notify”通知给相应的 handlers
  • 任务可以通过”tags“打标签,而后可在ansible-playbook命令上使用-t指定进 行调用
  • 示例:
    • tasks:
      • - name: disable selinux
      • command: /sbin/setenforce 0
  • 如果命令或脚本的退出码不为零,可以使用如下方式替代
    • tasks:
      • - name: run this command and ignore the result
      • shell: /usr/bin/somecommand || /bin/true
  • 或者使用ignore_errors来忽略错误信息:

    • tasks:
      • - name: run this command and ignore the result
      • shell: /usr/bin/somecommand
      • ignore_errors: True
  • 运行playbook的方式

    • ansible-playbook <filename.yml> … [options]
  • 常见选项
  • –check 只检测可能会发生的改变,但不真正执行操作 -C
  • –list-hosts 列出运行任务的主机
  • –limit 主机列表 只针对主机列表中的主机执行
  • -v 显示过程 -vv -vvv 更详细

  • 示例

    • ansible-playbook file.yml –check 只检测
    • ansible-playbook file.yml
    • ansible-playbook file.yml –limit websrvs


范例:写一个简单的playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@ansible data]# vim test.yml
---
- hosts: websrvs (应用主机)
remote_user: root (在远程主机执行任务以谁的身份)

tasks: (任务列表)
- name: diyi (任务名称,多个任务,多个任务名)
ping: (模块)
- name: dier
shell: /bin/ls /data/

执行之前,检查是否有错误语法,仅是测试并不是真正去执行
[root@ansible data]# ansible-playbook --check


查看这个playbook执行会对哪个主机进行操作
[root@ansible data]# ansible-playbook test.yml --list-hosts
playbook: test.yml
play #1 (appsrvs): appsrvs TAGS: []
pattern: [u'appsrvs']
hosts (2):
192.168.131.187
192.168.131.188

查看这个playbook执行任务的列表
[root@ansible data]# ansible-playbook test.yml --list-tasks
playbook: test.yml
play #1 (appsrvs): appsrvs TAGS: []
tasks:
diyi TAGS: []
dier TAGS: []

范例:使用playbook 实现在被控制端,安装http包,将本机的http配置文件范例复制到被控制端,并且将被控制端的服务,启动起来,设置为开机启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
第一步:
创建apache用户,指定组-g apache,指定uid -u 80,指定shell类型-s /sbin/nologin ,指定家目录-d /usr/share/httpd ,系统账户-r
第二步:
安装软件包
第三步:
将控制端修改好的配置文件scp到被控制端的服务的主配置文件中,最为服务已经特定配置好再进行的安装

第四步:重启服务,设置为开机启动项

给apache系统用户设置一个安全的密码
[root@ansible ~]# openssl passwd -1
Password:
Verifying - Password:
$1$uJM71bTc$9yyqQzIm/5PZBrHKTpSHu0


准备好控制端需要http服务的配置文件
[root@ansible playbook]# ls
httpd.conf 修改配置文件,修改端口号8080

编写playbook
[root@ansible playbook]# vim httpd.yml

---
- hosts: 192.168.131.187
remote_user: root

tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache group=apache uid=80 shell=/sbin/nologin home=/usr/sh
are/httpd system=yes password='$1$uJM71bTc$9yyqQzIm/5PZBrHKTpSHu0'
- name: install package
yum: name=httpd
- name: config file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
- name: server httpd
service: name=httpd state=started enabled=yes

执行前测试
[root@ansible playbook]# ansible-playbook -C httpd.yml

检查无误则执行此脚本
[root@ansible playbook]# ansible-playbook httpd.yml

查看是否成功
[root@ansible playbook]# ansible 192.168.131.187 -a 'ss -ntl'
LISTEN 0 128 :::8080 :::*
[root@ansible playbook]# ansible 192.168.131.187 -a 'getent passwd apache'
192.168.131.187 | SUCCESS | rc=0 >>
apache:x:80:80::/usr/share/httpd:/sbin/nologin


如果文件中有一项修改了,想再次执行此playbook ,使得服务设置发生变化,这里原有内容不被修改,
方法1
可以将重启服务的时候将started 设置为restarted
方法2 handlers 和notify(幂等性不做重复操作)
触发动作:如果此项发生修改则触发此操作,如果此项未发生变化,则不触发此操作(上述实验:如果修改控制端发给被控制端的配置文件端口号发生变化,则要重新拷贝配置文件到被控制端,命为发生修改,触发动作)切记触发任务notify 和 触发的操作handlers 名字要一样,因为可能出现多个触发任务

[root@ansible playbook]# vim httpd.yml

---
- hosts: 192.168.131.187
remote_user: root

tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache group=apache uid=80 shell=/sbin/nologin home=/usr/share/httpd system=yes password='$1$uJM71bTc$9yyqQzIm/5PZBrHKTpSHu0'
- name: install package
yum: name=httpd
- name: config file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart service httpd
- name: server httpd
service: name=httpd state=started enabled=yes

handlers:
- name: restart service httpd
service: name=httpd state=restarted
测试:将控制端发给被控制端的服务配置文件发射管修改 Listen 80808

[root@ansible playbook]# ansible-playbook -C httpd.yml
[root@ansible playbook]# ansible-playbook httpd.yml
[root@ansible playbook]# ansible 192.168.131.187 -a 'ss -tnlp'
LISTEN 0 128 :::9527
`

范例:触发两个动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@ansible playbook]# cat httpd.yml 
---
- hosts: 192.168.131.187
remote_user: root

tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache group=apache uid=80 shell=/sbin/nologin home=/usr/share/httpd system=yes password='$1$uJM71bTc$9yyqQzIm/5PZBrHKTpSHu0'
- name: install package
yum: name=httpd
- name: config file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify:
- restart service
- check httpd
- name: server httpd
service: name=httpd state=started enabled=yes

handlers:
- name: restart service
service: name=httpd state=restarted
- name: check httpd
shell: /usr/bin/killall -0 httpd &> /dev/null
`

范例:Playbook中tags使用 `

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
用处:可以挑选性的执行playbook中的操作
[root@ansible playbook]# vim httpd.yml

---
- hosts: 192.168.131.187
remote_user: root

tasks:
- name: create group
group: name=apache system=yes gid=80
- name: create user
user: name=apache group=apache uid=80 shell=/sbin/nologin home=/usr/share/httpd system=yes password='$1$uJM71bTc$9yyqQzIm/5PZBrHKTpSHu0'
- name: install package
yum: name=httpd
- name: config file
copy: src=/root/playbook/httpd.conf dest=/etc/httpd/conf/ backup=yes
tags: config
notify:
- restart service
- check httpd
- name: server httpd
tags: server
service: name=httpd state=started enabled=yes

handlers:
- name: restart service
service: name=httpd state=restarted
- name: check httpd
shell: /usr/bin/killall -0 httpd &> /dev/null

仅执行特定标签
[root@ansible playbook]# ansible-playbook -t config httpd.yml

也可以将一个标签代表连个操作,或者一个动作多个标签,
执行两个标签
[root@ansible playbook]# ansible-playbook -t "config,server" httpd.yml

-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%