python - 通过(python)查询ansible全局组变量

标签 python ansible

我正在尝试查询在 Ansible 中设置的全局组变量。我似乎得到了一本空字典,我不确定我还能做什么。我的代码如下所示:

def __init__(self, inventory_path=None):
    self.loader = DataLoader()
    self.variable_manager = VariableManager()
    self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=inventory_path)
    self.variable_manager.set_inventory(self.inventory)

然后当我尝试如下获取组变量时:

    inventory_asg_groups = filter(lambda g: 'asg' in g, self.inventory.groups)
    for group in inventory_asg_groups:
        print(self.inventory.get_group_vars(self.inventory.get_group(group)))

我得到一个空字典:

{}

当我做一个:

    print(self.inventory.localhost.vars)

我明白了:

{'ansible_python_interpreter': '/usr/local/opt/python/bin/python2.7', 'ansible_connection': 'local'}

我知道正在加载 list ,因为我列出了 list 中的所有组。如何通过 python ansible api 获取 group_vars/all 中列出的变量?

最佳答案

如果您定义了特定于组的变量 (group_vars/.yml),这实际上是有效的。这是因为 get_group_vars 直接读取 'all' 你可以使用 self.inventory.get_group_vars(self.inventory.get_group('all'))

完整示例如下:

污垢/主机

# hosts
[asg_2]

localhost1

[asg_1]
localhost2

[something]
localhost3

目录/group_vars/all.yml

setting_something: "5"

dir/group_vars/ags_1.yml

setting_something: "6500"

目录/ansible_loader.py

from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory

class AnsibleLoader:
    def __init__(self, inventory_path=None):
        self.loader = DataLoader()
        self.variable_manager = VariableManager()
        self.inventory = Inventory(loader=self.loader, variable_manager=self.variable_manager, host_list=inventory_path)
        self.variable_manager.set_inventory(self.inventory)

        inventory_asg_groups = filter(lambda g: 'asg' in g, self.inventory.groups)

        print(inventory_asg_groups)
        for group in inventory_asg_groups:
            print('vars for: %s' % group)
            print(self.inventory.get_group_vars(self.inventory.get_group(group)))

        print(self.inventory.get_group_vars(self.inventory.get_group('all')))


AnsibleLoader(inventory_path='hosts')

输出

[u'asg_2', u'asg_1']
vars for: asg_2
{}
vars for: asg_1
{u'setting_something': u'6500'}
{u'setting_something': u'5'}

因此它打印 asg_1 的值,因为它在 group_vars 中有文件,但不打印 asg_2 的值。最后一行是访问“所有”

都是用ansible 2.0搞定的,不知道你用的是哪个版本。

关于python - 通过(python)查询ansible全局组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39187881/

相关文章:

Ansible 远程模板

amazon-web-services - 使用 AWS CloudFormation 更新 SNS 订阅的替代方案

python - 使用 BeautifulSoup 从标签中提取字符串

Python TimedRotatingFileHandler - 日志丢失

ansible - 针对单个主机运行 Ansible playbook

python - 如何从 Python 脚本中查看/解密 Ansible 保险库凭据文件?

Ansible - 加载 block 时遇到格式错误的 block

Python:将两个列表压缩在一起而不截断

python - YouTube API v3未返回项目/ channel ID

python - 手写数字识别问题: Wrong number of dimensions