ansible.inventory.manager检查python中的库存错误



我有一个Ansible hosts.ini错误

[linux]
server01 pr_ip_address = 10.0.0.1

我用python写了下面的函数

from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
def check_inventory():
loader = DataLoader()
InventoryManager(loader=loader, sources='hosts.ini')
check_inventory()

我正在尝试使用以下消息作为stderr:

[WARNING]:  * Failed to parse
/inventories/hosts.ini  
with script plugin: problem running
/hosts.ini  
--list ([Errno 8] Exec format error: '/hosts.ini')
[WARNING]:  * Failed to parse
/hosts.ini  
with ini plugin: /hosts.ini:913: Expected key=value host variable assignment, got:
pr_ip_address
[WARNING]: Unable to parse
/hosts.ini  
as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available

我的问题是,我不知道如何抓取它,也不能将它写入stderr或stdout。

当我的ini-file是正确的:

[linux]
server01 pr_ip_address=10.0.0.1

我什么也没得到....我想我可以用它来尝试除非或if else条件,但我不知道如何。

我找到了解决问题的方法。我使用ansible_runner并捕获它的输出。这对我来说很有效:)。也许它也能帮助别人!

import os
import sys
import ansible_runner
from io import StringIO 
from termcolor import colored, cprint

def verify(inipath):
class Capturing(list):
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._stringio = StringIO()
return self
def __exit__(self, *args):
self.extend(self._stringio.getvalue().splitlines())
del self._stringio    # free up some memory
sys.stdout = self._stdout
with Capturing() as output:
r = ansible_runner.run(private_data_dir=inipath, 
inventory='hosts.ini', 
host_pattern='localhost', 
module='shell', 
module_args='whoami')
print(r.status, str)

def words_in_string(word_list, a_string):
return set(word_list).intersection(a_string.split())
error_handling = ['error', 'Failed', 'Errno']
if words_in_string(error_handling, str(output)):
print(output)
cprint('something went wrong with your hosts.ini :(', 'green')
sys.exit(0)
else:
cprint('hosts.ini verify was successfully!!!', 'green')
pass
if __name__ == "__main__":
verify(inipath='./')

相同的替代方法:-

from ansible.inventory.manager import InventoryManager
from ansible.parsing.dataloader import DataLoader
def check_inventory():
loader = DataLoader()
inventory_obj = InventoryManager(loader=loader, sources=None, parse=True)
valid_inventory = inventory_obj.parse_source(source='hosts.ini')
if valid_inventory:
return True
return False
validate_inventory = check_inventory()
if validate_inventory:
print('hosts.ini verification was successful!')
else:
print('something went wrong with your hosts.ini inventory')

最新更新