Ansible 在本地运行所有任务,尽管通过 InventoryManager 获取了正确的库存
Ansible runs all task on local in spite of fetching the proper inventory through InventoryManager
我正在使用 ansible python sdk 运行 来自源字典的剧本。我已将其指向如下所示的清单主机文件:
[k8]
K8master ansible_port=22 ansible_host=172.20.100.22
但是当我 运行 python 任务时,它会在本地主机上执行所有内容。我曾尝试将 connection='local' 更改为 connection='ssh' 但随后模块就失败了。
我也试过直接在 playbook dict 的主机中传递 IP。
我错过了什么?
这是 python 文件。
def ansible_workflow(request):
data = request.data
context.CLIARGS = ImmutableDict(connection='local', module_path=['/to/mymodules'], forks=10, become=None,
become_method=None, become_user=None, check=False, diff=False)
loader = DataLoader() # Takes care of finding and reading yaml, json and ini files
passwords = dict(vault_pass='secret')
results_callback = ResultCallback()
inventory = InventoryManager(loader=loader, sources="path/to/hosts")
variable_manager = VariableManager(loader=loader, inventory=inventory)
roles = get_roles(item)
vars_list = [
{'vars_that_i_use_in_roles': somevar},
]
play_source = dict(
name = "Ansible Play",
hosts = 'k8',
gather_facts = 'yes',
vars = vars_list,
roles = roles
)
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
# play._tqm._stdout_callback = ResultCallback()
# execute_playbook(play_source, extra_vars_dict={})
tqm = None
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
passwords=passwords,
stdout_callback=results_callback,
)
result = tqm.run(play)
finally:
if tqm is not None:
tqm.cleanup()
# Remove ansible tmpdir
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)
刚刚发现我遗漏了什么。对于所有像我这样的盲人,我会在这里留下答案:
我提到过本地连接,应该是 ssh。并且 ssh 插件没有详细说明就失败了
context.CLIARGS = ImmutableDict(connection='ssh', module_path=['/to/mymodules'], forks=10, become=None,
become_method=None, become_user=None, check=False, diff=False, verbosity=2)
我正在使用 ansible python sdk 运行 来自源字典的剧本。我已将其指向如下所示的清单主机文件:
[k8]
K8master ansible_port=22 ansible_host=172.20.100.22
但是当我 运行 python 任务时,它会在本地主机上执行所有内容。我曾尝试将 connection='local' 更改为 connection='ssh' 但随后模块就失败了。 我也试过直接在 playbook dict 的主机中传递 IP。 我错过了什么?
这是 python 文件。
def ansible_workflow(request):
data = request.data
context.CLIARGS = ImmutableDict(connection='local', module_path=['/to/mymodules'], forks=10, become=None,
become_method=None, become_user=None, check=False, diff=False)
loader = DataLoader() # Takes care of finding and reading yaml, json and ini files
passwords = dict(vault_pass='secret')
results_callback = ResultCallback()
inventory = InventoryManager(loader=loader, sources="path/to/hosts")
variable_manager = VariableManager(loader=loader, inventory=inventory)
roles = get_roles(item)
vars_list = [
{'vars_that_i_use_in_roles': somevar},
]
play_source = dict(
name = "Ansible Play",
hosts = 'k8',
gather_facts = 'yes',
vars = vars_list,
roles = roles
)
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
# play._tqm._stdout_callback = ResultCallback()
# execute_playbook(play_source, extra_vars_dict={})
tqm = None
try:
tqm = TaskQueueManager(
inventory=inventory,
variable_manager=variable_manager,
loader=loader,
passwords=passwords,
stdout_callback=results_callback,
)
result = tqm.run(play)
finally:
if tqm is not None:
tqm.cleanup()
# Remove ansible tmpdir
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)
刚刚发现我遗漏了什么。对于所有像我这样的盲人,我会在这里留下答案:
我提到过本地连接,应该是 ssh。并且 ssh 插件没有详细说明就失败了
context.CLIARGS = ImmutableDict(connection='ssh', module_path=['/to/mymodules'], forks=10, become=None,
become_method=None, become_user=None, check=False, diff=False, verbosity=2)