handlers和notify结合使用触发条件
·Handlers(触发器)
是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作。
·Notify(通知)
此action可用于在每个play的最后被触发,这样可以避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成最后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
·以http服务为例
--- - hosts: websrvs remote_ user: root tasks : - name: install httpd package yum: name=httpd - name: copy conf file copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes notify:
- restart service#起到通知作用 - name: start service service: name=httpd state=started enab led=yes handlers:#这个是触发器 - name: restart service service: name=httpd state=restarted
·playbook中的tags使用(创建标签)
--- - hosts: websrvs remote_ user: root tasks : - name: install httpd package yum: name=httpd - name: copy conf file copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes notify: - restart service#起到通知作用 tags: inshttpd#创建便签,可以通过名字调用上面的内容 - name: start service service: name=httpd state=started enab led=yes handlers:#这个是触发器 - name: restart service service: name=httpd state=restarted
···可以通过调用标签单独执行角色里面的内容···
ansible-playbook -t inshttpd httpd.yml#-t是指定要执行的标签,多个标签用逗号隔开,多个标签可以定义一样的名字
playbook中的变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量来源:
1.ansible setup facts 远程主机的所有变量都可以直接调用
2.在/etc/ansible/hosts中定义
普通变量:主机组中的主机单独定义,优先级高于公共变量
公共组变量:针对主机组中所有主机定义统一变量
[webserver] 192.168.157.1 192.168.157.2 hosts1=25#普通变量
[webserver:vars]#定义组变量
nodname=www
dom=magendu.com
3.通过命令行执行指定变量,优先级最高
---
- hosts: websrvs
remote_ user: root
tasks :
- name: install httpd package
yum: name={{变量}}
- name: start service
service: name={{变量}} state=started enabled=yes
ansible-playbook -e '变量=httpd' http.yml#多个变量执行时,用空格隔开
4.在playbook中定义
vars:
- var1:value1
- var2:value2
--- - hosts: websrvs remote_ user: root vars: - pkname1: httpd - pkname1: vsftp tasks : - name: install httpd package yum: name={{pkname1}} - name: start service service: name={{pkname2}} state=started enabled=yes
5.在role中定义
6.可以在一个文件中定义许多变量
vim vasr.yml
var1: httpd
var2: vsftp
在使用的时候需要指定
--- - hosts: 10.6.12.56 remote_user: root vars_files: - vars.yml tasks: - name:install package yum: name={{ var1 }}
模板templates
·文本文件,嵌套由有脚本(使用模板编程语言编写)
·jinja2语言,使用字面量,有下面形式
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1,item2,。。。]
元组:(item1,item2,。。。)
字典:{item1,item2,。。。}
布尔型:true/false
·算数运算:+,-,*,/,//,%,**
·比较操作:==,!=,>,>=,<,<=
·逻辑运算:and,or,not
·流表达式:For If When
·在选取文件当模板的时候需要改名,一般以j2当文件后缀,并将文件放在templates文件目录下
以管理nginx为例
--- - hosts: 10.6.12.53 renout_user: root tasks: - name: install package yum: name=nginx - name: copy template templates: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: start service service: name=nignx start=stared enabled=yse
when
条件测试:如果需要根据变量,facts或此前任务的执行结果来作为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法式。
·when语句
·在task后添加wen子句即可使用条件测试;when语句支持jinja2表达式语法
--- - hosts: 10.6.12.53 renout_user: root tasks: - name: install package yum: name=nginx - name: copy template templates: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version=="7"#当符合这个条件就执行上面 - name: start service service: name=nignx start=stared enabled=yse