Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。下面这篇文章我们就来谈谈playbook的变量定义与调用。
一、Ansible变量的作用
在Ansible中支持设置主机变量、组变量,变量支持嵌套使用,定义好了的变量可以在playbook中引用。由于Ansible是在每个主机上单独运行命令,所以不同的主机去调用同样的变量,也可以取到不同的值得,这样进行一些配置就更灵活合理。
二、Ansible变量定义与调用
方法1:在/etc/ansible/hosts文件中定义变量
02 |
vim /etc/ansible/hosts |
04 |
192.168.1.36 webdir=/opt/test #定义单个主机的变量 |
06 |
[apache:vars] #定义整个组的统一变量 |
09 |
[nginx] 192.168.1.3[1:2] |
20 |
file: name={{ webdir }} state=directory #引用变量 |
23 |
[root@ansible PlayBook]# ansible-playbook variables.yml |
方法2:在playbook中定义和调用变量
05 |
- package: httpd #变量名与变量值 |
08 |
- name: install apache |
09 |
yum: name={{ package }} state=latest #要引用的变量用"{{ }}"囊括 |
10 |
- name: install configure file for httpd |
11 |
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf |
12 |
- name: start httpd service |
13 |
service: enabled=true name={{ service }} state=started |
方法3:使用ansible-playbook -e选项定义变量,命令行变量优先级高于配置文件中的变量
7 |
yum: name={{ package }} #配置文件需要引用package变量 |
9 |
ansible-playbook -e 'package=httpd' app.yml #通过-e定义变量,在app.yml文件全局生效 |
方法4:调用setup模块获取变量
setup模块主要用于获取主机信息并保存在变量中,如IPv4、IPv6、MAC地址、磁盘分区等。该模块获取到的变量是可以直接调用的,无需定义
1 |
ansible webserver -m setup |
红框处每个引号内的就是默认变量名,使用双花括号可以直接引用。对于一些包含多个层级的变量(比如磁盘分区会存在sda、sdb、sdc...),可以通过从上级书写的形式,比如{{ansible_devices.sda.partitions.sda.size}}
5 |
copy: content='{{ ansible_all_ipv4_addresses }}'dest=/tmp/vars.ans |
方法5:使用独立的YAML文件定义变量
为了方便管理将所有的变量统一放在一个独立的变量YAML文件中,laybook文件直接引用文件调用变量即可
12 |
- ./var.yml #指定变量文件的path(这里可以是绝对路径,也可以是相对路径) |
15 |
- name: install package |
16 |
yum: name={{ var1 }} #引用变量 |
18 |
file: name=/tmp/{{ var2 }}.log state=touch #引用变量 |
22 |
[root@ansible PlayBook]# ansible-playbook variables.yml
|