如何循环库存并在Ansible中分配价值

如何循环库存并在Ansible中分配价值,ansible,yaml,ansible-inventory,Ansible,Yaml,Ansible Inventory,我的Ansible playbook中有一个任务,我希望迭代我拥有的组中的每个主机,并从我在vars文件夹中创建的主机名列表中为每个主机分配一个名称 我已经熟悉通过编写循环来循环清单:{{groups['mygroup']}}},我有一个主机名列表,我想在主机文件中为'mygroup'中的每个IP分配一个 # In tasks file - roles/company/tasks/main.yml - name: change hostname win_hostname: name:

我的Ansible playbook中有一个任务,我希望迭代我拥有的组中的每个主机,并从我在vars文件夹中创建的主机名列表中为每个主机分配一个名称

我已经熟悉通过编写循环来循环清单:{{groups['mygroup']}}},我有一个主机名列表,我想在主机文件中为'mygroup'中的每个IP分配一个

# In tasks file - roles/company/tasks/main.yml
- name: change hostname
  win_hostname:
    name: "{{ item }}"
  loop: "{{ hostname }}"
  register: res

# In the Inventory file
[company]
10.0.10.128
10.0.10.166
10.0.10.200

# In vars - roles/company/vars/main.yml
hostname:
  - GL-WKS-18
  - GL-WKS-19
  - GL-WKS-20

# site.yml file located under /etc/ansible
- hosts: company
  roles:
    - common
    - company #This is where the loop exists mentioned above.

# Command to run playbook
ansible-playbook -i hosts company.yml
我似乎已经记下或了解了各个部分,但如何将对库存组中的主机的迭代与已创建列表(在roles vars文件夹中)中的名称相结合

更新 上述任务已更新,以反映答复中提到的变化:

- name: change hostname
  win_hostname:
    name: "{{ item.1 }}"
  loop: {{ groups.company|zip(hostname)|list }}"
  register: res
然而,我得到的输出是不正确的,这不应该运行9次,而应该只运行3次,在库存中的[company]组中每个IP运行一次。此外,列表中只有三个主机名需要分配给资源清册表中的每个主机

changed: [10.0.10.128] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.166] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.200] => (item=[u'10.0.10.128', u'GL-WKS-18'])
changed: [10.0.10.128] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.166] => (item=[u'10.0.10.166', u'GL-WKS-19'])
changed: [10.0.10.200] => (item=[u'10.0.10.166', u'GL-WKS-19'])
ok: [10.0.10.128] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.166] => (item=[u'10.0.10.200', u'GL-WKS-20'])
ok: [10.0.10.200] => (item=[u'10.0.10.200', u'GL-WKS-20'])

每当我对Ansible中的循环有疑问时,我也会去访问。听起来您想并行迭代两个列表,将清单中主机列表中的项目与主机名列表中的项目配对。在Ansible的早期版本中,建议同时使用
with_
循环,而在Ansible的较新版本中,建议使用
zip
过滤器(文档中有一个示例)

为了在您的用例中演示这一点,我从一个包含三个主机的清单文件开始:

[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\u 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"
            ]
        }
    }
}
如您所见,它将清单中的每个主机与
主机名
列表中的主机名配对

更新

根据你提供的额外信息,我认为你 实际需要的是:

    - name: change hostname
      win_hostname:
        name: "{{ hostnames[group.company.index(inventory_hostname) }}"
这将从
hostname
中为计算机中的每个主机分配一个值 库存我们正在查找电流的位置
inventory\u主机名
,然后使用该主机名索引到
主机名列表。

这正是我要找的。两个列表将同时循环在一起。我不知道库存组被认为是列表,我认为这是我的问题之一。第二,与_x的循环非常混乱,甚至看着它都让我感到困惑。谢谢你的解释!在对循环进行更改并将名称字段的值更新为“{item.1}”之后我仍然遇到一些问题,循环似乎运行了9次。循环还为两台主机分配了相同的主机名。为什么这个zip筛选器运行了9次?您能否用您正在运行的实际数据和任务更新您的问题?很难弄清楚其他情况下会发生什么。我假设此示例正确运行r你?我能够成功地运行并获得你也展示的输出,这就是为什么我对我的问题感到困惑的原因。原始问题已经用输出和设置进行了更新。你还没有展示剧本本身,但我想我看到了发生的事。
hosts:
行在调用它的剧本上是什么样子的任务