2017-09-01 81 views
1

我的主机清单的来源是一个输出值对的内部工具,例如,这里有六个观察值,我目前有160个观察值:Ansible:如何使用多值数据清单作为清单并传递给目标主机

servername1 processname1 
    servername1 processname2 
    servername1 processname3 
    servername2 processname1 
    servername3 processname1 
    servername4 processname1 

所以第1列是我的目标主机列表(我的库存)。 Column2是唯一的processname值,专门分配给servername的值。通常会发生相同的服务器。某些服务器只有一个进程名称,其他服务器可能有2到N.意思是说,我的目标主机可能重复一个唯一的进程名称列表。我想从这个输出列表中使用动态库存,并且我需要将每个观察值的两个值关联并分配给变量。我并不是绝对需要使用动态库存,我只需要一个解决方案。我还需要通过命令:或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周!我使用静态和动态库存做得非常好,但是由于库存清单并不明显,因此造成了这种情况,给出了匹配对的格式。

注意:很多人都建议使用host_vars,但在我看来,保留给主机名以及相关的端口和代理值。我可能是错的。

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

更新:感谢您的正确方向的帮助。 我已更新我们的库存脚本以JSON输出主机列表。 第一个新选项是使用JSON输出主机。 示例: {“my_host”:[“servername1”,“servername2”,]}

将此称为动态库存脚本,效果很好!

ansible all -m ping servername1 | SUCCESS => { “changed”:false, “ping”:“pong” } servername2 | SUCCESS => { “变为”:假, “平”:“傍” }

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

{ “servername1”: “processname1”, “processname2”, “processname3”]}

,我很想念最后一部分是如何我请在我的剧本中使用特定的“--host = {{my_host}}来调用库存脚本。

似乎我需要找到现有主机名的变量,并将该变量传回库存脚本开关选项“--host =”

回答

2

你说你可以动态存货。做你自己的。

这里是the docs

你需要做一个脚本,将做两件事情:当--list执行

  • ,处理您的文件和打印此JSON到stdout:

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

    { "myprocesses": ["processname1", "processname2"] } 
    

所以用--list你应该提供uniq主机列表。在我的例子中,他们属于myhosts组。

并与--host <hostname>你应该提供该主机的主机变量列表字典(<hostname>)。在我的例子中有一个列表变量myprocesses,其中包含该主机的所有进程。

然后只需拨打ansible-playbook -i my_inv_script myplaybook.yml

例剧本:

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

这个剧本将走线槽中的所有主机的动态库存,并打印所有进程的每个主机。

+0

谢谢。我明白这应该如何工作。还有一个问题:第二次包含对库存脚本的调用时,如何将-host 包含在-i my_inv_script中?我可以引用,是-i“my_inv_script --host {{myhosts}}”? – gantte

+0

您只需使用'-i my_inv_script'指定库存脚本,然后Ansible在内部调用'my_inv_script --list'来列出所有主机,然后为每个主机调用'my_inv_script --host '以获取其变量。 –

+0

有没有其他方法可以做到这一点?我的广告资源脚本不支持“--list”。脚本是perl。该脚本需要多个选项才能从数据库中获得所需的输出。我在bash shell脚本中用正确的选项包装了perl脚本。例如:invList -a appReleasever -p平台-e releaseVer等等。因此,通过包装在bash shell中,基本shell的源代码输出动态库存的主机列表。没有“--list”我可以分配一个变量模拟添加--host = {{hostname}}吗? – gantte

2

您需要开发一个动态库存脚本,将第一列作为主机我和第二列作为该主机的变量。

请,找到下面的链接,我用PHP编写的 https://github.com/walden-it/ansible-ij/blob/master/inventory.php

看看功能get_vars()和get_hosts(),看看是如何被填充阵列的动态库存。

而如果你需要它,这里是这个脚本是看数据库的转储: https://github.com/walden-it/ansible-ij/blob/master/ansible.sql

然后你只用-i库存指定它在ansible运行,或将其添加为inventory_fileansible.cfg

+0

如果你能提高你的答案(我以为你可以通过第二段你写的),请做。它可以帮助更多的用户使用相同的问题... –

1

关闭此项。在康斯坦丁的建议帮助下,我现在有一个工作的戏剧。什么是不明显的是,Ansible在幕后做了一些“魔术”。我必须修改我的库存脚本,这会生成我的动态库存以接受“--list”开关选项和“--host hostname”选项。

完成此操作后,我可以使用-i listInv运行剧本,Ansible内部将此脚本作为listInv --list生成我的动态库存列表。然后循环到with_items,并在内部调用脚本listInv --host {{项目}}并输出匹配的流程名称。

此外,我的脚本生成的JSON输出必须使“组”(第一个)字段“myprocess”。最初,我把它当作“my_process”,并且失败了。删除下划线,修正错误。

现在都在工作。这是学习的一个很好的例子,但它仍然很神奇。

的剧本是这样的:

- hosts: all 
    gather_facts: no 
    connection: local 

    tasks: 
    - debug: 
     msg: "Process name is {{ item }}" 
     with_items: "{{ myprocess }}"