Расширенный синтаксис
Примеры расширенного синтаксиса YAML на этой странице предоставляют вам больший контроль над данными, размещёнными в файлах YAML, используемых Ansible. Дополнительную информацию о Python-специфичном YAML вы можете найти в официальной документации PyYAML.
- Небезопасные или сырые строки
- Якорные и псевдонимы YAML: совместное использование значений переменных
Небезопасные или сырые строки
При обработке значений, возвращаемых плагинами lookup, Ansible использует тип данных unsafe, чтобы заблокировать шаблонизацию. Отметка данных как небезопасных предотвращает злоумышленникам использование шаблонов Jinja2 для выполнения произвольного кода на целевых машинах. Реализация Ansible гарантирует, что небезопасные значения никогда не будут шаблонизированы. Это более полное решение, чем экранирование Jinja2 с помощью тегов {% raw %} ... {% endraw %}.
Вы можете использовать тот же тип данных unsafe в переменных, которые вы определяете, чтобы предотвратить ошибки шаблонизации и раскрытие информации. Вы можете отметить значения, предоставленные vars_prompts, как небезопасные. Вы также можете использовать unsafe в playbooks. Наиболее распространённые случаи использования включают пароли, допускающие специальные символы, такие как { или %, и JSON-аргументы, которые выглядят как шаблоны, но не должны шаблонизироваться. Например:
---
mypassword: !unsafe 234%234{435lkj{{lkjsdf
В playbook:
---
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
- Список рассылки пользователей
-
У вас есть вопрос? Зайдите на форум!
- irc.freenode.net
-
Чат IRC-канала #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/user_guide/playbooks_advanced_syntax.html