Ansible-playbook中的变量
在ansible的playbook中还可以使用变量,变量的命名必须符合其规则,仅能由字母、数字和下划线组成,且只能以字母开头。
Playbook中变量可以通过以下几种方法进行定义:
- Ansible setup facts中已经定义好的变量
- 主机清单中定义变量
- 命令行下使用-e选项定义变量
- 在剧本中定义变量
- 变量定义在一个专用的变量文件中
ansible setup facts 远程主机的所有变量都可直接调用
使用ansible的setup模块可以查看远程主机上的所有变量,然后在yaml文件中直接进行调用。
1
| ansible HOSTLIST -m setup
|
此命令可以查看远程主机上所有已存在的各种变量,此处查看hostname的变量名
1 2 3 4 5 6 7 8 9 10 11 12 13
| [root@ansible data] 192.168.73.134 | SUCCESS => { "ansible_facts": { "ansible_hostname": "mylinuxops" }, "changed": false } 192.168.73.135 | SUCCESS => { "ansible_facts": { "ansible_hostname": "web2" }, "changed": false }
|
创建yaml文件,调用变量
1 2 3 4 5 6 7 8 9 10
| [root@ansible data]
---
- hosts: webserver remote_user: root
tasks: - name: file file: name={{ansible_hostname}}.log state=touch
|
执行yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [root@ansible data]
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************** ok: [192.168.73.135] ok: [192.168.73.134]
TASK [file] ***************************************************************************************************** changed: [192.168.73.134] changed: [192.168.73.135]
PLAY RECAP ****************************************************************************************************** 192.168.73.134 : ok=2 changed=1 unreachable=0 failed=0 192.168.73.135 : ok=2 changed=1 unreachable=0 failed=0
|
验证,查看远程主机root目录下是否创建出以主机名为文件名的log文件
1 2 3 4 5 6 7 8
| [root@ansible data] 192.168.73.134 | CHANGED | rc=0 >> anaconda-ks.cfg mylinuxops.log
192.168.73.135 | CHANGED | rc=0 >> anaconda-ks.cfg web2.log
|
变量定义在主机清单中
在ansible中变量可以预先定义在主机清单中,而主机清单中的变量又分为两种,普通变量和公共变量。
普通变量:主机组中主机单独定义,优先级高于公共变量
公共变量:针对主机组中所有主机定义的统一变量
示例:
修改主机清单,在主机清单中定义变量
1 2 3 4 5 6 7 8
| [root@ansible data] [webserver] 192.168.73.134 port=80 192.168.73.135 port=8080
[webserver:vars] mark="-"
|
创建playbook
1 2 3 4 5 6 7 8 9
| [root@ansible data] ---
- hosts: webserver remote_user: root
tasks: - name: file file: name={{ansible_hostname}}{{mask}}{{port}}.log state=touch
|
执行playbook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| [root@ansible data]
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************** ok: [192.168.73.135] ok: [192.168.73.134]
TASK [file] ***************************************************************************************************** changed: [192.168.73.135] changed: [192.168.73.134]
PLAY RECAP ****************************************************************************************************** 192.168.73.134 : ok=2 changed=1 unreachable=0 failed=0 192.168.73.135 : ok=2 changed=1 unreachable=0 failed=0
|
验证,查看root目录下文件是否被创建出来
1 2 3 4 5 6 7 8 9 10 11 12
| [root@ansible data] 192.168.73.135 | CHANGED | rc=0 >> anaconda-ks.cfg web2-8080.log web2.log
192.168.73.134 | CHANGED | rc=0 >> anaconda-ks.cfg mylinuxops-80.log mylinuxops.log
|
命令行下使用-e选项定义变量
在ansible-playbook中可以使用-e选项来定义变量,
示例:
此处依旧使用刚才的剧本,直接在命令行添加-e选项来定义变量,此处定义的变量为port,此处注意在主机清单列表中所定义的port变量没有删除,用来观察变量的优先级。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [root@ansible data] [WARNING]: Found variable using reserved name: port
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************** ok: [192.168.73.134] ok: [192.168.73.135]
TASK [file] ***************************************************************************************************** changed: [192.168.73.134] changed: [192.168.73.135]
PLAY RECAP ****************************************************************************************************** 192.168.73.134 : ok=2 changed=1 unreachable=0 failed=0 192.168.73.135 : ok=2 changed=1 unreachable=0 failed=0
|
验证创建出的文件名的port变量的值
1 2 3 4 5 6 7 8 9 10 11 12
| [root@ansible data] 192.168.73.135 | CHANGED | rc=0 >> anaconda-ks.cfg web2-1234.log web2-8080.log web2.log
192.168.73.134 | CHANGED | rc=0 >> anaconda-ks.cfg mylinuxops-1234.log mylinuxops-80.log mylinuxops.log
|
由此可以发现,通过命令行指定的变量优先级高于主机文件中定义的变量
剧本中定义变量
playbook的变量可以直接定义在yaml文件中,其定义格式如下。
1 2 3
| vars: -var1:value1 -var2:value2
|
示例:
在playbook中定义变量port,此处主机列表中所定义的port变量依旧没有被删除
1 2 3 4 5 6 7 8 9 10 11
| [root@ansible data] ---
- hosts: webserver remote_user: root var: - port: 4321
tasks: - name: file file: name={{ansible_hostname}}{{mark}}{{port}}.log state=touch
|
执行playbook,创建出文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [root@ansible data] [WARNING]: Found variable using reserved name: port
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************** ok: [192.168.73.135] ok: [192.168.73.134]
TASK [file] ***************************************************************************************************** changed: [192.168.73.135] changed: [192.168.73.134]
PLAY RECAP ****************************************************************************************************** 192.168.73.134 : ok=2 changed=1 unreachable=0 failed=0 192.168.73.135 : ok=2 changed=1 unreachable=0 failed=0
|
验证port定义的值的文件是否被创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [root@ansible data] 192.168.73.134 | CHANGED | rc=0 >> anaconda-ks.cfg mylinuxops-1234.log mylinuxops-4321.log mylinuxops-80.log mylinuxops.log
192.168.73.135 | CHANGED | rc=0 >> anaconda-ks.cfg web2-1234.log web2-4321.log web2-8080.log web2.log
|
由于新的文件被创建出来,由此可以得出剧本中的变量优先级高于主机清单中的变量
变量定义在一个专用的变量文件中
playbook的变量可以定义在一个单独的yaml文件中,然后在剧本中调用此文件从而实现变量的调用。
示例:
创建一个存放变量的文件,在文件中定义好变量
1 2
| [root@ansible data] port: 9527
|
在playbook中调用变量
1 2 3 4 5 6 7 8 9 10 11 12 13
| [root@ansible data] ---
- hosts: webserver remote_user: root vars_files: - vars.yml vars: - port: 4321
tasks: - name: file file: name={{ansible_hostname}}{{mark}}{{port}}.log state=touch
|
执行playbook
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [root@ansible data] [WARNING]: Found variable using reserved name: port
PLAY [webserver] ************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************** ok: [192.168.73.134] ok: [192.168.73.135]
TASK [file] ***************************************************************************************************** changed: [192.168.73.135] changed: [192.168.73.134]
PLAY RECAP ****************************************************************************************************** 192.168.73.134 : ok=2 changed=1 unreachable=0 failed=0 192.168.73.135 : ok=2 changed=1 unreachable=0 failed=0
|
验证新的文件文件是否被创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [root@ansible data] 192.168.73.135 | CHANGED | rc=0 >> anaconda-ks.cfg web2-1234.log web2-4321.log web2-8080.log web2-9527.log web2.log
192.168.73.134 | CHANGED | rc=0 >> anaconda-ks.cfg mylinuxops-1234.log mylinuxops-4321.log mylinuxops-80.log mylinuxops-9527.log mylinuxops.log
|
由此可见使用变量文件定义的变量优先级高于playbook中定义的变量
以上就是playbook中定义变量的各种方法,变量在使用中的优先级关系为:
命令行-e指定 > 变量文件 > playbook指定 > hosts文件