我正在使用 Ansible 来管理一组不同的云 Linux 服务器。我编写了一个脚本,通过 rync 通过 ssh 将备份拉到备份服务器。所有主机变量都在host_vars/example.com.yml
文件中进行管理,每个文件包含以下内容:
ansible_host: example.com
ansible_user: user
ansible_port: 22
ansible_ssh_private_key_file: "~/.ssh/id_ed25519"
它们在文件中分组hosts
如下:
[webservers]
example.com
foo.com
bar.com
[backup]
backupserver.domain.com
我有一个备份组的备份角色,其中包含由 rsync 脚本组成的 backupserver.domain.com 服务器,但我必须手动将 ansible host_vars 复制到该备份角色中,以生成包含文件中已有所有信息的 SSH 配置host_vars/*.yml
。
所以我的问题是,在角色中,是否可以迭代当前主机和组之外的另一个主机的主机变量?类似于:
{% for item in var_hosts_group %}
Host {{ item.ansible_host }}
Hostname {{ item.ansible_host }}
User {{ item.ansible_user }}
Port {{ item.ansible_port }}
IdentityFile {{ item.ansible_ssh_private_key_file }}
{% endfor %}
那么 rsync 脚本将是:
{% for item in var_hosts_group %}
rsync -a {{ item.ansible_host }}:/remotebackup /localbackup
{% endfor %}
这将使我能够在备份服务器上为 Web 服务器生成必要的模板/脚本,并保持一切顺利。这可能吗?谢谢!
答案1
问:“是否可以遍历当前主机和组之外的另一个主机的主机变量?“
(我已经改变了group/groups
。一个主持人可以是多个组的成员。)
答:是的,有可能。主机变量是剧中所有主持人及其变量的字典,例如
{% for item in ansible_play_hosts_all %}
Host {{ hostvars[item]['ansible_host'] }}
Hostname {{ hostvars[item]['ansible_host'] }}
User {{ hostvars[item]['ansible_user'] }}
Port {{ hostvars[item]['ansible_port'] }}
IdentityFile {{ hostvars[item]['ansible_ssh_private_key_file'] }}
{% endfor %}
- 这样的主持人必须是ansible_play_hosts_all. 引用
“该剧针对的所有主持人名单”
当然,如果主机不是该游戏的目标,Ansible 对此就一无所知。
你很可能想要
delegate_to
和run_once
这样的任务。