【问题标题】:Iterate in -hosts line (ansible) with customized variable/in-memory inventory使用自定义变量/内存清单迭代 -hosts 行(ansible)
【发布时间】:2021-06-26 11:30:28
【问题描述】:

我正在编写一个 ansible 脚本,它使用配置 .xml 文件配置环境。这个文件总是不同的(IP地址和库存组名都改变了),这就是为什么我正在寻找在ansible的“-hosts”行中使用变量的可能性。伪代码如下所示:

- hosts: main
  var: 
     space = (lookup(.......))

- hosts: item.grouphostserver
  -tasks:

  -name: load docker image
   docker_image:
      name: {item.name}
      path: {item.path} 
   loop: "{{ space }}"
   when: item.name == item.grouphostserver

这个带有条件的简单循环似乎根本不起作用......到目前为止我发现的所有内容都是您需要在 -hosts 行中明确写入组的名称。甚至 group_names[0] 也不起作用!将不胜感激任何帮助

【问题讨论】:

    标签: python ansible inventory


    【解决方案1】:

    第二个hosts 组不能那样工作。您需要使用模块add_host 将这些项目添加到hosts group ..这是该模块https://docs.ansible.com/ansible/2.5/modules/add_host_module.html 的文档

    我不确定您的space 的结构如何,但这是一个想法.. 如果您想要一个可行的解决方案,我需要看看您的space 是如何定义的...可能是一个样本会提供更好的图片

    所以这就是如何做到这一点..

    - hosts: main
      var: 
         space = (lookup(.......))
    
      tasks:
      - name: add hosts
        add_host:
          name: "{{ item }}"
          groups: new_hosts_grp
        loop: "{{ space }}"
        when: item.name == item.grouphostserver
    
    
    - hosts: new_hosts_grp
      tasks:
      - name: load docker image
       docker_image:
          name: {item.name}
          path: {item.path} 
       loop: "{{ space }}"
       when: item.name == item.grouphostserver
    

    【讨论】:

    • 您好,非常感谢您的回答!是的,我知道 add_host 模块,但我仍然需要创建许多组。根据这个组的名称,我应该在远程服务器上完成工作。只有一组的“主机”中定义的名称不合适。在 -host "group[item.name]" 中也不起作用 :(.
    • 您编写的解决方案:为组“new_hosts_group”中的每个服务器部署所有 docker_images。我需要的是每个组(在服务器内部)部署其专用 docker_image 并做一些事情。
    • 是的,所以要创建子组(或单独的组),您需要向我们展示您的space 数据结构是如何定义的,以及您如何将它们分开的条件。这似乎更符合逻辑。如果你能抓住关于如何形成这些子组的关键点,那么回答将非常有帮助。我们所要做的就是将该逻辑放入when condition 并使用多个add_host 来形成这些组。或者你可以把这个大问题拆分成多个问题,一一提问,得到准确答案。
    • 空间数据有字典列表的形式,例如:[{key1:id1, name1:app1, grouphostserver1:group1, ipaddress1:111.222.333.444, pathtobinary1:/path/to/binary }, {key2:id2, name2:app2, grouphostserver2:group2, ipaddress2:222.222.333.444, pathtobinary2:/path/to/binary}, ... ].
    • 在每个主机组上都应该部署其专用的应用程序,主机组的名称事先不知道,每个组可以包含不同或相同的IP地址。在 Python、Java 等中解决此任务的最简单方法是在 -hosts: item.grouphostserver 中编写一个变量,并进一步使用循环以及何时启动该主机组的应用程序(请参阅我的初始伪代码)。但它接缝,Ansible 不容忍 -hosts 行中的任何变量。我说得对吗?或者有解决这个问题的办法吗?
    猜你喜欢
    • 2019-11-21
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多