Рейтинг:0

Динамическая передача json в качестве параметра в «командной» задаче

флаг lc

У меня есть эта задача в моем playbook:

- name: Обновить теги экземпляра
    команда: обновление экземпляра вычислений oci -c {{ отделение }} --freeform-tags {{ tag_var_json }}

Согласно документация оракула для этой команды параметр --freeform-теги принимает json, представляющий пару ключ-значение для тега. Мне нужно, чтобы этот json создавался динамически в самой пьесе, поэтому перед запуском этой задачи у меня есть это для целей тестирования:

  - имя: создать объект json для использования в качестве тега
    set_fact:
      tag_var: '{ "тест": "этот тест" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Но я, должно быть, делаю что-то не так, потому что я продолжаю получать эту ошибку:
фатальный: [localhost]: FAILED! => {"msg": "Задача включает опцию с неопределенной переменной. Ошибка: 'tag_var' не определена

Есть ли более простой способ создать json непосредственно в playbook и передать его в качестве аргумента этому параметру?

Спасибо.

anx avatar
флаг fr
anx
Ключи YAML должны быть уникальными. Таким образом, ваш образец имеет неправильный синтаксис. Может быть, вы хотели установить переменную в другой задаче?
anx avatar
флаг fr
anx
Возможно, вы неправильно истолковали ошибку как что-то, возвращенное вашей командой? Это говорит сам *ansible*, а не цитата из сообщения, возвращаемого какой-то вызываемой программой!
Ress avatar
флаг lc
Я новичок в ansible, поэтому извиняюсь. Я просто пытаюсь передать json в качестве аргумента для параметра, как показано выше, но мне нужно создать указанный json в том же плейбуке.
Рейтинг:1
флаг th

Здесь происходит две вещи. Во-первых, вы создали YAML, который принимается синтаксическим анализатором, но ведет себя несколько неожиданно (и выдает предупреждение в текущей версии Ansible).

  - имя: создать объект json для использования в качестве тега
    set_fact:
      tag_var: '{ "тест": "этот тест" }'
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Ключи в YAML уникальны; когда синтаксический анализатор встречает второй экземпляр того же ключа, он отбрасывает первый. Поскольку вы повторили set_fact, это эквивалентно:

  - имя: создать объект json для использования в качестве тега
    set_fact:
      tag_var_json: "{{ tag_var | to_json }}"

Однако исправление синтаксической ошибки все равно приведет к сбою.

  - имя: создать объект json для использования в качестве тега
    set_fact:
      tag_var: '{ "тест": "этот тест" }'
      tag_var_json: "{{ tag_var | to_json }}"

Аргументы set_fact должны быть шаблонизированы до запуска задачи, после чего tag_var все еще не определен (поскольку эта задача определяет его.)

Один правильный способ написать эту задачу как две отдельные задачи:

  - имя: создать объект тега
    set_fact:
      tag_var:
        тест: этотест

  - имя: создать строку JSON для тегов
    set_fact: 
      tag_var_json: "{{ tag_var | to_json }}"

Однако, set_fact вообще не требуется. Вы можете просто установить переменную непосредственно для задачи, в которой вы ее используете, что более эффективно и делает ее более узкой.

- name: Обновить теги экземпляра
    команда: обновление экземпляра вычислений oci -c {{ partition }} --freeform-tags "{{ tag_var | to_json }}"
  вары:
    tag_var:
      тест: этотест

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.