Ansible fact变量与魔法变量

简介: 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 }}
  1. 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

目录
相关文章
|
3月前
|
存储 网络安全 数据安全/隐私保护
Ansible的变量
Ansible的变量
38 6
|
缓存 运维 监控
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
【运维知识进阶篇】Ansible变量详解(变量定义+变量优先级+变量注册+层级定义变量+facts缓存变量)
320 0
|
存储 JSON 数据安全/隐私保护
ansible定义变量和管理事实
ansible定义变量和管理事实
147 0
|
存储 缓存 监控
【2023】ansible-variables变量详解
【2023】ansible-variables变量详解
126 0
Ansible 自定义变量与 role 默认变量的合并方法
如果你遇到 failed to combine variables, expected dicts but got a 'NoneType' and a 'dict' 这样的报错,你可以看看本文。
304 0
|
存储 JSON 缓存
ansible学习之旅(facts变量)
ansible学习之旅(facts变量)
170 0
ansible学习之旅(初识变量)
ansible学习之旅(初识变量)
80 0
|
关系型数据库 MySQL 应用服务中间件
|
Shell 网络安全 数据安全/隐私保护
ansible主机清单配置以及变量解释(二)
1.配置ansible主机清单 清单文件位于/etc/ansible/hosts
552 0
ansible主机清单配置以及变量解释(二)
Ansible-playbook 应用变量(学习笔记二十)
文件 [root@ansible-server ansible]# tree ./ ./ ├── hosts └── var.yaml hosts 文件 [web] 192.
1117 0