4、Ansible变量
版权声明:原创作品,谢绝转载!否则将追究法律责任。
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。
当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。
问问自己,想要怎样的人生。
变量概述
变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如 nginx‐1.6.3 这个软件包的版本,在其它地方或许会反复使用,那么如果讲此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。
定义变量的方式
1.通过命令行进行变量定义
2.在play文件中进行变量定义
3.通过Inventory主机信息文件中进行变量定义
变量的优先级
如果在定义变量时,变量冲突了
>
在上述的三个地方分别设置了:
1.命令行中:age=11
2.play文件中:age=12
3.Inventory中:age=13
那么,最终的age结果一定是11
变量的读取优先级为:
命令行 > playbook文件 > Inventory文件
变量定义
【playbook中vars定义变量】
playbook变量可以通过多种方式进行定义,最简单的方式就是在playbook的开头通过vars进行定义。
#方法一:
‐ hosts: web_group
vars:
packages:
‐ httpd
‐ mariadb‐server
‐ php
‐ php‐mysql
‐ php‐pdo
tasks:
‐ name: Install httpd mariadb php Server
yum:
name: "{{ packages }}"
#方法二:
‐ hosts: web_group
vars:
‐ web_server: httpd
‐ db_server: mariadb‐server
‐ php_server: php,php‐mysql,php‐pdo
tasks:
‐ name: Install httpd mariadb php Server
yum:
name:
‐ "{{ web_server }}"
‐ "{{ db_server }}"
‐ "{{ php_server }}"
【使用vars_file定义变量】
刚才我们学到在playbook中使用 vars 定义变量,有一个缺陷,就是其他的playbook无法使用该变量。所以我们可以采取第二种定义变量的方式,在 vars_file 中定义变量。
#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: httpd
[root@m01 ~]# cat vars2.yml
db_server: mariadb‐server
#调用阶段
‐ hosts: web_group
vars_files: -./vars1.yml
tasks:
‐ name: Install httpd mariadb php Server
yum:
name: "{{ web_server }}"
#定义阶段
[root@m01 ~]# cat vars1.yml
web_server: httpd
[root@m01 ~]# cat vars2.yml
db_server: mariadb‐server
#调用阶段
‐ hosts: web_group
vars_file:
‐ ./vars1.yml
‐ ./vars2.yml
‐ name: Install httpd mariadb php Server
yum:
name:
‐ "{{ web_server }}"
‐ "{{ db_server }}"
#获取Ansible内置变量
‐ hosts: web_group
vars:
‐ remote_ip: "{{ansible_default_ipv4['address'] }}"
‐ remote_hostname: "{{ ansible_fqdn }}"
tasks:
‐ name: Touch IP File
file:
path: /root/{{ remote_ip }}
state: touch
‐ name: Touch Hostname File
file:
path: /root/{{ remote_hostname }}
state: touch
【在Inventory中定义变量】
注意:在Inventory中定义变量,主机的变量要高于主机组的变量,所以该方法不推荐使用,容易将环境弄乱。
#定义阶段
[root@m01 ~]# vim /etc/ansible/hosts
[web_group]
web01 ansible_ssh_host=10.0.0.7
web02 ansible_ssh_host=10.0.0.8
[web_group:vars]
web_server=httpd
index_file=index.html
#调用阶段
‐ hosts: web_group
tasks:
‐ name: Install httpd Server
yum:
name: "{{ web_server }}"
‐ name: Create Index File
file:
path: /tmp/{{ index_file }}
state: touch
之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:
host_vars
group_vars
切记,目录名字一定要一致,不能做任何修改。
1.主机组定义变量
#定义阶段
[root@m01 ~]# mkdir group_vars
#切记定义变量的文件必须以组名为文件名
[root@m01 ~]# vim /root/group_vars/web_group
web_server: httpd
#调用阶段
‐ hosts: web_group
tasks:
‐ name: Install httpd Server
yum:
name: "{{ web_server }}"
如果我想要所有组都能使用变量,该如何做?
2.主机定义变量
#定义阶段
[root@m01 ~]# mkdir host_vars
#切记定义变量的文件必须以主机名为文件名
[root@m01 ~]# vim /root/host_vars/web01
web_server: nginx
#调用阶段
‐ hosts: web_group
tasks:
‐ name: Install httpd Server
yum:
name: "{{ web_server }}"
【命令行定义变量 】
通过命令行覆盖变量,Inventory的变量会被playbook文件中覆盖,这两种方式的变量都会被命令行直接指定变量所覆
盖,使用 ‐‐extra‐vars 或者 ‐e 设置变量
[root@m01 ~]# vim test.yml
‐ hosts: web_group
tasks:
‐ name: Install httpd Server
yum:
name: "{{ web_server }}"
#定义阶段
[root@m01 ~]# ansible‐playbook test.yml ‐e "web_server=vsftpd"[root@m01 ~]# vim test.yml
‐ hosts: web_group
tasks:
‐ name: Install httpd Server
yum:
name:
‐ "{{ web_server }}"
‐ "{{ db_server }}"
#定义阶段
[root@m01 ~]# ansible‐playbook test.yml ‐e "web_server=vsftpd" ‐e "db_server=mariadb‐server"
【变量优先级测试】
[root@m01 ~]# vim touch_file.yml
‐ hosts: web_group
vars:
filename: vars
vars_files:
‐ ./vars1.yml
tasks:
‐ name: Touch vars File
file:
path: /root/{{ filename }}
state: directory
#定义vars_files
[root@m01 ~]# vim vars1.yml
filename: vars_files
#定义group_vars中的web_group
[root@m01 ~]# vim group_vars/web_group
filename: group_vars_web_group
#定义host_vars中的web01
[root@m01 ~]# vim host_vars/web01
[root@m01 ~]# vim host_vars/web01
filename: host_vars
#定义group_vars中的all
[root@m01 ~]# vim group_vars/all
filename: group_vars_all
#测试命令行
[root@m01 ~]# ansible‐playbook touch_file.yml ‐e "filename=vars_command"
#测试所有
[root@m01 ~]# ansible‐playbook touch_file.yml
变量注册
为什么要学变量注册?】
当 absible 的模块在运行之后,其实都会返回一些 result 结果,就像是执行脚本,我们有的时候需要脚本给我们一些 return 返回值,我们才知道,上一步是否可以执行成功,但是…默认情况下, ansible 的 result 并不会显示出来,所以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些 result ,这种将模块的返回值,写入到变量中的方法被称为变量注册
那么咋样将返回值注册到变量,如下一个 playbook 示例:
#编辑剧本
[root@m01 ~]# vim register.yml
‐ hosts: web_group
tasks:
‐ name: Test Register Vars
shell: "ls ‐l /"
#查看执行结果
[root@m01 ~]# ansible‐playbook register.yml
PLAY [web_group]
********************************************************************************************
********************************************************************************************
*************************************
TASK [Gathering Facts]
********************************************************************************************
********************************************************************************************
*******************************
ok: [web02]
ok: [web01]
TASK [Test Register Vars]
************