Использование переменных в Ansible позволяет расширить возможности при написании playbook. Начнем с самого простого. Для начала зайдем в файл hosts и посмотрим, что там указанно:
[debi_servers] debi ansible_host=192.168.0.20 owner=ServerProd_N133
Тут переменная owner, внутри которой содержится текст: ServerProd_N133.
Использование debug – Print statements during execution
Теперь создадим новый файл:
sudo nano newplaybook.yml
Начнем его заполнять:
--- - name: My playbook hosts: all become: yes vars: names1: svoi_text names2: bal bla bla codes: 8&*O&J&T^gu tasks: - name: Print server debug: var: owner
Выполним этот playbook:
ansible-playbook newplaybook.yml PLAY [My playbook] ********************* TASK [Gathering Facts] ****************** ok: [debi] TASK [Print server] ********************* ok: [debi] => { "owner": "ServerProd_N133" } PLAY RECAP ************************** debi : ok=2 changed=0 unreachable=0 failed=0
Что произошло? Мы указали переменную не из файла, а из файла hosts. А переменные в файле не тронули. Тем самым пример показывает, что переменные можно использовать не только из текущего файла. Конкретно этим примером, можно обозначит уникальные параметры для каждого сервера, в виде имени. Мы использовали "debug" с параметром "var" (ВНИМАНИЕ: в блоке var не не до указывать "" или {{ }}, она принимает чистую переменную).
Теперь поправим файл и добавим параметр msg (сообщение):
--- - name: My playbook hosts: all become: yes vars: names1: svoi_text names2: bal bla bla codes: 8&*O&J&T^gu tasks: - name: Print server debug: var: owner - name: Message debug: msg: "Luboi text v svobodnoy forme: {{ names2 }}"
Пояснение:
"- name: Print server" - мы использовали переменную "owner" уникальную для каждого сервера, из фала hosts.
"- name: Message" - "msg" позволяет указать текст и переменную. В нашем случае переменная "names2" равна "bal bla bla". Это говорит о том, что при запуске на нескольких серверах этого кода, переменная "names2" будет везде одинаковая.
Дополним файл hosts еще одним сервером:
[debi_servers] debi ansible_host=192.168.0.20 owner=ServerProd_N133 debi2 ansible_host=192.168.0.22 owner=ServerProd_N07
Запускаем и проверяем разницу:
ansible-playbook newplaybook.yml PLAY [My playbook] ********************** TASK [Gathering Facts] ******************* ok: [debi] ok: [debi2] TASK [Print server] ********************** ok: [debi] => { "owner": "ServerProd_N133" } ok: [debi2] => { "owner": "ServerProd_N07" } TASK [Message] ************************ ok: [debi] => { "msg": "Luboi text v svobodnoy forme: bal bla bla" } ok: [debi2] => { "msg": "Luboi text v svobodnoy forme: bal bla bla" } PLAY RECAP *************************** debi : ok=3 changed=0 unreachable=0 failed=0 debi2 : ok=3 changed=0 unreachable=0 failed=0
Использование set_fact – Set host facts from a task
Создадим новую переменную, которая объединит все наши переменные ранее и выведем её способом указанным выше:
--- - name: My playbook hosts: all become: yes vars: names1: svoi_text names2: bal bla bla codes: 8&*O&J&T^gu tasks: # Используя set_fact создаем новую переменную full_message - set_fact: full_message="{{ names1 }} {{ names2 }} {{ codes }} {{ owner }}" # Чтобы вывести переменную full_message используем debug - debug: var: full_message
Запускаем:
ansible-playbook newplaybook.yml ... * ok: [debi] => { "full_message": "svoi_text bal bla bla 8&*O&J&T^gu ServerProd_N133" } ...
Переменные из модуля setup
В статье: Ansible: ad-Hoc команды. Lesson 2 мы уже обсуждали команду:
ansible all -m setup
Она позволяет вывести данные по серверам: множество полезных переменных. Вот небольшой кусок:
debuser@debsv:/etc/ansible/playbooks$ ansible all -m setup | grep Debian "ansible_distribution": "Debian", "ansible_distribution_file_variety": "Debian", "description": "Debian GNU/Linux 10 (buster)", "id": "Debian", "ansible_os_family": "Debian"
Используем переменную "ansible_os_family":
--- - name: My playbook hosts: all become: yes tasks: - debug: var: ansible_os_family
Запускаем:
ansible-playbook newplaybook.yml ... TASK [debug] ******************************** ok: [debi] => { "ansible_os_family": "Debian" } ...
Использование переменной ansible_os_family, может быть полезной, для определения метода установки кода на определенной версии Linux. Так как для Debian используется apt, а для другой версии Linux примеру yum. Пример использования будет в следующих уроках.
Использование: register
Создадим новый код в нашем файле (пояснения в коде):
--- - name: My playbook hosts: all become: yes tasks: # модуль shell позволяющий запустить команду на удаленном сервере - shell: ls -la /home/debiuser/.ssh # В чистом виде мы не увидим результат так как он будет выполнен на удаленном сервере # Используем register, он позволит перенаправить ответ в переменную pereman_rez register: pereman_rez # Чтобы вывести переменную pereman_rez у нас, используем debug - debug: var: pereman_rez
Выполним:
ansible-playbook newplaybook.yml PLAY [My playbook] ... ok: [debi] => { "pereman_rez": { ... "stdout_lines": [ "итого 16", "drwx------ 2 debiuser debiuser 4096 окт 15 23:19 .", "drwxr-xr-x 16 debiuser debiuser 4096 окт 15 20:09 ..", "-rw------- 1 debiuser debiuser 116 сен 15 13:01 authorized_keys", "-rw-r--r-- 1 debiuser debiuser 222 окт 15 23:19 known_hosts" ] } } ... debi : ok=3 changed=1 unreachable=0 failed=0
Тем самым мы можем выполнить команду на удаленном сервере и отразить её результат у нас, используя временную переменную.
Всем спасибо, кто прочитал.
Источник: http://linuxsql.ru