Spec-Zone.ru › Ansible

Расширенный синтаксис плейбуков

Примеры расширенного синтаксиса YAML на этой странице дают больше контроля над данными, помещаемыми в файлы YAML, используемые Ansible. Дополнительные сведения о YAML, специфичном для Python, см. в официальной документации PyYAML.

Небезопасные строки и строки без обработки

При обработке значений, возвращаемых плагинами поиска, Ansible использует тип данных unsafe для блокировки шаблонизации. Пометка данных как небезопасных не позволяет злоумышленникам использовать шаблоны Jinja2 для выполнения произвольного кода на целевых машинах. Реализация Ansible гарантирует, что небезопасные значения никогда не шаблонизируются. Это более надёжный способ защиты, чем экранирование Jinja2 с помощью тегов {% raw %} ... {% endraw %}.

Вы можете использовать тот же тип данных unsafe в определяемых вами переменных, чтобы предотвратить ошибки шаблонизации и раскрытие информации. Значения, заданные с помощью vars_prompts, можно пометить как небезопасные. Также в плейбуках можно использовать unsafe. Наиболее распространённые случаи применения — пароли со специальными символами, такими как { или %, и аргументы JSON, похожие на шаблоны, но которые не должны шаблонизироваться. Например:

---
mypassword: !unsafe 234%234{435lkj{{lkjsdf

В плейбуке:

---
hosts: all
vars:
  my_unsafe_variable: !unsafe 'unsafe % value'
tasks:
    ...

Для сложных переменных, таких как хеши или массивы, используйте !unsafe для отдельных элементов:

---
my_unsafe_array:
  - !unsafe 'unsafe element'
  - 'safe element'

my_unsafe_hash:
  unsafe_key: !unsafe 'unsafe value'

Якоря и псевдонимы YAML: совместное использование значений переменных

Якоря и псевдонимы YAML помогают определять, поддерживать и гибко использовать общие значения переменных. Якорь задаётся с помощью &, а затем на него ссылаются с помощью псевдонима, обозначаемого *. Вот пример, в котором с помощью якоря задаются три значения, два из них используются через псевдоним, а третье переопределяется:

---
# ...
vars:
  app1:
    jvm: &jvm_opts
      opts: '-Xms1G -Xmx2G'
      port: 1000
      path: /usr/lib/app1
  app2:
    jvm:
      <<: *jvm_opts
      path: /usr/lib/app2
# ...

Здесь app1 и app2 используют общие значения opts и port через якорь &jvm_opts и псевдоним *jvm_opts. Значение path объединяется с помощью <<, или оператора объединения.

Якоря и псевдонимы также позволяют совместно использовать сложные наборы значений переменных, включая вложенные переменные. Если значение одной переменной включает значение другой, их можно определить отдельно:

vars:
  webapp_version: 1.0
  webapp_custom_name: ToDo_App-1.0

Это неэффективно и при масштабировании требует большего объёма сопровождения. Чтобы включить версию в имя, можно использовать якорь в app_version и псевдоним в custom_name:

vars:
  webapp:
      version: &my_version 1.0
      custom_name:
          - "ToDo_App"
          - *my_version

Теперь значение app_version можно повторно использовать в значении custom_name, а результат — в шаблоне:

---
- name: Using values nested inside dictionary
  hosts: localhost
  vars:
    webapp:
      version: &my_version 1.0
      custom_name:
        - "ToDo_App"
        - *my_version
  tasks:
  - name: Using Anchor value
    ansible.builtin.debug:
      msg: My app is called "{{ webapp.custom_name | join('-') }}".

Значение version было закреплено якорем &my_version и повторно использовано с помощью псевдонима *my_version. Якоря и псевдонимы позволяют обращаться к вложенным значениям внутри словарей.

См. также

Использование переменных

Всё о переменных

Обработка данных

Сложная обработка данных в Ansible

Общение

Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по общению сообщества Ansible

© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_advanced_syntax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API