MrD*_*Duk 13 python ansible ansible-2.x
有没有办法使用Ansible Python API从给定的库存文件/组合组合中获取主机列表?
例如,我们的库存文件按服务类型拆分:
[dev:children]
dev_a
dev_b
[dev_a]
my.host.int.abc.com
[dev_b]
my.host.int.xyz.com
[prod:children]
prod_a
prod_b
[prod_a]
my.host.abc.com
[prod_b]
my.host.xyz.com
Run Code Online (Sandbox Code Playgroud)
我可以用ansible.inventory某种方式传入特定的库存文件,以及我想要操作的组,并让它返回匹配的主机列表吗?
nit*_*one 16
从以前做同样的技巧,但不是all传递你想要列出的组名:
ansible (group name here) -i (inventory file here) --list-hosts
smi*_*hra 10
对我来说,以下工作
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
if __name__ == '__main__':
inventory_file_name = 'my.inventory'
data_loader = DataLoader()
inventory = InventoryManager(loader = data_loader,
sources=[inventory_file_name])
print(inventory.get_groups_dict()['spark-workers'])
Run Code Online (Sandbox Code Playgroud)
inventory.get_groups_dict()返回一个字典,您可以使用该字典通过使用 group_name 作为键来获取主机,如代码所示。您将必须安装可以通过 pip 执行的 ansible 包,如下所示
pip install ansible
Run Code Online (Sandbox Code Playgroud)
小智 7
我一直在努力解决这个问题,但通过反复试验找到了解决方案.
API的一个关键优势是您可以提取变量和元数据,而不仅仅是主机名.
#!/usr/bin/env python
# Ansible: initialize needed objects
variable_manager = VariableManager()
loader = DataLoader()
# Ansible: Load inventory
inventory = Inventory(
loader = loader,
variable_manager = variable_manager,
host_list = 'hosts', # Substitute your filename here
)
Run Code Online (Sandbox Code Playgroud)
这为您提供了一个Inventory实例,它具有提供组和主机的方法和属性.
为了进一步扩展(并提供Group和Host类的示例),这里是我写的一个片段,它将清单序列化为一个组列表,每个组都有一个'hosts'属性,它是每个主机属性的列表.
#/usr/bin/env python
def serialize(inventory):
if not isinstance(inventory, Inventory):
return dict()
data = list()
for group in inventory.get_groups():
if group != 'all':
group_data = inventory.get_group(group).serialize()
# Seed host data for group
host_data = list()
for host in inventory.get_group(group).hosts:
host_data.append(host.serialize())
group_data['hosts'] = host_data
data.append(group_data)
return data
# Continuing from above
serialized_inventory = serialize(inventory)
Run Code Online (Sandbox Code Playgroud)
我在四个F5 BIG-IP的实验室中运行了这个,这是结果(修剪):
<!-- language: lang-json -->
[{'depth': 1,
'hosts': [{'address': u'bigip-ve-03',
'name': u'bigip-ve-03',
'uuid': UUID('b5e2180b-964f-41d9-9f5a-08a0d7dd133c'),
'vars': {u'hostname': u'bigip-ve-03.local',
u'ip': u'10.128.1.130'}}],
'name': 'ungrouped',
'vars': {}},
{'depth': 1,
'hosts': [{'address': u'bigip-ve-01',
'name': u'bigip-ve-01',
'uuid': UUID('3d7daa57-9d98-4fa6-afe1-5f1e03db4107'),
'vars': {u'hostname': u'bigip-ve-01.local',
u'ip': u'10.128.1.128'}},
{'address': u'bigip-ve-02',
'name': u'bigip-ve-02',
'uuid': UUID('72f35cd8-6f9b-4c11-b4e0-5dc5ece30007'),
'vars': {u'hostname': u'bigip-ve-02.local',
u'ip': u'10.128.1.129'}},
{'address': u'bigip-ve-04',
'name': u'bigip-ve-04',
'uuid': UUID('255526d0-087e-44ae-85b1-4ce9192e03c1'),
'vars': {}}],
'name': u'bigip',
'vars': {u'password': u'admin', u'username': u'admin'}}]
Run Code Online (Sandbox Code Playgroud)
小智 5
自批准答案以来,Ansible API 发生了变化:
这适用于 Ansible 2.8(也许更多)
这是我访问大部分数据的方式:
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
loader = DataLoader()
# Sources can be a single path or comma separated paths
inventory = InventoryManager(loader=loader, sources='path/to/file')
# My use case was to have all:vars as the 1st level keys, and have groups as key: list pairs.
# I also don't have anything ungrouped, so there might be a slightly better solution to this.
# Your use case may be different, so you can customize this to how you need it.
x = {}
ignore = ('all', 'ungrouped')
x.update(inventory.groups['all'].serialize()['vars'])
group_dict = inventory.get_groups_dict()
for group in inventory.groups:
if group in ignore:
continue
x.update({
group: group_dict[group]
})
Run Code Online (Sandbox Code Playgroud)
例子:
输入:
[all:vars]
x=hello
y=world
[group_1]
youtube
google
[group_2]
stack
overflow
Run Code Online (Sandbox Code Playgroud)
输出:
{"x":"hello","y":"world","group_1":["youtube","google"],"group_2":["stack","overflow"]}
Run Code Online (Sandbox Code Playgroud)
同样,您的用例可能与我的不同,因此您必须将代码稍微更改为您想要的方式。
| 归档时间: |
|
| 查看次数: |
18399 次 |
| 最近记录: |