一、playbook中使用handlers和notify
Handlers本质是task list,类似MYSQL中的触发器触发的行为,主要用于当关注的资源发生变化的时候,才会采取一定的操作。而notify对应的action对应的action可用于每个play的最后被触发,这样可以多次有改变发生时,每次都执行指定的操作,仅在所有的变化完成后,一次性的执行指定的操作。在notify中列出的操作称作hander,也即notify中调用handler中定义的操作。
--- - hosts: webs remote_user: root gather_facts: no tasks: - name: copy docker_packages copy: src=docker_packages dest=/tmp - name: install docker shell: rpm -ivh /tmp/docker_packages/*.rpm --nodeps --force - name: copy daemon.json copy: src=daemon.json dest=/etc/docker/daemon.json tags: conf notify: - restart docker - name: start docker service: name=docker state=started enabled=yes handlers: - name: restart docker service: name=docker state=restarted
二、playbook中的tags组件
使用tags组件,指定为标签,在执行playbook时,可以选择特定的tags的task执行。
ansible-playbook --list-tags install_docker.yml
ansible-playbook -t conf install_docker.yml
三、playbook中的变量使用
变量名:仅能由字符、数字和下划线组成,且只能由字母开头
variable=value
变量调用方式:通过{{ variable_name }}调用变量,且变量名前后建议加空格,有时候需加“{{ variable_name }}”才生效
- 使用setup模块中的变量
例:var1.yml,因为此变量需要搜集主机的信息,所以只能在playbook中实现
--- - hosts: webs remote_user: root tasks: - name: use_variable file: path=/tmp/{{ ansible_hostname }}.log state=touch
- 在playbook命令中定义变量
例:var2.yml
--- - hosts: webs remote_user: root tasks: - name: install pkg yum: name={{ pkgname }} state=present - name: start service service: name={{ pkgname }} state=started
ansible-playbook var2.yml -e ‘pkgname=httpd‘
- 在playbook文件中使用变量
例:var3.yml
--- - hosts: webs remote_user: root vars: - username: user1 - groupname: group1 tasks: - name: create group group: name={{ groupname }} state=present - name: create user user: name={{ username }} state=present
- 使用变量文件
例:vars.yml和install_app.yml
--- #variables file package_name: vsftpd service_name: vsftpd
--- #install app and configure - hosts: webs remote_user: root vars_files: - vars.yml tasks: - name: install package yum: name={{ package_name }} state=installed tags: install - name: start service service: name={{ service_name }} state=started enabled=yes
ansible-playbook install_app.yml
- 主机清单文件中定义变量
修改主机清单/etc/ansible/hosts
[webs]
192.168.100.100 hostname=master
192.168.100.110 hostname=node1
192.168.100.130 hostname=node2
[webs:vars]
domain=zhangsan
ansible webs -m file -a ‘path=/tmp/{{ hostname }}.{{ domain }}.txt state=touch‘
注意每个主机各自定义的变量优先级要高于分组变量,当主机变量与分组变量相同时,取主机变量