Ansible:如何使用多值数据列表作为库存并传递给目标主机

Ansible:如何使用多值数据列表作为库存并传递给目标主机,ansible,ansible-inventory,ansible-facts,Ansible,Ansible Inventory,Ansible Facts,我的主机清单来源于一个输出成对值的内部工具,例如,这里有六个观察值,我目前有160个观察值: servername1 processname1 servername1 processname2 servername1 processname3 servername2 processname1 servername3 processname1 servername4 processname1 因此,第1列是我的目标主机列表(我的库存)。Column

我的主机清单来源于一个输出成对值的内部工具,例如,这里有六个观察值,我目前有160个观察值:

   servername1  processname1
   servername1  processname2
   servername1  processname3
   servername2  processname1
   servername3  processname1
   servername4  processname1
因此,第1列是我的目标主机列表(我的库存)。Column2是唯一的processname值,专门分配给servername的值。通常会出现相同的服务器。某些服务器只有一个processname,其他服务器可能有2到N。这意味着我的目标主机可能会重复一个唯一的processname列表。我想使用这个成对输出列表中的两个动态清单,并且我需要将每个观测值上的两个值关联起来并分配给变量。我不是绝对需要使用动态库存,我只是需要一个解决方案。我还需要通过命令:或shell:modules传递给目标主机和{{processname#}}中的值。(这是唯一的,没有与此需求相关的模块)

如果需要,我可以过滤这些数据并以JSON格式或YAML输出,为每个主机生成一个单独的YML文件。而我更喜欢动态地处理这些;预处理列表是可以接受的

因为ansible playbook需要一些已知的主机库存列表,所以我在理解如何在开始播放时从动态输出创建此列表时陷入了困境

到目前为止,我所做的是:我尝试读取并尝试将这些对设置为/etc/ansible/hosts/host_vars/servername#yml文件中的。这非常难看,因为我必须将数据输出预处理为YML格式。但它并没有给我一个在我的剧本中可以参考的主持人列表。因此,虽然hostvar似乎是一个合乎逻辑的选择,但我无法理解它

我需要的是:

- The suggested format of the data?  JSON? YAML? Other? (if I cannot read it in dynamically.
- Is putting this in host_vars correct?
- Last night I saw another answer using set_fact, would that help?
谢谢你的见解。我现在已经使用Ansible 3.5周了!我在使用静态和动态清单方面做得相当好,但这让我感到困惑,因为清单列表并不明显,请给出匹配对的格式

注意:许多人建议使用主机变量,但在我看来,这是保留给主机名、相关端口和代理值的。我可能错了

===================================================================

更新:感谢您在正确方向上的帮助。 我已经更新了清单脚本,以JSON格式输出主机列表。 第一个新选项是以JSON格式输出主机。 例子: {“我的主机”:[“服务器名1”,“服务器名2”,“]}

将其称为动态清单脚本非常有用

ansible all-m ping servername1 |成功=>{ “更改”:错误, “乒乓球”:“乒乓球” } servername2 |成功=>{ “更改”:错误, “乒乓球”:“乒乓球” }

下一步:清单脚本的第二个新选项是添加一个新开关以输入主机名。这部分仍然让我困惑。以下是输出: showInv--host=servername1

{“servername1”:[“processname1”、“processname2”、“processname3”、]}

我缺少的最后一部分是如何从我的剧本中使用一个特定的“-host={{my_host}}调用清单脚本


似乎我需要找到现有主机名的变量,并将其作为开关选项传递回清单脚本”-host=“

您需要开发一个动态清单脚本,该脚本将第一列作为主机名,第二列作为该主机的变量

请在下面找到我用php编写的动态清单的链接

查看函数get_vars()和get_hosts(),了解数组是如何填充的

如果您需要,下面是此脚本正在查看的数据库的转储:


然后,您只需在ansible运行中使用
-i
inventory指定它,或者将其作为
inventory\u文件添加到
ansible.cfg

您将需要开发一个动态清单脚本,该脚本将第一列作为主机名,第二列作为该主机的变量

请在下面找到我用php编写的动态清单的链接

查看函数get_vars()和get_hosts(),了解数组是如何填充的

如果您需要,下面是此脚本正在查看的数据库的转储:


然后,您只需在ansible运行中使用
-i
库存指定它,或者将其作为
库存文件添加到
ansible.cfg

您说您可以使用动态库存。创建您自己的库存

这是

您需要制作一个脚本来完成两件事:

  • 使用
    --list
    执行时,处理文件并将此JSON打印到标准输出:

    { "myhosts": ["servername1", "servername2", "servername3"] }
    
    { "myprocesses": ["processname1", "processname2"] }
    
  • 使用
    --host servername1
    执行时,将此JSON打印到标准输出:

    { "myhosts": ["servername1", "servername2", "servername3"] }
    
    { "myprocesses": ["processname1", "processname2"] }
    
因此,对于
--list
您应该提供主机的uniq列表。在我的示例中,它们属于
myhosts

使用
--host
,您应该为该主机(
)提供主机变量的列表dict。在我的示例中,有一个列表变量
myprocesss
,它包含该主机的所有进程

然后只需调用ansible playbook-i我的脚本myplaybook.yml

示例剧本:

---
- hosts: myhosts
  tasks:
    - debug:
        msg: "Process name is {{ item }}"
      with_items: "{{ myprocesses }}"

此手册将在您的动态资源清册中的所有主机上运行,并打印每个主机的所有进程。

如果您说您可以使用动态资源清册,请自行制作

这是

您需要制作一个脚本来完成两件事:

  • 使用
    --list
    执行时,处理文件并将此JSON打印到标准输出:

    { "myhosts": ["servername1", "servername2", "servername3"] }
    
    { "myprocesses": ["processname1", "processname2"] }
    
  • 使用
    --host servername1
    执行时,将此JSON打印到标准输出:

    { "myhosts": ["servername1", "servername2", "servername3"] }
    
    { "myprocesses": ["processname1", "processname2"] }
    
因此,对于
--list
您应该提供主机的uniq列表。在我的示例中,它们属于
myhosts

使用
--host
,您应该为该主机(
)提供主机变量的列表dict