Ansible-playbook中的变量

在ansible的playbook中还可以使用变量,变量的命名必须符合其规则,仅能由字母、数字和下划线组成,且只能以字母开头。

Playbook中变量可以通过以下几种方法进行定义:

  1. Ansible setup facts中已经定义好的变量
  2. 主机清单中定义变量
  3. 命令行下使用-e选项定义变量
  4. 在剧本中定义变量
  5. 变量定义在一个专用的变量文件中

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]# ansible webserver -m setup -a 'filter=*hostname'
192.168.73.134 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "mylinuxops" #此处查到hostname的变量名为ansible_hostname,在ansible的playbook中调用变量时就调用此变量名
},
"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]# vim var.yaml

---
#test var
- hosts: webserver
remote_user: root

tasks:
- name: file
file: name={{ansible_hostname}}.log state=touch #此处以ansible_hostname这个变量名创建出一个文件

执行yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@ansible data]# ansible-playbook var.yaml

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]# ansible webserver -a 'ls  /root'
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]# vim /etc/ansible/hosts
[webserver]
192.168.73.134 port=80 #定义主机134的变量port值为80
192.168.73.135 port=8080 #定义主机135的变量port值为8080

[webserver:vars] #通用变量
mark="-" #定义通用变量mark的值为-

创建playbook

1
2
3
4
5
6
7
8
9
[root@ansible data]# vim var.yaml
---
#test var
- hosts: webserver
remote_user: root

tasks:
- name: file
file: name={{ansible_hostname}}{{mask}}{{port}}.log state=touch #利用变量创建出一个以"HOSTNAME-PORT.log"这中格式的文件。

执行playbook

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@ansible data]# ansible-playbook var.yaml

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]# ansible webserver -a 'ls /root'
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

#根据事先定义好的变量,134的主机名为mylinuxops,port值为80,创建出的文件为mylinuxops-80.log。134的主机名为web2,port值为8080,创建出的文件为mylinuxops-8080.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]# ansible-playbook -e port=1234 var.yaml     #在执行playbook时定义port值为1234
[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]# ansible webserver -a 'ls /root'
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]# vim var.yaml
---
#test var
- hosts: webserver
remote_user: root
var:
- port: 4321 #定义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]# ansible-playbook  var.yaml
[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]# ansible webserver -a 'ls /root'
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]# vim vars.yml
port: 9527 #定义port的值为9527

在playbook中调用变量

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ansible data]# vim var.yaml
---
#test var
- hosts: webserver
remote_user: root
vars_files: #使用vars_files来调用vars.yml这个变量文件
- vars.yml
vars: #此处注意上一步中所定义的port变量以及主机列表中所定义的port并没有被清除,用来验证变量的优先级
- 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]# ansible-playbook  var.yaml
[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]# ansible webserver -a 'ls /root'
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文件