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


该系列的一部分:
如何编写 Ansible Playbooks

Ansible 是一种现代配置管理工具,不需要在远程节点上使用代理软件,仅使用 SSH 和 Python 在托管服务器上进行通信和执行命令。本系列将带您了解可用于编写服务器自动化剧本的主要 Ansible 功能。最后,我们将看到一个实际示例,说明如何创建剧本以自动设置远程 Nginx Web 服务器并向其部署静态 HTML 网站。

默认情况下,在执行 playbook 中定义的一组任务之前,Ansible 将花一些时间来收集有关正在配置的系统的信息。此信息称为事实,包含诸如网络接口和地址、远程节点上运行的操作系统以及可用内存等详细信息。

Ansible 以 JSON 格式存储事实,项目按节点分组。要检查您正在配置的系统有哪些类型的信息,您可以setup使用 ad hoc 命令运行该模块:

  • ansible all -i inventory -m setup -u sammy

此命令将输出包含有关您的服务器的信息的大量 JSON。要获取该数据的子集,您可以使用该filter参数并提供一个模式。例如,如果您想获取有关远程节点中所有 IPv4 地址的信息,您可以使用以下命令:

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

你会看到这样的输出:

Output
203.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_default_ipv4.address在 Ansible 提供的 JSON 中是可用的

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

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

然后将以下行添加到新的剧本文件中:

~/ansible-practice/playbook-03.yml
---
- hosts: all
  tasks:
    - name: print facts
      debug:
        msg: "IPv4 address: {{ ansible_default_ipv4.address }}"

完成后保存并关闭文件。

要在您的清单文件中的服务器上尝试此剧本,ansible-playbook请使用您之前在运行我们的第一个示例时使用的相同连接参数运行。同样,我们将使用名为清单文件inventory萨米用户连接到远程服务器:

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

当您运行 playbook 时,您将按预期在输出中看到远程服务器的 IPv4 地址:

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

事实封装了重要数据,您可以利用这些数据更好地自定义剧本。要详细了解您可以通过事实获得的所有信息,请参阅Ansible官方文档

觉得文章有用?

点个广告表达一下你的爱意吧 !😁