每当我有关于 Ansible 循环的问题时,我也会去访问循环文档 https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html。听起来您想要并行迭代两个列表,将清单中主机列表中的项目与主机名列表中的项目配对。在 Ansible 的早期版本中,建议使用with_together
循环,而最新版本的 Ansible 则建议zip
过滤器(文档中有一个示例here https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#with-together).
为了针对您的用例演示这一点,我从一个包含三个主机的清单文件开始:
[mygroup]
hostA ansible_host=localhost
hostB ansible_host=localhost
hostC ansible_host=localhost
以及以下剧本:
---
- hosts: all
- hosts: localhost
gather_facts: false
vars:
hostnames:
- hostname01
- hostname02
- hostname03
tasks:
- name: change hostname
debug:
msg:
win_hostname:
name: "{{ item }}"
loop: "{{ groups.mygroup|zip(hostnames)|list }}"
这里我使用的是debug
任务而不是实际运行win_hostname
任务。运行输出:
ansible-playbook -i hosts playbook.yml
好像:
TASK [change hostname] ********************************************************************************************************************************
ok: [localhost] => (item=[u'hostA', u'hostname01']) => {
"msg": {
"win_hostname": {
"name": [
"hostA",
"hostname01"
]
}
}
}
ok: [localhost] => (item=[u'hostB', u'hostname02']) => {
"msg": {
"win_hostname": {
"name": [
"hostB",
"hostname02"
]
}
}
}
ok: [localhost] => (item=[u'hostC', u'hostname03']) => {
"msg": {
"win_hostname": {
"name": [
"hostC",
"hostname03"
]
}
}
}
正如您所看到的,它将清单中的每个主机与来自hostnames
list.
Update
根据您提供的其他信息,我认为您
其实想要的是这样的:
- name: change hostname
win_hostname:
name: "{{ hostnames[group.company.index(inventory_hostname) }}"
这将从中分配一个值hostname
到您的每个主机
存货。我们正在查找当前的位置inventory_hostname
在您的组中,然后使用它来索引
这hostnames
list.