将主机 IP 地址存储在变量文件中而不是清单中

store hosts IP addresses in variable file instead of inventory

我试着在网上查了一下,但找不到明确的答案。是否可以将清单主机的 IP 地址存储在剧本或 var 文件中,例如 group_vars 或 host_vars 甚至 myvault.yml?类似于:

[webserver]    
webserver_ip_variable

然后该变量将在某些 var 文件中定义,例如 group_vars/all/myvars.yml 为:

webserver_ip_variable: 8.8.8.8

有可能吗?目标是将 IP 地址存储在 vault.yml 文件中,实现此目的的最佳方法是什么?

Q: "The goal is to store the IP addresses in a vault.yml file, what would be the best way to accomplish this?"

A:Ansible 不必知道远程主机的 IP 地址,只要 aliasansible_host 是可解析的。参见 Connecting to hosts: behavioral inventory parameters。例如,让我们创建一个清单文件

shell> cat hosts
[srv]
srv1 ansible_host=srv1.example.com
srv2 ansible_host=srv2.example.com
srv3 ansible_host=srv3.example.com

然后使用 IP 地址创建保管库文件。例如

shell> cat group_vars/srv/ip.yml
srv_ip:
  srv1: 192.168.1.11
  srv2: 192.168.1.12
  srv3: 192.168.1.13

Encrypt the file

shell> ansible-vault encrypt group_vars/srv/ip.yml
Encryption successful

现在可以在剧本中使用加密文件了。例如

shell> cat pb.yml 
- hosts: srv
  tasks:
    - debug:
        var: srv_ip[inventory_hostname]

给予

shell> ansible-playbook -i hosts pb.yml 

ok: [srv2] => {
    "srv_ip[inventory_hostname]": "192.168.1.12"
}
ok: [srv1] => {
    "srv_ip[inventory_hostname]": "192.168.1.11"
}
ok: [srv3] => {
    "srv_ip[inventory_hostname]": "192.168.1.13"
}

如您所说,您可以使用 IP 地址保管文件。因此您的清单可以有两个文件,一个包含主机,一个包含 IP:

inventory/hosts:

srv1
srv2
srv3

inventory/ips(保管此文件):

srv1 ansible_host=192.168.1.11
srv2 ansible_host=192.168.1.12
srv3 ansible_host=192.168.1.13

当然,您并不真的需要那个 hosts 文件,但您也可以使用它来对主机进行分组。