1

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

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

所以第 1 列是我的目标主机列表(我的库存)。Column2 是唯一的 processname 值,专门分配给 servername 的值。通常会出现同一台服务器。一些服务器只有一个进程名,而其他服务器可能有 2 到 N 个。这意味着我的目标主机可能会重复一个唯一的进程名列表。我想使用此输出对列表中的两个动态库存,并且我需要将每个观察值的两个值关联并分配给变量。我不是绝对需要使用动态库存,我只需要一个解决方案。我还需要通过 command: 或 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 | 成功 => {“改变”:假,“平”:“乒乓”} servername2 | 成功 => {“改变”:假,“平”:“乒乓”}

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

{"servername1":["processname1","processname2","processname3",]}

我缺少的最后一部分是如何在我的剧本中使用特定的 "--host={{ my_host }} 调用库存脚本。

看来我需要找到现有主机名的变量并将其作为切换选项“--host=”传递回库存脚本

4

3 回答 3

3

你说你对动态库存没问题。做你自己的。

这是文档

你需要编写一个脚本来做两件事:

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

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

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

因此,--list您应该提供唯一的主机列表。在我的示例中,它们属于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 }}"

该剧本将遍历动态清单中的所有主机并打印每个主机的所有进程。

于 2017-09-01T13:16:05.393 回答
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

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

于 2017-09-01T13:00:58.463 回答
1

关闭这个。在康斯坦丁的建议的帮助下,我现在有了一个有效的剧本。没有立即明显的是,Ansible 在幕后做了一些“魔术”。我不得不修改我的清单脚本,它生成我的动态清单以接受“--list”开关选项和“--host 主机名”选项。

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

此外,我的脚本生成的 JSON 输出必须将“组”(第一个)字段设为“myprocess”。最初,我将它作为“my_process”,但失败了。删除下划线,修复了那个错误。

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

剧本看起来像这样:

- hosts: all
  gather_facts: no
  connection: local

  tasks:
    - debug:
        msg: "Process name is {{ item }}"
      with_items:  "{{ myprocess }}"
于 2017-09-05T14:44:23.503 回答