Ansible fact变量与魔法变量
fact变量
在常用模块里就提到过setup模块,这个模块会收集被控端的信息,而这个模块收集信息的方式就是依赖于fact,返回的是json格式的数据
[ansible@master ansible]$ ansible all -m setup >setup
[ansible@master ansible]$ vim setup
192.168.200.210 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"192.168.200.210",
"172.17.0.1",
"10.245.149.0"
],
这里面会有非常多的信息,同时这都都是变量,采用键值对的方式
1.1 fact变量的引用
fact变量的引用有个前提就是playbook里面的gather_facts一定要是开启状态
我们让节点输出一个IP地址
通过上面截取的ip地址信息可以得知ansible_all_ipv4_addresses这个变量的值是一个列表,那我们要取出这个列表里的值的话直接给出索引就好了
[ansible@master ansible]$ vim fact-ip.yaml
[ansible@master ansible]$ cat fact-ip.yaml
---
- name: print ip
hosts: all
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_all_ipv4_addresses.0 }}"
# 这里的写法还可以是 ansible_all_ipv4_addresses[0]
执行剧本
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
ok: [192.168.200.210] => {
"msg": "192.168.200.210"
}
这个时候他就返回了一个ip地址
刚刚取出的是一个列表里的某个值,如果我们需要取出一个字典里的值呢?其实这个更加的简单
"ansible_default_ipv4": {
"address": "192.168.200.210",
"alias": "ens33",
"broadcast": "192.168.200.255",
"gateway": "192.168.200.2",
"interface": "ens33",
"macaddress": "00:0c:29:2c:0d:98",
"mtu": 1500,
"netmask": "255.255.255.0",
"network": "192.168.200.0",
"type": "ether"
},
比如这一段内容,这些内容都是来自setup
我们需要取出address的话直接这样写
[ansible@master ansible]$ vim fact-ip.yaml
---
- name: print ip
hosts: all
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_default_ipv4.address }}"
直接用 **. ** 一直写到你想取出的值的key
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
ok: [192.168.200.210] => {
"msg": "192.168.200.210"
}
这个也是没有问题的
我们将fact功能给关掉,看他还能不能正常输出
[ansible@master ansible]$ vim fact-ip.yaml
---
- name: print ip
hosts: all
gather_facts: false
tasks:
- name: Print the first IPv4 address
debug:
msg: "{{ ansible_default_ipv4.address }}"
去执行他
[ansible@master ansible]$ ansible-playbook fact-ip.yaml
TASK [Print the first IPv4 address] ********************************************
fatal: [192.168.200.210]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'ansible_default_ipv4' is undefined\n\nThe error appears to be in '/home/ansible/ansible/fact-ip.yaml': line 6, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: Print the first IPv4 address\n ^ here\n"}
看到了吧,他直接就报错了,报错的原因是有一个没有被定义的变量
ansible的魔法变量
- hostvars:获取指定主机的相关变量格式为 {{ hostvars['主机名'].ansible_default_ipv4.address }},这样可以获取指定主机的IP地址
- inventory_hostname:识别当前正在运行task的主机名,可以与hostvars一起使用
- {{ hostvars[inventory_hostname].ansible_default_ipv4.address }}
- groups:列出所有/指定主机组的列表
- {{ groups }} 列出所有的主机
- {{ groups.test}} 列出test主机组下的所有主机
- {{ group_names }} 列出当前正在执行task的主机所在的主机组
1. 魔法变量的使用
现在我们将控制节点也加入到主机清单内
[ansible@master ansible]$ cat inventory
[test]
192.168.200.210 os=euler
192.168.200.200 ansible_user=root
[test:vars]
ansible_user=ansible
ansible_ssh_pass=123
ansible_become=yes
websoft=nginx
1.1 魔法变量的实际使用
让每台主机输出自己的default IP地址
[ansible@master ansible]$ vim magic-vars.yaml
- name: print ip
hosts: test
tasks:
- name: print
debug:
msg: "{{ hostvars[inventory_hostname].ansible_default_ipv4.address }}"
这里的意思是使用hostvars采集某台主机的变量,哪台主机呢?我们使用inventory_hostname 代表当前正在执行这个剧本的主机,然后后面的都是普通的变量了
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18259349