Шаблонизатор Jinja2 поддерживает фильтры - специальные функции, которые применяются к переменным и производят с ними какие-то изменения. Соответственно, и в Ansible этот механизм тоже используется:
- hosts: all
gather_facts: no
vars:
numbers: [3, 2, 1, 3, 2]
tasks:
- name: get min number
ansible.builtin.debug: msg={{ numbers | min }}
- name: get max number
ansible.builtin.debug: msg={{ numbers | max }}
- name: get unique values
ansible.builtin.debug: var={{ item }}
loop: "{{ numbers | unique }}"
- name: get random value
ansible.builtin.debug: msg={{ ['a', 'b', 'c'] | random }}
Здесь применяются различные фильтры к списку чисел (переменная numbers
):
min
находит минимальное значениеmax
находит максимальное значениеunique
находит уникальные значения (результатом является список, поэтому для вывода на печать используем цикл)random
позволяет выбрать случайное значение из списка
В документации Ansible есть еще с десяток похожих фильтров, которые ищут пересечение между списками, объединения и т.д.
При выполнении этого плейбука мы получим вот такой результат:
ansible-playbook playbook.yml -i inventory.ini
TASK [get min number] *************************
ok: [localhost] => {
"msg": "1"
}
TASK [get max number] *************************
ok: [localhost] => {
"msg": "3"
}
TASK [get unique values] **********************
ok: [localhost] => (item=numbers | unique) => {
"ansible_loop_var": "item",
"item": "numbers | unique",
"numbers | unique": [
3,
2,
1
]
}
TASK [get random value] ***********************
ok: [localhost] => {
"msg": "a"
}
Вот еще несколько примеров:
- hosts: all
gather_facts: no
vars:
path: /var/log/upstart/nginx.log
tasks:
- ansible.builtin.debug: msg={{ '192.0.2.1/24' | ipaddr('address') }}
- ansible.builtin.debug: msg={{ 'test1' | hash('sha1') }}
- ansible.builtin.debug: msg={{ path | basename }}
- ansible.builtin.debug: msg={{ path | dirname }}
- ansible.builtin.debug: msg={{ "~/Movies" | expanduser }}
Рассмотрим фильтры, которые мы использовали, более подробно:
- Фильтр
ipaddr
позволяет извлекать из ip-адреса различные части. Для его работы возможно придется установить дополнительный Python-пакет. В документации об этом написано - Фильтр
hash
создает хэш - Фильтры
basename
иdirname
работают с путями. С помощью них можно выделить имя файла и путь к директории expanduser
раскрывает тильды и делает подстановку
Запустите этот плейбук самостоятельно и изучите его вывод.
Самостоятельная работа
Воспользуемся простым фильтром, который приводит строку к верхнему регистру
- Создайте новую переменную, которая содержит строку
This is server web1!
, гдеweb1
это динамическое имя сервиса (взятое из фактов) - В шаблоне HTML файла templates/index.html.j2 Выведите сообщение в верхнем регистре с помощью фильтра
upper
.
- Создайте новую переменную, которая содержит строку
Также выведем текущую дату. Используйте факты, и выведите текущую дату в любом формате.
Залейте изменения на Github
В результате получится следующее:
<html lang="en"><head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<h2>THIS IS SERVER WEB1!</h2> <!-- Эта строка была приведена в верхний регистр с помощью фильтра -->
<small>Deployed at: Вт 21 дек 2021 20:18:03</small> <!-- Локализованная дата -->
</body>
</html>
Дополнительные материалы

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.