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

2023-12-23

我的 Ansible 剧本中有一个任务,我想要迭代我拥有的组中的每个主机,并且对于每个主机,我想从我在 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

我似乎已经记录了各个部分或了解了它,但是如何组合对库存组中的主机进行迭代并分配已在已创建的列表(在角色 vars 文件夹中)中拥有的名称?

UPDATE上述任务已更新,以反映答案中提到的更改:

- 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 循环的问题时,我也会去访问循环文档 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ansible 中循环库存并分配价值 的相关文章

随机推荐

  • ServiceStack OnDeserialized 等效项

    我正在实时反序列化 websocket 消息 在我收到的消息 json 字符串 中 有一个 unix 时间戳 长 一旦每个对象被反序列化 我就需要它尽快调用一个方法 以便我可以捕获消息发送和接收时间之间的延迟 使用 Json NET 这很简
  • 如何对字典(在运行时)进行类型提示/类型检查以查找任意数量的任意键/值对?

    我定义一个类如下 from numbers import Number from typing import Dict from typeguard import typechecked Data Dict str Number typec
  • 缓慢/跳跃地调整大小

    我使用简单的渐变扩展 JComponent 并调整 PaintComponent 方法制作了自己的 BottomBar 然后我将它添加到使用 BorderLayout 的 JFrame 的南部 一切一开始看起来都是正确的 当我调整框架大小时
  • 如何在android中获取纬度和经度?

    android2 3 3中如何获取当前的经纬度 我尝试跟随this https stackoverflow com questions 2227292 how to get latitude and longitude of the mob
  • 当使用实体框架代码优先映射属性到单独的表时,移动外键字段

    使用代码优先 EF 映射表时遇到奇怪的问题 我有一个父类 Contract 与另一个类 Supplier 具有多对一关系 要求在合同实体中存储合同的扫描副本 为了避免每次都查询文档字节 我想将此属性存储在单独的表中 我可以让 EF 将 Co
  • 为什么我的“事件”总是空?

    我正在尝试连接一个新事件 但由于某种原因 更改 总是评估为空 public class MyTreeViewItem INotifyPropertyChanged private MyTreeViewItem parent public M
  • Windows 批处理中的 if/then/else 语句

    在 shell 脚本中我有以下代码 if echo Mr 32 then echo Success else echo Failed exit fi Windows 批处理文件的等效语法是什么 我很难想象 ECHO 何时会失败并返回 ERR
  • 将布尔值绑定到视觉状态

    我正在使用表达式混合 当列表框没有元素时 我想将文本框的状态更改为红色边框和红色文本 因此 当文本更改时 我会过滤列表框 private void OnIPAddressTextChanged object sender System Wi
  • 启动 docker 守护进程监听特定端口的正确方法

    我是 Docker 新手 希望以守护进程模式启动它 监听特定的 IP 地址和端口 在里面文档 https docs docker com reference commandline daemon 据说这可以通过写来完成sudo usr bi
  • 关于AMR音频文件在不同设备上播放的问题

    我这里遇到了一个很奇怪的问题 我正在开发一个IM软件 需要在Android上播放另一个客户端录制的音频文件 我得到的相同音频文件可以在 3GS IOS 4 2 1 设备和模拟器 4 2 上使用 AVAudioPlayer 播放 但是当我尝试
  • 如何在gmake中返回变量的第一个字符

    使用 GNU 的 make 我想提取变量的第一个字符 目前我正在使用 shell 函数bash执行子串 我想知道是否有办法使用 gmake 的内置函数来执行相同的操作 DIR user shell echo USER 0 1 USER 这不
  • ViewModel 在 Activity 之间共享数据

    我正在使用 android viewmodel 但我无法从另一个活动传递和访问活动视图模型的数据 我只能用片段来做到这一点 我应该使用像 EventBus 这样的库在几个活动之间共享数据吗 最佳实践是什么 None
  • Libgdx,使用 Shader 的 Alpha 文本不起作用

    我在使用舞台操作在文本 使用着色器 中应用 alpha 时遇到一些问题 我正在使用添加窗口演员和窗口添加标签演员的组 我组中的其他演员应用 Actions alpha 工作得很好 但我的标签 使用着色器绘制 不起作用 与其他小部件不同的是我
  • SQL Server 理解 SCOPE_IDENTITY()

    我在存储过程中有这段代码 BEGIN SET UserId NULL IF Username IS NOT NULL BEGIN EXECUTE SP ADD USER Username UserId OUTPUT END EXECUTE
  • 使用带有字节计数的 textwrap.wrap

    我怎样才能使用textwrap在行达到一定字节数之前分割的模块 不分割多字节字符 我想要这样的东西 gt gt gt textwrap wrap bytewidth 10 结果取决于所使用的编码 因为每个字节数 字符是编码的函数 在许多编码
  • 如何将一个 64 位整数存储在两个 32 位整数中并再次转换回来

    我很确定这只是一些按位运算的问题 我只是不完全确定我应该做什么 并且所有搜索都会返回 64 位与 32 位 pack u32 x y u64 v u64 x lt lt 32 y unpack x u32 v 0xFFFFFFFF00000
  • 拼写检查仅替换文本框中的第一个单词

    我知道我以前在某个地方见过这个问题 但我不确定当时是否有答案 我正在尝试将拼写检查添加到TextBox在 WPF NET 4 0 中 它在查找和标记不正确的单词方面效果很好 并且会替换单词中的第一个单词TextBox如果不正确 不过 任何超
  • IBOutlet 是否需要是一个属性并被合成?

    在大多数示例中 我看到 IBOutlet 的以下设置 Example A FooController h interface FooController UIViewController UILabel fooLabel property
  • dart 中隐式强制转换运算符的语法是什么?

    我想将自定义类 A 的实例强制转换为 int 隐式强制转换运算符的语法是什么 我以为我记得有这样的功能 但我在网上找不到它 int a new A 您还可以使用as帮助告诉工具 不 真的 将此对象视为此类型 一个很好的例子是当你必须处理 d
  • 如何在 Ansible 中循环库存并分配价值

    我的 Ansible 剧本中有一个任务 我想要迭代我拥有的组中的每个主机 并且对于每个主机 我想从我在 vars 文件夹中创建的主机名列表中分配一个名称 我已经熟悉通过编写循环来循环库存 groups mygroup 并且我有一个主机名列表