передать словарь для копирования модуля при использовании ansible API - PullRequest
1 голос
/ 11 февраля 2020

Я использую ansible API для автоматизации некоторых задач. сценарий примет список хостов в качестве аргументов

, используя локальную библиотеку python, сгенерирует некоторый контент, уникальный для хоста, а затем будет создана игра с использованием модуля копирования, и вы захотите передать ключ словаря содержимое, чтобы избежать создания временного файла на элементе управления ansible host

каким-то образом модуль копирования неправильно расширяет переменную inventory_hostname или даже ansible_nodename

Я думаю, что я все перепробовал с одинарными кавычками, без, с / без фигурных скобок.

from custom lib import generate_content
file_content = {}
for hostname in hostnames:
    file_content[hostname] = generate_content(hostname)

loader = DataLoader()
passwords = { }

context.CLIARGS = ImmutableDict(tags={}, listtags=False, listtasks=False, listhosts=False, syntax=False, connection='ssh',
                    module_path=None, forks=100,  private_key_file=None,
                    ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None,become=True,
                    become_method='sudo',become_user='root', verbosity=True, check=False, start_at_task=None)


Inventory = InventoryManager(loader=loader, sources=my_inv)

variable_manager = VariableManager(loader=loader, inventory=Inventory, version_info=CLI.version_info(gitinfo=False))

play_source =  dict(
        name = "Ansible Play",
        hosts = 'all',
        gather_facts = 'yes',
        tasks = [
            dict(action=dict(module='debug', args=dict(msg='{{inventory_hostname}}'))),
            dict(action=dict(module='copy', content=file_content[inventory_hostname], dest='/etc/content', backup='yes'))
         ]
    )

play = Play().load(play_source, variable_manager=variable_manager, loader=loader)


tqm = None
try:
    tqm = TaskQueueManager(
              inventory=Inventory,
              variable_manager=variable_manager,
              loader=loader,
              passwords=passwords,
              stdout_callback="default",
          )
    result = tqm.run(play)
finally:

    if tqm is not None:
        tqm.cleanup()
    shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)

модуль отладки правильно правильно расширяет переменную inventory_hostname, но не при передаче в качестве ключа для содержимого или модуля копирования.

есть ли способ достичь этого? если я поставил имя_ инвентаря без одинарных кавычек, я получаю эту ошибку:

    dict(action=dict(module='copy', content=file_content[inventory_hostname], dest='/etc/content', backup='yes'))
NameError: name 'inventory_hostname' is not defined

если я использую одинарные или двойные кавычки, я получаю KeyError:

    dict(action=dict(module='copy', content=file_content["inventory_hostname"], dest='/etc/content', backup='yes'))
KeyError: u'inventory_hostname'

тот факт, что есть фигурные скобки, делает не меняются проблемы и ошибки.

с использованием python 2,7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...