当前位置: 首页 > 知识库问答 >
问题:

如何在Ansible中遍历库存并赋值

董新觉
2023-03-14
# 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
- name: change hostname
  win_hostname:
    name: "{{ item.1 }}"
  loop: {{ groups.company|zip(hostname)|list }}"
  register: res

然而,我得到的输出是不正确的,这不应该运行9次,而是只运行3次,在库存中的[公司]组中的每个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'])

共有1个答案

陈允晨
2023-03-14

每当我对Ansible中的循环有问题时,我也会访问循环文档。听起来像是要并行迭代两个列表,将清单中主机列表中的一个项目与主机名列表中的一个项目配对。在以前版本的Ansible中,建议使用with_together循环,而在最近版本的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 }}"
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) }}"
 类似资料:
  • 我有一个类组件,它的状态包含一个 filterItems[] 空白数组。我需要填充过滤器项目数组中的值 所以,我有一个来自API的数据,看起来像这样: 所以,像这样,我有一些员工。现在我必须循环这个api数据,提取信息并将其存储到另一个名为“过滤器”的数组中,然后将其传递给函数。 我的过滤器数组应该看起来像这样: 本质上,我需要做以下反应 这里的问题是,每个公司都有一组键,所以如果员工属于同一家公

  • 问题内容: 我有一个Map如下所示的bean: 这ftqSet适合以下数据结构: 在我的测试JSP文件中,我一直在尝试使用来访问数据 : 但是它没有输出${f.feedId}。为什么会这样呢?我将如何访问该结构的各个元素,以便创建一个漂亮的表? 问题答案: 的每次迭代中给出了一个实例,它反过来又和getValue()方法。这与在普通Java中进行操作类似。 例如 在的情况下, 的回报, ,所以你需

  • 问题内容: 我在Linux上用bash编写脚本,需要遍历给定目录中的所有子目录名称。如何遍历这些目录(并跳过常规文件)? 例如: 给定目录是 它具有以下子目录: 我想检索A,B,C。 问题答案: 简短说明: 查找文件(很明显) 是当前目录,它位于is之后(恕我直言,它比直接包含在命令中更为灵活。如果要在此文件夹中执行更多操作,则只有一个位置可以更改,)。 并确保仅在当前目录中查找,并且不将自身包含

  • 问题内容: 我有以下代码,它使用来遍历中的元素。 我如何使用like中的新功能或执行相同任务。提前致谢 问题答案: 这等效于Java 8流API中的代码。不是100%等效,但是您可以了解主要思想。

  • 问题内容: 我有一个带有一些十六进制数字的文本文件,我正在尝试将其转换为十进制。我可以成功转换它,但似乎在循环存在之前它会读取一些不需要的字符,因此我遇到了以下错误。 我的代码如下 每个十六进制数字都在新行中输入 问题答案: 追溯表明文件末尾可能有一个空行。您可以这样解决: 另一方面,最好使用代替。不要忘记关闭文件,或者更好地使用该文件来关闭它们:

  • 问题内容: 如何在JSP中循环通过? 问题答案: 就像使用普通Java代码一样。 但是,(JSP文件中的原始Java代码,那些东西)被认为是不明智的做法。我建议安装JSTL(只需将JAR文件放入其中,并在JSP顶部声明所需的taglib)。它有一可以迭代的标签Map。每次迭代都会给你带来反过来,而反过来又具有和方法。 这是一个基本示例: 因此,你的特定问题可以通过以下方式解决: 你需要将Servl