目录
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
分类: Ansible