handlers和notify结合使用触发条件
handlers
是task列表 用于当关注的资源发生变化时,才会采取一定的操作
notify 此action可用于每个play的最后被触发 这样可避免多次有改变发生时每次都执行指定的操作 仅在所有的变化发生完成后一次性的执行指定操作 在notify中列出的操作称为handler 也即notify中调用handler中定义的操作
---
- hosts: all
remote_user: root
tasks:
- name: isntall
yum: name=httpd
tags: installhttpd
- name: copy
copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart
- name: selinux
shell: sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
- name: selinux 0
shell: setenforce 0
- name: service
service: name=httpd state=started enabled=yes
tags: starthttpd
handlers:
- name: restart
service: name=httpd state=restarted
handlers 定义要执行的动作
notify 后面跟handlers定义的想要执行的操作
多个的话可以这样写
notify:
- restart
- check
handlers:
- name: restart
service: name=nginx state=restarted enabled=yes
- check
shell: kill -O nginx > /tmp/nginx.log
tags 可以给执行的操作设置一个标签 可以用来单独执行标签的操作
多个动作共用一个标签也可以 这时候 这个标签执行 会执行多个动作
ansible-playbook httpd.yml -t starthttpd
ansible-playbook httpd.yml -t starthttpd,installhttpd
playbook中变量使用
变量名 仅能由字母 数字 和下划线 且 只能以字母开头
变量来源:
1 ansible setup facts 远程主机的所有变量都可直接调用
2 在/etc/ansible/hosts 中定义
普通变量 主机组中主机单独定义 优先级高于公共变量
公共变量 针对主机组中所有主机统一变量
3 通过命令行指定变量 优先级最高
ansible-playbook -e varname=value
4 在playbook中定义
vars:
- vat1:value1
- vat2:value2
5 在role中定义
ansible all -m setup -a 'filter=ansible_hostname'
ansible all -m setup -a 'filter=*addr*'
命令行指定
---
- hosts: all
remote_user: root
tasks:
- name: isntall package
yum: name={{ pkname }}
- name: service
service: name={{ pkname }} state=started enabled=yes
tags: starthttpd
ansible-playbook -e 'pkname=vsftpd' app.yml
---
- hosts: all
remote_user: root
tasks:
- name: isntall package
yum: name={{ pkname1 }}
- name: isntall package
yum: name={{ pkname2 }}
ansible-playbook -e 'pkname1=vsftpd pkname2=memcached' app.yml
在playbook中定义
---
- hosts: all
remote_user: root
vars:
- pkname1: httpd
- pkname2: vsftpd
tasks:
- name: isntall package
yum: name={{ pkname1 }}
- name: isntall package
yum: name={{ pkname2 }}
ansible all -m yum -a 'name=httpd,vsftpd state=absent'
ansible-playbook app.yml
---
- hosts: all
remote_user: root
tasks:
- name: set hostname
hostname: name=www.{{http_port}}.com
[web]
192.168.0.211 http_port=node1
[ser]
192.168.0.213 http_port=node3
[root@node3 ansible]
ansible-playbook -C hostname.yml
在/etc/ansible/hosts 中定义
[ser]
192.168.0.213 http_port=node3
[ser:vars]
nodename=www.
mainname=.com
---
- hosts: all
remote_user: root
tasks:
- name: set hostname
hostname: name={{nodename}}{{http_port}}{{mainname}}
ansible-playbook hostname.yml