ansible 的playbook 使用示例
实例二:handlers:
在notify中列出的操作为handler,比如之前配置了apache的配置文件,http.conf端口发生变化后,重新执行ansible-playbook后,查看远程的端口,并未发生变化。需要用到notify
引入变量:
vars:在后面添加变量名,然后再引入变量,必须加{{}},用变量名替换。
- hosts: 192.168.1.62
remote_user: root
vars:
- packages: httpd
tasks:
- name: install httpd packages
yum: name={{ packages }} state=latest
- name: install configuration file for httpd
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ packages }} state=started
handlers:
- name: restart httpd
service: name={{ packages }} state=restarted
执行效果:
ansible-playbook httpd_setup.yml 192.168.1.62 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
案例六:template:模板
比如两台远程服务器要监听的端口不同,maxclients不同,而且主机名不同。可以调用模板。j2代表模板。在本地创建模板文件httpd.conf.j2,在yml中定义template
cd /root/ && mkdir templates && cp conf/httpd.conf templates/
mv templates/httpd.conf template/httpd.conf.j2
vim httpd.conf.j2
Listen {{ http_port}}
MaxClients {{ maxClients}}
ServerName {{ ansbible_fqdn }}
vi /etc/ansible/hosts
[webservers]
192.168.133.2 http_port=80 maxClients=100
192.168.133.3 http_port=8080 maxClients=200
vi apache.yml
- host: webservers
remote_user: root
vars:
- package: httpd
tasks:
- name: install httpd packages
yum: name={{ package }} state=lastest
- name: install configuration file for httpd
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ package }} state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
ansible-playbook apache.yml
案例七:tags
多次运行playbook时,其中某些task不需要运行,只需运行某个task,可以单独标记该task,在yml中指定tags。
在playbook可以为某个或某些任务定义为一个标签,在执行playbook时,通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks而非所有的。
其中tags中的conf和service为自己命名的。特殊:不能定义为always
vi apache.yml
- host: webservers
remote_user: root
vars:
- package: httpd
tasks:
- name: install httpd packages
yum: name={{ package }} state=lastest
- name: install configuration file for httpd
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ package }} state=started
tags:
- service
handlers:
- name: restart httpd
service: name=httpd state=restarted
ansible-playbook apache.yml --tags="conf"
ansible-playbook apache.yml --tags="service"
roles:
1.目录名同文件名
2.目录结构有固定格式
files:静态文件
templates:Jinjia2模板文件
tasks:至少有main.yml文件,定义各tasks
handlers:至少一个main.yml文件,定义各handlers
vars:至少有一个main.yml文件,定义变量
meta:定义依赖关系等信息
3.site.yml中定义playbook,额外有其他的yml文件。
roles能根据层次型结构目录装载变量文件,task已经handlers,使用roles需要在playbook中
使用include指令即可。roles通过将变量,文件,任务,模块,处理器放置到单独的目录找那中
roles案例:
tree ansible_playbook
site.yml
webservers.yml
dbservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/
在playbook中,可以这样使用roles:
- hosts: webservers
roles:
- common
- webservers
也可以向 roles传递参数,例如:
|
1
2
3
4
5
|
- hosts: webservers roles: - common - { role: foo app instance, dir:'/opt/a, port: 5000 } - { role: foo app instance, dir: '/opt/b', port: 5001 } |
甚至也可以条件式地使用 roles,例如
|
1
2
3
|
- hosts: webservers rolesI - { role: some_role, when:"ansible_os_ family =='RedHat'" } |
1.创建role的步骤
(1)创建以 roles命名的目录
(2)在 roles目录中分别创建以各角色名称命名的目录,如 webservers等
(3)在每个角色命名的目录中分别创建f11es、 handlers、meta、 tasks、 templates和vars目录:用不到的目录可以创建为空目录,也可以不创建
(4)在p1 abook文件中,调用各角色
2.role内各目录中可用的文件
tasks目录:至少应该包含一个名为man.ym1的文件,其定义了此角色的任务列表:此文件可以使用 include包含其它的位于此目录中的task文件;
fi1es目录,存放由copy或script等模块调用的文件
templates目录: template模块会自动在此目录中寻找]inja2模板文件
handlers目录:此目录中应当包含一个main
ym1文件,用于定义此角色用到的各 handler;在 handler中使用 include包含的其它的 handler文件也应该位于此目录中
vars目录:应当包含一个main,ym1文件,用于定义此角色用到的变量
meta目录:应当包含一个main,ym1文件,用于定义此角色的特殊设定及其依赖关系; ansi1e1.3及其以后的版本才支持
default目录:为当前角色设定默认变量时使用此目录:应当包含一个main.ym1文件
Tags
tags用于让用户选择运行或路过 playbook中的部分代码。 ansi1e具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生
变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
案例:172.168.100.1配置成webserver,172.168.100.2配置成dbservers,172.168.100.3配置成web和db
|
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
|
mkdir -pv ansible_playbook/roles/{webservers,dbservers}/{tasks,files,templates,meta,handlers,vars}cd roles/webservers/cp /etc/httpd/conf/httpd.conf files/vim tasks/main.yml- name: install httpd packages yum: name=httpd- nane: install configuration file copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf tags: conf notify: - restart httpd- name: start httpd service: name=httpd state=startedvim handler/main.yml- name: restart httpd service: name=httpd state=restarted如果有vars可以配置,此示例中不使用vim vars/main.yml- http_port: 80- maxClients: 200如果想掉用webservers,在roles目录之外创建site.yml文件vim ansible_playbook/site.yml- hosts: webservers remote_user: root roles: - webservers - hosts: 172.168.100.1 remote_user: root roles: - dbservers- hosts: 172.168.100.2 remote_user: root roles: - dbservers - webservers |
同理在dbservers进行配置。
ansible-playbook site.yml

浙公网安备 33010602011771号