在python中解析清单中的变量

时间:2019-03-29 08:01:34

标签: python-2.7 ansible ansible-inventory

我正在尝试使用清单文件中指定的python解析ansible变量,如下所示:

static

我希望能够解析Web服务器中的主机foo.example.com的[webservers] foo.example.com type=news bar.example.com type=sports [dbservers] mongodb.local type=mongo region=us mysql.local type=mysql region=eu 和dbservers中的主机mongodb.local的type=news。对此的任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

下面的戏

- name: List type=news hosts in the group webservers
  debug:
    msg: "{{ hostvars[item].inventory_hostname }}"
  loop: "{{ groups['webservers'] }}"
  when: hostvars[item].type == "news"

- name: List type=mongo and region=us hosts in the group dbservers
  debug:
    msg: "{{ hostvars[item].inventory_hostname }}"
  loop: "{{ groups['dbservers'] }}"
  when:
    - hostvars[item].type == "mongo"
    - hostvars[item].region == "us"

给予:

"msg": "foo.example.com"
"msg": "mongodb.local"

答案 1 :(得分:0)

我建议您看看how ansible itsef is parsing ini files to turn them into an inventory object

,而不是重新发明轮子。

您还可以使用非常简单的剧本(如@vladimirbotka的建议)轻松地以json格式获取此信息,或重写inventory in yaml,这将更易于使用任何外部工具进行解析

inventory.yaml

---
all:
  children:
    webservers:
      hosts:
        foo.example.com:
          type: news
        bar.example.com:
          type: sports
    dbservers:
      hosts:
        mongodb.local:
          type: mongo
          region: us
        mysql.local:
          type: mysql
          region: eu

答案 2 :(得分:0)

如果剧本将在主机上运行:

  

foo.example.com

您只需指定“ {{type}}”即可获得“ type = news”。如果要在“何时”条件下使用,则只需指出“类型” 如果该剧本将在主机上运行:

  

mongodb.local

然后,在这种情况下,“ type”的值将自动为=“ mongo”,“ region”将自动为=“ us”

如果变量的值在您指定的主机文件中定义,则将在指定的主机上自动确定

因此,该剧本可以在所有主机上执行,并且如果您获得“ type”的值,例如:

- debug:
     msg: "{{type}}"

在每个主机上,您将获得在主机文件中定义的唯一值

我不确定我是否正确理解了这个问题,但是如果这意味着在foo.example.com主机上,则有必要从“ webservers”组中获取具有“ type = news”的服务器列表,那么答案已经给出。