【问题标题】:How to loop through inventory and assign value in Ansible如何在 Ansible 中遍历库存并分配价值
【发布时间】:2019-05-20 12:03:50
【问题描述】:

我在我的 Ansible 剧本中有一个任务,我想遍历我拥有的组中的每个主机,并且我想从我在 vars 文件夹中创建的主机名列表中为每个主机分配一个名称.

我已经通过编写 loop:"{{ 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

我似乎已经记录了各个部分或知道它,但是我如何结合对清单组中的主机的迭代并分配我已经在已经创建的列表(在角色 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 yaml ansible-inventory


    【解决方案1】:

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

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

    [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 列表中的主机名配对。

    更新

    根据您提供的其他信息,我认为您的 真正想要的是这样的:

        - name: change hostname
          win_hostname:
            name: "{{ hostnames[group.company.index(inventory_hostname) }}"
    

    这将从hostname 中为您的每个主机分配一个值 存货。我们正在查找当前的位置 inventory_hostname 在您的组中,然后使用它来索引 hostnames 列表。

    【讨论】:

    • 这正是我想要的。两个列表同时循环在一起。我不知道库存组被认为是列表,我认为这是我的问题之一。其次,with_x 的循环非常令人困惑,甚至看着它也让我感到困惑。谢谢你通过这个解释!
    • 在对循环进行更改并将名称字段的值更新为“{{ item.1 }} 我仍然遇到一些问题,循环似乎运行了 9 次。循环还分配了两个具有相同主机名的主机。为什么这个 zip 过滤器运行 9 次?
    • 你能用你正在运行的实际数据和任务更新你的问题吗?很难弄清楚否则会发生什么。我假设这个例子对你来说运行正确?
    • 我能够成功运行并获得您也显示的输出,这就是为什么我对我遇到的问题感到困惑的原因。原始问题已更新输出和设置。
    • 你还没有展示这出戏本身,但我想我知道发生了什么。 hosts: 行在调用此任务的剧本中是什么样的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多