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 и посмотреть результат.