Playbook中同样也支持变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:
variable=value
variable: value
范例:
http_port=80
http_port: 80
变量调用方式:
通过{ { variable_name }} 调用变量,且变量名前后建议加空格,有时用"{ { variable_name }}"才生效
变量来源:
- ansible 的 setup facts 远程主机的所有变量都可直接调用
- 通过命令行指定变量,优先级最高
[root@centos8 ~]# ansible-playbook -e varname=value test.yml
- 在playbook文件中定义
vars:
var1: value1
var2: value2
- 在独立的变量YAML文件中定义
- hosts: all
vars_files:
- vars.yml
- 在主机清单文件中定义
主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
组(公共)变量:针对主机组中所有主机定义统一变量 - 在项目中针对主机和主机组定义
在项目目录中创建 host_vars和group_vars目录 - 在role中定义
变量的优先级从高到低如下
-e 选项定义变量 -->playbook中vars_files --> playbook中vars变量定义 -->host_vars/主机名文件 -->主机清单中主机变量--> group_vars/主机组名文件-->group_vars/all文件--> 主机清单组 变量
使用 setup 模块中变量
本模块自动在playbook调用,不要用ansible命令调用,生成的系统状态信息, 并存放在facts变量中
facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等
facts 变量的实际使用场景案例
通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件
通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件
通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件
....
案例:使用setup变量
[root@centos8 ~]# ansible 172.31.0.28 -m setup -a 'filter="ansible_default_ipv4"'
172.31.0.28 | SUCCESS => {
"ansible_facts": {
"ansible_default_ipv4": {
"address": "172.31.0.28",
"alias": "eth0",
"broadcast": "172.31.255.255",
"gateway": "172.31.0.254",
"interface": "eth0",
"macaddress": "00:0c:29:ac:f5:a4",
"mtu": 1500,
"netmask": "255.255.0.0",
"network": "172.31.0.0",
"type": "ether"
},
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[root@centos8 ~]# ansible 172.31.0.28 -m setup -a 'filter="ansible_nodename"'
172.31.0.28 | SUCCESS => {
"ansible_facts": {
"ansible_nodename": "centos8.longxuan.vip",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
范例:
---
# var1
- hosts: websrvs
remote_user: root
gather_facts: yes
tasks:
- name: create log file
file: name=/data/{
{ ansible_nodename }}.log state=touch owner=long mode=600
执行
[root@centos8 ~]# ansible-playbook var1.yml
范例: 显示 eth0 网卡的 IP 地址
- hosts: websrvs
tasks:
- name: show eth0 ip address {
{ ansible_facts["eth0"]["ipv4"]["address"]}}
debug:
msg: ip address {
{ ansible_eth0.ipv4.address }}
执行
[root@centos8 ~]# ansible-playbook -v show_ip.yml
Using /etc/ansible/ansible.cfg as config file
PLAY [websrvs] *********************************************************************************
TASK [Gathering Facts] *************************************************************************
ok: [172.3