文章目录
- 1. handlers与notify
- 2. tags组件
- 3. playbook中使用变量
- 3.1使用 setup 模块中变量
- 3.2在playbook 命令行中定义变量
- 3.3在playbook文件中定义变量
- 3.4使用变量文件
- 3.5主机清单文件中定义变量
- 主机变量
- 组(公共)变量
1. handlers与notify
- Handlers:是task列表,用于当关注的资源发生变化时,采取一定的操作。
- Notify:被触发的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作。
- 例如:更新配置文件,重新启动playbook,系统不会重启服务,这时可以通过定义一个notify去重启服务,handlers负责执行重启。
- 写一个playbook文件安装httpd
vim httpd.yml
---
- hosts: webservers
remote_user: root
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=httpd state=started enabled=yes
ansible-playbook httpd.yml
2. 查看当前的端口状态
ansible webservers -a 'ss -ntl'
- 修改httpd的端口,从8080修改为81
vim ./files/httpd.conf
- 现在配置文件修改过了,我们在yaml文件中增加handlers与notify触发机制
vim httpd.yml
---
- hosts: webservers
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd
- name: copy conf file
copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart service # 当配置文件改变时,调用handlers里面的restart service
- name: start service
service: name=httpd state=started enabled=yes
handlers: # 当上面的某个或某些任务改变时,执行下面的任务
- name: restart service
service: name=httpd state=restarted
- 重新执行playbook,就可以检测到文件的修改,触发notify和handlers操作。
ansible-playbook httpd.yml
6. 最后查看端口状态,发现8080端口已经换成了81:
ansible webservers -a 'ss -ntl'
如果报错,说明端口号没有权限,换一个端口号。
systemctl status httpd.service
notify和handlers操作可以同时定义多个,相当于多个函数其实可以同时调用。
2. tags组件
在大型项目当中,通常一个playbook会有非常多的task。而我们每次执行这个playbook时,都会将所有task运行一遍。
而事实上,在实际使用过程中,我们可能只是想要执行其中的一部分任务而已,并不想把整个playbook完整跑一遍。这个时候就需要用到tags。
通过tags,我们可以给playbook中的某一些任务打上“标签”,而在执行playbook的时候,我们可以通过选定标签的方式指定只执行哪一些任务或者不执行哪一些任务。
- 创建一个playbook文件
vim httpd_tag.yml
#install httpd
- hosts: webservers
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/
#定义tags
tags: config
- name: web html
copy: src=files/index.html dest=/var/www/html/
- name: start service
service: name=httpd state=started enabled=yes
#定义tags
tags: service
- 查看当前tags列表(不知道命令就用–help查看)
ansible-playbook --list-tags httpd_tag.yml
3. 再次修改httpd的端口号
vim files/httpd.conf
4. 针对linux101这一台主机运行config 这个tag代码段。
ansible-playbook -t config httpd_tag.yml --limit linux101
ansible linux101 -a 'ss -ntl'
- 最后给它卸掉(PS:因为我的电脑…)
ansible-playbook remove_httpd.yml
3. playbook中使用变量
- 变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
- 变量定义:
variable=value
范例:http_port=80
- 变量调用方式:通过
{{ variable_name }}
调用变量,且变量名前后建议加空格,有时用“{{ variable_name }}”
才生效 - 变量来源:
- ansible 的 setup facts 远程主机的所有变量都可直接调用
- 通过命令行指定变量,优先级最高
ansible-playbook -e varname=value
- 在playbook文件中定义
vars:
- var1: value1
- var2: value2
- 在独立的变量YAML文件中定义
- hosts: all
vars_files:
- vars.yml
- 在
/etc/ansible/hosts
中定义
- 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
- 组(公共)变量:针对主机组中所有主机定义统一变量
6.在role中定义
3.1使用 setup 模块中变量
本模块自动在playbook调用,不要用ansible命令调用
- 案例:使用setup变量
---
#var.yml
- hosts: all
remote_user: root
#调用系统变量必须要收集,gather_facts: yes或者不写
gather_facts: yes
tasks:
- name: create log file
file: name=/data/{{ ansible_nodename }}.log state=touch owner=yu mode=600
ansible-playbook var.yml
ansible all -a 'ls /data'
3.2在playbook 命令行中定义变量
在playbook中写变量,在命令行赋值调用
范例:
vim val_install.yml
---
- hosts: webservers
remote_user: root
tasks:
- name: install package
yum: name={{ pkname }} state=present
ansible-playbook –e pkname=httpd val_install.yml
3.3在playbook文件中定义变量
范例:
vim var_uninstall.yml
---
- hosts: webservers
remote_user: root
vars:
- pkname: httpd
tasks:
- name: uninstall pkname
yum: name={{ pkname }} state=absent
直接运行,使用默认参数:
ansible-playbook var_uninstall.yml
在运行时重新给变量赋值,会修改参数:
ansible-playbook -e 'pkname=nginx' var_uninstall.yml
3.4使用变量文件
可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高
- 新建playbook定义变量
vim vars.yml
---
# variables file
var1: httpd
var2: nginx
vim var_log.yml
---
- hosts: webservers
remote_user: root
vars_files:
- vars.yml
# - /root/playbook/vars.yml
tasks:
- name: create httpd log
file: name=/data/{{ var1 }}.log state=touch
- name: create nginx log
file: name=/data/{{ var2 }}.log state=touch
ansible-playbook var_log.yml
ansible all -a 'ls /data/ '
3.5主机清单文件中定义变量
主机变量
在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用
组(公共)变量
在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量。
范例:
- 打开hosts文件,添加主机变量和公共变量
vim /etc/ansible/hosts
[webservers]
linux101 hname=www1 domain=yu.io #添加主机变量(优先级高于公共变量)
linux102 hname=www1 domain=yhx.com
[webservers:vars]#添加webservers的组变量(公共变量)
mark="-"
domain=edu.cn
- 调用
hostname
模块,修改主机名
#先想想主机名应该是什么
ansible webservers -m hostname -a 'name={{ hname}}{{ mark }}{{ domain }}'
ansible all -a 'hostname'
因为主机变量优先级高于组变量(公共变量),所以linux101的主机名应该是:www1-yu.io,linux102的主机名应该是:www1.yhx.com.
- 还可以通过行命令来指定变量,这时候指定的变量可以覆盖之前文件中定义的变量
#命令行指定变量:
ansible webservers -e domain=sch.com -m hostname -a 'name={{ hname }}{{ mark }}{{ domain }}'
ansible all -a 'hostname'
4. 再将hostname修改回去
ansible linux101 -m hostname -a 'name=linux101'
ansible linux102 -m hostname -a 'name=linux102'
ansible all -a 'hostname'