Ansible - переменные
Переменные в playbooks very similarиспользовать переменные на любом языке программирования. Это помогает вам использовать и присваивать значение переменной и использовать его в любом месте учебника. Можно поставить условия вокруг значения переменных и, соответственно, использовать их в playbook.
пример
- hosts : <your hosts>
vars:
tomcat_port : 8080
В приведенном выше примере мы определили имя переменной tomcat_port и присвоил этой переменной значение 8080 и может использовать это в своей книге где угодно.
Теперь возьмем ссылку из приведенного примера. Следующий код взят из одной из ролей (install-tomcat) -
block:
- name: Install Tomcat artifacts
action: >
yum name = "demo-tomcat-1" state = present
register: Output
always:
- debug:
msg:
- "Install Tomcat artifacts task ended with message: {{Output}}"
- "Installed Tomcat artifacts - {{Output.changed}}"
Здесь вывод - это используемая переменная.
Давайте пройдемся по всем ключевым словам, использованным в приведенном выше коде -
block - Ответственный синтаксис для выполнения заданного блока.
name - Соответствующее имя блока - используется в журнале и помогает в отладке того, все блоки которого были успешно выполнены.
action- Код рядом с тегом действия - это задача, которую нужно выполнить. Действие снова является ключевым словом Ansible, используемым в yaml.
register - Вывод действия регистрируется с использованием ключевого слова register, а Output - это имя переменной, которая содержит вывод действия.
always - Снова ключевое слово Ansible, в нем указано, что ниже всегда будет выполняться.
msg - Отображает сообщение.
Использование переменной - {{Выход}}
Это прочитает значение переменной Output. Также, поскольку он используется на вкладке msg, он будет печатать значение выходной переменной.
Кроме того, вы также можете использовать дополнительные свойства переменной. Как и в случае с проверкой {{Output.changed}}, изменился ли вывод, и соответственно использовать его.
Обработка исключений в Playbooks
Обработка исключений в Ansible аналогична обработке исключений в любом языке программирования. Пример обработки исключений в playbook показан ниже.
tasks:
- name: Name of the task to be executed
block:
- debug: msg = 'Just a debug message , relevant for logging'
- command: <the command to execute>
rescue:
- debug: msg = 'There was an exception.. '
- command: <Rescue mechanism for the above exception occurred)
always:
- debug: msg = "this will execute in all scenarios. Always will get logged"
Ниже приведен синтаксис обработки исключений.
rescue а также always - ключевые слова, относящиеся к обработке исключений.
Блок - это место, где написан код (все, что нужно выполнить на машине Unix).
Если команда, записанная внутри функции блока, терпит неудачу, то выполнение достигает блока восстановления и выполняется. Если в команде в блокировке нет ошибки, то спасение не будет выполнено.
Always выполняется во всех случаях.
Итак, если мы сравним то же самое с java, то это похоже на попытку, поймать и, наконец, заблокировать.
Вот, Block похож на try block где вы пишете код для выполнения и rescue похож на catch block а также always похож на finally.
Петли
Ниже приведен пример, демонстрирующий использование циклов в Ansible.
Задача состоит в том, чтобы скопировать набор всех файлов war из одного каталога в папку tomcat webapps.
Большинство команд, используемых в приведенном ниже примере, уже рассматривались ранее. Здесь мы сосредоточимся на использовании петель.
Изначально в команде shell мы сделали ls * .war. Таким образом, он перечислит все файлы войны в каталоге.
Вывод этой команды находится в переменной с именем output.
Для цикла используется синтаксис with_items.
with_items: "{{output.stdout_lines}}" -> output.stdout_lines дает нам построчный вывод, а затем мы перебираем вывод с помощью команды with_items из Ansible.
Прилагаю пример вывода, чтобы вы поняли, как мы использовали stdout_lines в команде with_items.
---
#Tsting
- hosts: tomcat-node
tasks:
- name: Install Apache
shell: "ls *.war"
register: output
args:
chdir: /opt/ansible/tomcat/demo/webapps
- file:
src: '/opt/ansible/tomcat/demo/webapps/{{ item }}'
dest: '/users/demo/vivek/{{ item }}'
state: link
with_items: "{{output.stdout_lines}}"
Блоки
Игра в целом разбита на блоки. Наименьший этап выполнения записывается в блоке. Написание конкретной инструкции в блоках помогает разделить функциональность и при необходимости обработать ее с помощью обработки исключений.
Примеры блоков описаны выше в использовании переменных, обработке исключений и циклах.
Условные
Условные выражения используются там, где нужно выполнить определенный шаг на основе условия.
---
#Tsting
- hosts: all
vars:
test1: "Hello Vivek"
tasks:
- name: Testing Ansible variable
debug:
msg: "Equals"
when: test1 == "Hello Vivek"
В этом случае будет напечатано Equals, поскольку переменная test1 равна, как указано в условии when. when может использоваться с логическим ИЛИ и логическим условием И, как и во всех языках программирования.
Просто измените значение переменной test1 из Hello Vivek, чтобы сказать Hello World и посмотреть результат.