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的魔法变量

  1. hostvars:获取指定主机的相关变量格式为 {{ hostvars['主机名'].ansible_default_ipv4.address }},这样可以获取指定主机的IP地址
  2. inventory_hostname:识别当前正在运行task的主机名,可以与hostvars一起使用
    • {{ hostvars[inventory_hostname].ansible_default_ipv4.address }}
  3. 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 代表当前正在执行这个剧本的主机,然后后面的都是普通的变量了

posted @ 2024-06-20 19:14  FuShudi  阅读(51)  评论(0编辑  收藏  举报