开发者学堂课程【自动化运维工具 Ansible 实战:实现 playbook 高级应用和企业级实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/577/detail/7978
playbook 高级应用和企业级实战
内容介绍
一、handlers 和 notify 结合使用触发条件
二、playbook 中 handlers 使用示例1
三、示例2
四、Playbook 中 tags 使用
五、Playbook 中变量使用
一、handlers和notify结合使用触发条件
1、Handlers(触发器)
是 task 列表,这些 task 与前述的 task 并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。
[root& centos7ansible ]#cat file.ym
l
hosts;websrvs
remote user;root
tasks:
name:create new user
user:name= test2system =yes shell=/sbin/nologin
name:install package
yum:name=httpd
name:copy html
copy:src=files/index.htmldest=/var/www/html/
name:copy test html
copy:src=files/test.htmldest=/var/www/html/
name;start service
service:name= httpd state = started nabled =yes
以上看到 tasks 是按顺序执行的,不论客户端是何状态都是顺序执行,这种顺序执行会带来问题,如果某时更新了配置文件,此配置文件复制到其他主机但不会生效,因为前次执行无此文件,之后还是按照更新前执行,这时就用到 handlers 的触发效果。
handlers 和 tasks 是并列的关系,handlers 可以监控 tasks 里的 action 动作,当监测到 action 动作执行成功时,会初触发 handlers 后面定义的一些命令,所以需要配合一个 Notify。
在 action 后放一个 Notify,当 action 发生变化了,就会去通知 handlers 的执行。
2、Notify
(翻译为通知)此 action 可用于在每个 play 的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。
在 notify 中列出的操作称为 handler, 也即 notify 中调用 handler 中定义的操作。
我们改文件:
tasks
:
name: install httpd package
yum:name=httpd
-name
:
copy conf file
copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes
name:start service
service:name=httpdstate =startedenabled =yes
然后我们来执行:一一一一一一一一一一一一
[
root@ansible ansible]#ansible-playbook httpd.yml
此时配置文件完成,但是没有生效,需要一旦发现配置文件更换就重启服务,此时就需要 handlers 和 notify:
tasks
name: install httpd package
yum:name=httpd
name
copy conf file
copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes
n
otify:restart service
name:start service
service:name= httpdstate = startedenabled =yes
h
andlers:
name:restart service
s
ervice:name=httpd state=restarted
当看到 -name
:
copy conf file
copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes
时会执行 -
name:restart service
s
ervice:name=httpd state=restarted
看到写的为:
n
otify:restart service
因为下面操作的名字为 restart service,所以写notify 要加上名字。
二、playbook 中 handlers 使用示例1
hosts:websrvs
remote_user:root
gather_facts:no
tasks:
name:Install httpd
yum:name=httpd state=present
name:Install configure file
copy:src=files/httpd.conf dest=/etc/httpd/conf/
notify restart servicename:ensure apache is running
service:name=httpd state=started enabled=yes
handlers:
name:restart
service
service:name=httpd state=restarted
三、示例2
-hosts:websrus
remote user;root
tasks:
name:add group nginx
tags:user
user:name=nginx state=present
name;add user nginx
user:name=nginx state=present group=nginx
name:Install Ngi
yum:name=nginx state=present
name:config
copy:src=/root/config. txt=/etc/nginx/nginx. conf
notify:
Rastart Nginx
Check Nginx Process
handlers;
name:Restart Nginx
service;name=nginx state=restarted enabled=yes
name:Check Nginx process
shell;killall-0 nginx>/tmp/nginx. Log
四、Playbook 中 tags 使用
hosts:websrvs
remote_user:root
tasks
name:install httpd package
yum:name=httpd
t
ags:inshttpd
-name
copy conf file
copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes
n
otify:restart service
name:start servic
service:name= httpdstate=startedenabled =yes
t
ags:rshttpd
h
andlers:
name:restart service
s
ervice:name=httpd state=restarted
此时我们有了标签,就可单单执行一个标签里的服务:
[
root@ansible ansible]#
ansible
-playbook-t rshttpd httpd.yml
这就执行了一个标签里的服务,也可启动两个标签里的多个服务:
root@ansible ansible]#
ansible
-playbook -t
inshttpd
rshttpd httpd.yml
多个动作共用一个标签也是可以的
tasks
-name:install httpd package
yum:name=httpd
t
ags:httpd
-name
copy conf file
copy:src=files/httpd.conf dest=/etc/httpd/conf/backup=yes
n
otify:restart service
name:start service
service:name=httpdstate=startedenabled=yes
t
ags:httpd
h
andlers:
-
name:restartservice
s
ervice:name=httpd state=restarted
此时 httpd 就执行了两个标签。
示例:
httpd.yml
hosts:websrvs
remoteuser:root
tasks:
name:Installhttp
yum:name=httd state=present
name:Installconfigure file
copy:src=files/httpd.confdest=/etc/httpd/conf/
tags:con
-name:starthttpd service
tags:service
service:name=httpdstate =startedenabled =yes
ansible-playboot conf httpd .yml
五、Playbook 中变量使用
playbook 中定义死板,若借助变量,针对不同的场景,运用不同的变量,不同的主机,实现不同的操作。
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:
1、 ansible setup facts 远程主机的所有变量都可直接调用。
[root@ansible
ansible
]#
ansible
websrvs
-m
setup
执行后会显示此主机状态信息包括地址、架构、主机名等等。
如想单一查看主机名时:
root@ansible
ansible
]#
ansible
websrvs
-m
setu
grep
ansible
fqdn
当然更高级的:
root@ansible
ansible
]#
ansible
websrvs
m
setup
‘filter=ansible_hostname’
同样通配符也可以。
root@ansible
ansible
]#
ansible
websrvs
-m
setup
-a ‘filter=ansible
eth*‘
可查看网卡信息。
2、在 /etc/ansible/hosts 中定义
普通变量:主机组中主机单独定义,优先级高于公共变量。
公共(组)变量:针对主机组中所有主机定义统一变量。
它可以针对单一主机也可对一组主机来操作赋值
hosts:websrvs
remote user:root
tasks:
name:Install httpd
hostname:name=www{{http_port}}.magedu.com
这就在 hosts 中完成定义。一一一一一一一一一
3、通过命令行指定变量,优先级最高
ansible-playbook-e varname=value
[root@ansible ~]#vim
app.
yml
hosts: websrvs
remote_user: root
tasks:
-name:install package
yum: name={{pkname}}
name:start service
service:name={{pkname}} state=started enabled=yes
此时如何执行 playbook 的时候指定变量名,此时用 -e 来赋值:
[root@ansible
ansible
]#ansible-playbook-e "pkname=
vsftpd
app.yml
hosts:websrv
remote_user: root
tasks:
-name: installpackage
yum:name={{pkname1}}
-name:startservice
yum: name={{pkname
2
}}
[root@ansible ansibl]#ansible-playbook -e "pkname
1
=
httpd
pkname2=memcached‘
app.yml
此时给两个变量赋值。一一一一一一一
4、在 playbook 中定义
vars:
-var1:value1
-var2:value2
示例:
[root@ansible ~]#vim
app.
yml
- hosts:
app
srvs
remote_user:root
v
ars:
-
pkname1:httpd
-pkname2:vsftpd
tasks:
-name:installpackage
yum:name={{pkname1}}
-name:startservice
yum: name={{pkname
2
}}
此时直接执行 playbook 就行:
[root@ansible
ansible
]#
ansible-playbook
app
yml
5、在 role 中定义
6、变量命名:变量名仅能由字母、数字和下划线组成,且只能以字母开头。一一
7、变量定义:
key=value
示例: http_port=80
8、变量调用方式:
通过 {{ variable _ name }} 调用变量,且变量名前后必须有空格,有时用“{{ variable_name}}”
才生效。一一一一一一一一一一一一
Fansible-playbook-e
选项指定,一一一一一一一一一一一一
ansible-playbooktest.yml-e"hosts=wwwuser=mageedu"
playbook 像我们跟脚本一样,编脚本会涉及到循环、条件判断等,将来 playbook也都如此,所以需要有一定的逻辑性。playbook 的基本写法,一定要注意:
[root@ansibleansible ]#cathostname'yml
hosts:websrvs
remote user;root
tasks:
name:set hostname
hostname:name={{nodename}}{{http_port}}.{{domainname}}
这里面是不能少的, remote user 然后一个个 tasks。
之后的 handlers 与 notify 是要同时使用的不能独立使用,当一个动作发生的时候,触发另一个动作的执行。
然后讲 tags 标签最后又补充了变量的使用,变量可以在好几个地方来定义,你可以在命令行中定义,也可以在主机清单里面定义,还可以在 playbook 里面定义。