You are here

Playbook: Переменные. Lesson 6

Linux: 

Ansible: Переменные. Урок 6

Использование переменных в Ansible позволяет расширить возможности при написании playbook. Начнем с самого простого. Для начала зайдем в файл hosts и посмотрим, что там указанно:

  1. [debi_servers]
  2. debi ansible_host=192.168.0.20 owner=ServerProd_N133

Тут переменная owner, внутри которой содержится текст: ServerProd_N133.

Использование debug – Print statements during execution

Теперь создадим новый файл:

  1. sudo nano newplaybook.yml

Начнем его заполнять:

  1. ---
  2. - name: My playbook
  3. hosts: all
  4. become: yes
  5.  
  6. vars:
  7. names1: svoi_text
  8. names2: bal bla bla
  9. codes: 8&*O&J&T^gu
  10.  
  11. tasks:
  12. - name: Print server
  13. debug:
  14. var: owner

Выполним этот playbook:

  1. ansible-playbook newplaybook.yml
  2.  
  3. PLAY [My playbook] *********************
  4.  
  5. TASK [Gathering Facts] ******************
  6. ok: [debi]
  7.  
  8. TASK [Print server] *********************
  9. ok: [debi] => {
  10. "owner": "ServerProd_N133"
  11. }
  12.  
  13. PLAY RECAP **************************
  14. debi : ok=2 changed=0 unreachable=0 failed=0

Что произошло? Мы указали переменную не из файла, а из файла hosts. А переменные в файле не тронули. Тем самым пример показывает, что переменные можно использовать не только из текущего файла. Конкретно этим примером, можно обозначит уникальные параметры для каждого сервера, в виде имени. Мы использовали "debug" с параметром "var" (ВНИМАНИЕ: в блоке var не не до указывать "" или {{ }}, она принимает чистую переменную).

Теперь поправим файл и добавим параметр msg (сообщение):

  1. ---
  2. - name: My playbook
  3. hosts: all
  4. become: yes
  5.  
  6. vars:
  7. names1: svoi_text
  8. names2: bal bla bla
  9. codes: 8&*O&J&T^gu
  10.  
  11. tasks:
  12. - name: Print server
  13. debug:
  14. var: owner
  15.  
  16. - name: Message
  17. debug:
  18. msg: "Luboi text v svobodnoy forme: {{ names2 }}"

Пояснение:
"- name: Print server" - мы использовали переменную "owner" уникальную для каждого сервера, из фала hosts.
"- name: Message" - "msg" позволяет указать текст и переменную. В нашем случае переменная "names2" равна "bal bla bla". Это говорит о том, что при запуске на нескольких серверах этого кода, переменная "names2" будет везде одинаковая.

Дополним файл hosts еще одним сервером:

  1. [debi_servers]
  2. debi ansible_host=192.168.0.20 owner=ServerProd_N133
  3. debi2 ansible_host=192.168.0.22 owner=ServerProd_N07

Запускаем и проверяем разницу:

  1. ansible-playbook newplaybook.yml
  2.  
  3. PLAY [My playbook] **********************
  4.  
  5. TASK [Gathering Facts] *******************
  6. ok: [debi]
  7. ok: [debi2]
  8.  
  9. TASK [Print server] **********************
  10. ok: [debi] => {
  11. "owner": "ServerProd_N133"
  12. }
  13. ok: [debi2] => {
  14. "owner": "ServerProd_N07"
  15. }
  16.  
  17. TASK [Message] ************************
  18. ok: [debi] => {
  19. "msg": "Luboi text v svobodnoy forme: bal bla bla"
  20. }
  21. ok: [debi2] => {
  22. "msg": "Luboi text v svobodnoy forme: bal bla bla"
  23. }
  24.  
  25. PLAY RECAP ***************************
  26. debi : ok=3 changed=0 unreachable=0 failed=0
  27. debi2 : ok=3 changed=0 unreachable=0 failed=0

Использование set_fact – Set host facts from a task
Создадим новую переменную, которая объединит все наши переменные ранее и выведем её способом указанным выше:

  1. ---
  2. - name: My playbook
  3. hosts: all
  4. become: yes
  5.  
  6. vars:
  7. names1: svoi_text
  8. names2: bal bla bla
  9. codes: 8&*O&J&T^gu
  10.  
  11. tasks:
  12. # Используя set_fact создаем новую переменную full_message
  13. - set_fact: full_message="{{ names1 }} {{ names2 }} {{ codes }} {{ owner }}"
  14.  
  15. # Чтобы вывести переменную full_message используем debug
  16. - debug:
  17. var: full_message

Запускаем:

  1. ansible-playbook newplaybook.yml
  2. ...
  3. *
  4. ok: [debi] => {
  5. "full_message": "svoi_text bal bla bla 8&*O&J&T^gu ServerProd_N133"
  6. }
  7. ...

Переменные из модуля setup

В статье: Ansible: ad-Hoc команды. Lesson 2 мы уже обсуждали команду:

  1. ansible all -m setup

Она позволяет вывести данные по серверам: множество полезных переменных. Вот небольшой кусок:

  1. debuser@debsv:/etc/ansible/playbooks$ ansible all -m setup | grep Debian
  2. "ansible_distribution": "Debian",
  3. "ansible_distribution_file_variety": "Debian",
  4. "description": "Debian GNU/Linux 10 (buster)",
  5. "id": "Debian",
  6. "ansible_os_family": "Debian"

Используем переменную "ansible_os_family":

  1. ---
  2. - name: My playbook
  3. hosts: all
  4. become: yes
  5.  
  6. tasks:
  7. - debug:
  8. var: ansible_os_family

Запускаем:

  1. ansible-playbook newplaybook.yml
  2. ...
  3. TASK [debug] ********************************
  4. ok: [debi] => {
  5. "ansible_os_family": "Debian"
  6. }
  7. ...

Использование переменной ansible_os_family, может быть полезной, для определения метода установки кода на определенной версии Linux. Так как для Debian используется apt, а для другой версии Linux примеру yum. Пример использования будет в следующих уроках.

Использование: register

Создадим новый код в нашем файле (пояснения в коде):

  1. ---
  2. - name: My playbook
  3. hosts: all
  4. become: yes
  5.  
  6. tasks:
  7. # модуль shell позволяющий запустить команду на удаленном сервере
  8. - shell: ls -la /home/debiuser/.ssh
  9. # В чистом виде мы не увидим результат так как он будет выполнен на удаленном сервере
  10. # Используем register, он позволит перенаправить ответ в переменную pereman_rez
  11. register: pereman_rez
  12.  
  13. # Чтобы вывести переменную pereman_rez у нас, используем debug
  14. - debug:
  15. var: pereman_rez

Выполним:

  1. ansible-playbook newplaybook.yml
  2.  
  3. PLAY [My playbook] ...
  4. ok: [debi] => {
  5. "pereman_rez": {
  6. ...
  7. "stdout_lines": [
  8. "итого 16",
  9. "drwx------ 2 debiuser debiuser 4096 окт 15 23:19 .",
  10. "drwxr-xr-x 16 debiuser debiuser 4096 окт 15 20:09 ..",
  11. "-rw------- 1 debiuser debiuser 116 сен 15 13:01 authorized_keys",
  12. "-rw-r--r-- 1 debiuser debiuser 222 окт 15 23:19 known_hosts"
  13. ]
  14. }
  15. }
  16.  
  17. ...
  18. debi : ok=3 changed=1 unreachable=0 failed=0

Тем самым мы можем выполнить команду на удаленном сервере и отразить её результат у нас, используя временную переменную.

Всем спасибо, кто прочитал.

Источник: http://linuxsql.ru