首页 > 解决方案 > 尽管通过 InventoryManager 获取正确的库存,Ansible 在本地运行所有任务

问题描述

我正在使用 ansible python sdk 从源字典运行播放。我已将其指向一个清单主机文件,如下所示:

[k8]
K8master ansible_port=22 ansible_host=172.20.100.22

但是当我运行 python 任务时,它会在 localhost 上执行所有操作。我尝试将 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)

标签: pythonansibleansible-inventory

解决方案


刚刚发现我错过了什么。对于所有像我这样的盲人,我会在这里留下答案:

我曾提到本地连接,应该是 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)

推荐阅读