目录
在下面学角色roles模板之前,还得重新回顾一下Playbooks变量。使用好变量对后面的使用模板template很重要。
一、playbooks变量介绍
在使用模板之前,先回顾一下ansbile有如下变量,也可以看ansible官方文档的playbook变量
- 命令行
- 在Inventory中定义
- 在Playbook中定义
- 在Role中定义
- 注册变量(register)
- 系统信息变量(facts)
二、使用例子及说明
2.1 命令行变量
命令行变量,就可以把变量写在playbooks中,然后使用ansible-playbook命令加 -e参数, -e为 EXTRA_VARS的意思,就可以使用了
例子:
#编写一个playbook,获取指定网卡接口的IP v4地址
# 取 interface 变量值,这个变量我在下面命令行中定义
[root@vm82 ansible]# cat yaml-conf/t1.yml
---
- hosts:
- hua
remote_user: root
tasks:
- name: find {{ interface }} ip address
shell: ip addr show {{ interface }} |grep 'inet\>'|awk {'print $2'}
#在命令行中,定义一个 变量 interface并赋值为ens33
[root@vm82 ansible]# ansible-playbook yaml-conf/t1.yml -e interface=ens33 -v
Using /etc/ansible/ansible.cfg as config file
PLAY [hua] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [192.168.3.21]
TASK [find ens33 ip address] ***************************************************************************************
changed: [192.168.3.21] => {"changed": true, "cmd": "ip addr show ens33 |grep 'inet\\>'|awk {'print $2'}", "delta": "0:00:00.154328", "end": "2020-09-14 15:35:01.708922", "rc": 0, "start": "2020-09-14 15:35:01.554594", "stderr": "", "stderr_lines": [], "stdout": "192.168.128.21/24", "stdout_lines": ["192.168.128.21/24"]}
PLAY RECAP *********************************************************************************************************
192.168.3.21 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
上面的 -e interface=ens33 就是定义一个变量interface并赋值为ens33
2.2 主机清单Inventory中定义变量
我在《ansible 剧本Playbooks(一) 介绍、组件及使用》的“清单Inventory”已经讲过了。
我这里还是写了下吧,我在hosts主机列表中定义一个http_port变量
#/etc/ansible/hosts的hua主机组中定义一个http_port变量,值为80
[hua]
192.168.3.21 http_port=80
#在t2.yml中取ansible hosts配置中变量http_port的值
[root@vm82 ansible]# cat yaml-conf/t2.yml
---
- hosts:
- hua
remote_user: root
tasks:
- name: print http_port
debug: msg="the {{ inventory_hostname }} http port is {{ http_port }} "
#执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/t2.yml
PLAY [hua] ********************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************
ok: [192.168.3.21]
TASK [print http_port] ********************************************************************************************************
ok: [192.168.3.21] => {
"msg": "the http port is 80 "
}
PLAY RECAP ********************************************************************************************************************
192.168.3.21 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@vm82 ansible]#
[root@vm82 ansible]#
[root@vm82 ansible]# ansible-playbook yaml-conf/t2.yml
PLAY [hua] ********************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************
ok: [192.168.3.21]
TASK [print http_port] ********************************************************************************************************
ok: [192.168.3.21] => {
"msg": "the 192.168.3.21 http port is 80 "
}
PLAY RECAP ********************************************************************************************************************
192.168.3.21 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
PS:ansible特殊变量中的魔法变量,所谓的魔法变量,它的值是变化的,不需要你赋值,它会自动按特定规则取。看一下它的解释就知道怎用了。
2.3 在Playbook中定义
这个就不用说了吧,前面都讲很多了,比如
#下面vars表示定义变量
[root@vm82 ansible]# cat yaml-conf/config_nginx.yml
---
- hosts: hua
remote_user: root
vars:
- indexhtml: /disk1/www/hualinux.com/index.html
- service: nginx
2.4 Role中定义变量
这个前面也讲了,直接在vars目录中建立即可,如nginx角色的
#定义一个 install_dir 变量,赋值为 /disk1/tools
[root@vm82 ansible]# cat roles/nginx/vars/main.yml
install_dir: /disk1/tools
2.5 系统信息变量(facts)
这个也更简单,使用
ansible <主机名/主机组> -m setup
里面列出的变量,直接使用即可,比如查看操作系统版本
#编写剧本
[root@vm82 ansible]# cat yaml-conf/t3.yml
---
- hosts:
- hua
remote_user: root
tasks:
- name: print system and version
debug: msg=" {{ ansible_distribution }} {{ ansible_distribution_major_version }}"
#查看执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/t3.yml
PLAY [hua] **********************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.3.21]
TASK [print system and version] *************************************************************************************
ok: [192.168.3.21] => {
"msg": " CentOS 8"
}
PLAY RECAP **********************************************************************************************************
192.168.3.21 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.6 注册变量(register)
2.6.1 register 说明
这个重要得好好学一下,注册变量简单来说就是
把模块执行的结果保存在一个变量中,只不过这个变量名固定放在key为register的对象中。
形式为: register: 变量名
我们把放在register中的变量叫注册变量。
变量的另一个主要用途是在运行命令时,把命令结果存储到一个变量中.不同模块的执行结果是不同的.运行playbook时使用-v选项可以看到可能的结果值. 在ansible执行任务的结果值可以保存在变量中
如果能把模块的执行结果放在一个变量中,那就有无限种玩法了,我可以使用shell脚本、命令、python等等
得到的结果也可以是各种类型,再结合后面的jinja2强大的语法,那模板可以玩出各种花样了。
2.6.2 例子
比如判断某个网站目录是否存在,写法如下:
[root@vm82 ansible]# cat yaml-conf/register.yml
---
- hosts: hua
remote_user: root
vars:
site_dir: /disk1/www/hualinux.com
tasks:
- name: "判断网站 /disk1/www/hualinux.com 目录是否为空"
shell: if [ -d {{ site_dir }} ];then echo true;else echo false;fi
register: IsStieDirEmpty
#执行效果
[root@vm82 ansible]# ansible-playbook yaml-conf/register.yml -v
Using /etc/ansible/ansible.cfg as config file
PLAY [hua] **********************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [192.168.3.21]
TASK [判断网站 /disk1/www/hualinux.com 目录是否为空] **************************************************************************
changed: [192.168.3.21] => {"changed": true, "cmd": "if [ -d /disk1/www/hualinux.com ];then echo true;else echo false;fi", "delta": "0:00:00.011901", "end": "2020-09-14 18:43:23.083345", "rc": 0, "start": "2020-09-14 18:43:23.071444", "stderr": "", "stderr_lines": [], "stdout": "true", "stdout_lines": ["true"]}
PLAY RECAP **********************************************************************************************************
192.168.3.21 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0