内容简介:所属分类:Ansible
- A+
所属分类:Ansible 运维技术
在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。
ansible系列博文直达链接:ansible轻松入门系列
"ansible系列"中的每篇文章都建立在前文的基础之上,所以, 请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。
之前的文章中总结了各种变量的用法,这篇文章我们继续。
我们知道,ansible默认的主机清单文件为"/etc/ansible/hosts",我们可以在默认的清单文件中为各个主机定义主机变量、为各个组定义组变量,比如如下示例:
[test] test71 ansible_host=10.1.1.71 test71var=t71v test70 ansible_host=10.1.1.70 [test:vars] testvar=testGroupVar
如上例所示,我们在清单中配置了两个主机,test71和test70,我们为test71配置了一个主机变量,这个变量就是"test71var",同时,我们还为test组定义了一个组变量"testvar"。
其实,除了像上例中那样直接在hosts文件中定义主机变量和组变量,还有另外一种方法也可以定义主机变量和组变量,我们可以在清单文件的同级目录中创建两个目录,这两个目录的名字分别为"group_vars"和"host_vars",我们可以将组变量文件放在"group_vars"目录中,将主机变量文件放在"host_vars"目录中,这样ansible就能获取到对应组变量和主机变量了。
我们先来看看怎样使用"group_vars"目录引入组变量,示例如下:
首先,我在hosts文件的同级目录中创建了一个group_vars目录,并且在group_vars目录中创建了一个名为test的文件,test文件的内容如下
# cat /etc/ansible/group_vars/test testvar1: testGroupVar1
如你所见,我在test文件中创建了一个名为"testvar1"的变量。
"group_vars"目录中的文件之所以命名为"test",是因为在上例的hosts文件中,有一个名为"test"的组,这个"变量文件的文件名"与"hosts文件中的组名"其实是对应的,定义在group_vars/test文件中的变量就相当于定义在test组中的"组变量",同理,如果hosts文件中的其他组需要定义"组变量",也可以在"group_vars"目录中创建一个与其组名同名的变量文件,我已经写好了一个测试用的playbook,测试一下刚才设置的组变量是否生效,测试playbook如下:
# cat t.yml
- hosts: test71
tasks:
- debug:
msg: "{{test71var}}"
- debug:
msg: "{{testvar}}"
- debug:
msg: "{{testvar1}}"
执行上述测试playbook,输出如下:
# ansible-playbook t.yml
PLAY [test71] ******************************************
TASK [Gathering Facts] ***********************************
ok: [test71]
TASK [debug] ******************************************
ok: [test71] => {
"msg": "t71v"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testGroupVar"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testGroupVar1"
}
PLAY RECAP ******************************************
test71 : ok=4 changed=0 unreachable=0 failed=0
从上述输出信息可以看出,定义在"group_vars/test"文件中的组变量已经被调用到了。
其实,我们也可以为test文件加上后缀名,文件的后缀名可以为".yml"或".yaml"或者".json"中的任意一种,也就是说,我们将"group_vars/test"重命名为"group_vars/test.yml",其中的变量也是能够完全正常的被调用的。
我们来思考一个问题,当group_vars/test文件中的定义的组变量与hosts文件中的组变量重复时,会以哪个为准呢?
我们来测试一下,由于当前hosts文件中已经有一个名为testvar的组变量,我们只需要在group_vars/test文件中再定义一个同名的变量,即可进行测试,group_vars/test文件中的内容如下:
# cat test.yml testvar: testvar in group_vars/test.yml testvar1: testGroupVar1
变量设置完毕后,再次执行刚才的测试playbook,输出如下:
# ansible-playbook t.yml
PLAY [test71] ******************************************
TASK [Gathering Facts] ************************************
ok: [test71]
TASK [debug] ******************************************
ok: [test71] => {
"msg": "t71v"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testvar in group_vars/test.yml"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testGroupVar1"
}
PLAY RECAP ******************************************
test71 : ok=4 changed=0 unreachable=0 failed=0
从输出结果可以看出,当"group_vars/test"文件中的组变量和hosts文件中的组变量冲突时,"group_vars/test"文件中的组变量的优先级更高。
在group_vars目录中,不仅能够使用"test文件"表示test组,也可以使用"test目录"表示test组,在"test目录"中又可以定义多个变量文件,这些文件中的变量都会被当做test组的组变量,示例如下:
我已经删除了刚才用于测试的"group_vars/test"文件,同时,我创建了一个"group_vars/test"目录,目录中有两个变量文件,"a.yml"和"b.yml"
# ls /etc/ansible/group_vars/test a.yml b.yml # cat /etc/ansible/group_vars/test/a.yml testvar: testvar in group_vars/test/a.yml # cat /etc/ansible/group_vars/test/b.yml testvar1: testvar1 in group_vars/test/b.yml
如上例所示,test目录中有两个变量文件,"a.yml"和"b.yml",这两个文件中分别定义了两个变量,test目录的目录名与hosts文件中的test组其实是对应的,同理,如果hosts文件中的其他组需要定义组变量,也可以在"group_vars"目录中创建一个与其组名同名的目录,然后在这个目录中创建一些变量文件,在这些变量文件中定义变量相当于在hosts文件中的组中定义的组变量。
我们已经通过目录的方式定义了test组的组变量,那么我们再次调用刚才的测试playbook试试,输出如下:
# ansible-playbook t.yml
PLAY [test71] ******************************************
TASK [Gathering Facts] ***********************************
ok: [test71]
TASK [debug] ******************************************
ok: [test71] => {
"msg": "t71v"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testvar in group_vars/test/a.yml"
}
TASK [debug] ******************************************
ok: [test71] => {
"msg": "testvar1 in group_vars/test/b.yml"
}
PLAY RECAP ******************************************
test71 : ok=4 changed=0 unreachable=0 failed=0
综上所述,在group_vars目录中,有两种方式可以定义组变量。
方式一:直接使用变量文件,变量文件的文件名需要与组名相同(可以添加".yml"、".yaml"、".json"作为后缀)。
方式二:使用目录,目录名需要与组名相同,然后再在目录中定义变量文件。
之前的示例中,"group_vars目录"一直定义在hosts文件的同级目录中,其实,"group_vars目录"也可以放在你所执行的playbook的同级目录中,比如,上例中,测试时使用的playbook为"t.yml",我也可以在"t.yml"的同级目录中创建"group_vars目录",然后再选择使用方式一或者方式二去定义组变量,而且,playbook的同级目录中的"group_vars目录"的优先级更高,也就是说,当hosts文件的同级目录和playbook的同级目录中同时存在"group_vars目录"时,并且存在同名的组变量时,会优先使用playbook同级目录中的"group_vars目录"中定义的组变量,通常情况下,我更习惯在playbook的同级目录中使用group_vars目录。
了解了"group_vars"目录的作用和用法以后,再来理解"host_vars"目录简直不要太简单,因为它们的使用方法完全相同,只不过,"host_vars"目录中定义的变量不是组变量,而是主机变量,在"host_vars"目录中定义主机变量也有两种方式
方式一:直接使用变量文件,变量文件的文件名需要与主机名相同(可以添加".yml"、".yaml"、".json"作为后缀)。
方式二:使用目录,目录名需要与主机名相同,然后再在目录中定义变量文件。
"host_vars"目录能够定义在主机清单的同级目录下,也能定义在playbook的同级目录下,定义在playbook同级目录中的优先级更高。
聪明如你肯定会举一反三的,我就不再对"host_vars"目录的用法进行示例了,这篇文章先总结到这里,希望能够对你有所帮助~
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
以上所述就是小编给大家介绍的《ansible笔记(44):变量(七)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- ansible笔记(18):变量(五)
- ansible笔记(17):变量(四)
- ansible笔记(31):变量(六)
- golang学习笔记3:常量与变量
- ECMAScript 6 学习笔记:变量定义方法
- Go语言笔记 | 04-短变量声明
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Mobilizing Web Sites
Layon, Kristofer / 2011-12 / 266.00元
Everyone has been talking about the mobile web in recent years, and more of us are browsing the web on smartphones and similar devices than ever before. But most of what we are viewing has not yet bee......一起来看看 《Mobilizing Web Sites》 这本书的介绍吧!