如何在Ansible Playbooks中访问系统信息(事实)?

151 阅读2分钟

默认情况下,在执行游戏手册中定义的一组任务之前,Ansible会花一些时间来收集关于正在配置的系统的信息。这些信息被称为_事实_,包含网络接口和地址、远程节点上运行的操作系统和可用内存等细节。

Ansible以JSON格式存储事实,项目按节点分组。要检查你正在配置的系统有什么样的信息,你可以用一个临时命令运行setup 模块。

ansible all -i inventory -m setup -u sammy

这个命令将输出一个包含你的服务器信息的大量JSON。为了获得这些数据的一个子集,你可以使用filter 参数并提供一个模式。例如,如果你想获得远程节点中所有IPv4地址的信息,你可以使用以下命令。

ansible all -i inventory -m setup -a "filter=*ipv4*" -u sammy 

你会看到这样的输出。

Output203.0.113.10 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "203.0.113.10", 
            "198.51.100.23"
        ], 
        "ansible_default_ipv4": {
            "address": "203.0.113.10", 
            "alias": "eth0", 
            "broadcast": "203.0.113.255", 
            "gateway": "203.0.113.1", 
            "interface": "eth0", 
            "macaddress": "06:c7:91:16:2e:b7", 
            "mtu": 1500, 
            "netmask": "203.0.113.0", 
            "network": "203.0.113.0", 
            "type": "ether"
        }
    }, 
    "changed": false
}

一旦你找到了对你的游戏有用的事实,你可以相应地更新你的游戏手册。作为一个例子,下面的playbook将打印出默认网络接口的IPv4地址。从前面的命令输出中,我们可以看到,这个值可以通过Ansible提供的JSON中的ansible_default_ipv4.address

在你的ansible-practice 目录中创建一个名为playbook-03.yml 的新文件。

nano ~/ansible-practice/playbook-03.yml

然后在新的playbook文件中添加以下几行。

~/ansible-practice/playbook-03.yml

---
- hosts: all
  tasks:
    - name: print facts
      debug:
        msg: "IPv4 address: {{ ansible_default_ipv4.address }}"

完成后保存并关闭该文件。

要在你的清单文件中的服务器上尝试这个playbook,用你之前运行第一个例子时使用的相同连接参数运行ansible-playbook 。同样,我们将使用一个名为inventory 的库存文件和sammy用户来连接到远程服务器。

ansible-playbook -i inventory playbook-03.yml -u sammy

当你运行该游戏手册时,你会在输出中看到你的远程服务器的IPv4地址,正如预期的那样。

Output...

TASK [print facts] ***************************************************************************************************************************************************************************
ok: [server1] => {
    "msg": "IPv4 address: 203.0.113.10"
}

...

事实封装了重要的数据,你可以利用这些数据来更好地定制你的游戏手册。要了解更多关于你可以通过事实获得的所有信息,请参考Ansible官方文档