MyTetra Share
Делитесь знаниями!
Переменные в Ansible
Время создания: 28.11.2019 11:34
Раздел: Компьютер - Linux - Оркестрация - Ansible
Запись: xintrea/mytetra_syncro/master/base/1574930040sahhnw05im/text.html на raw.github.com

Переменные можно создавать:


  • на уровне плейбука
  • на уровне задачи


Переменные могут быть описаны:


  • в виде встроенных в плейбук строк
  • в виде отдельного (подключаемого) файла
  • передаваться из командной строки при выполнении ansible или ansible-playbook



Переменные на уровне плейбука


Классический способ задать переменные плейбука:



---

- name: Run cfg commands on router

vars:

- var1: "http"

- var2: "httpd"


tasks:

- name: Task 1

...



Внимание! Переменные, созданные через vars, существуют только в рамках того блока (и подчиненных блоках), в котором они объявлены.


Можно создавать переменные на уровне плейбука, взятые из определенного файла:



---

- name: Run cfg commands on router

hosts: 192.168.100.1

gather_facts: false

connection: local

vars_files:

- vars/cisco_bgp_general.yml



Где cisco_bgp_general.yml - это файл, лежащий в подкаталоге ./vars.



Переменные на уровне задачи


Переменные на уровне задач могут быть созданы через модуль set_facts. В следующем примере показно создание переменной с именем oktet и ее последующее использование:



 - name: Получение 3-го октета IP-адреса

   shell: |

     cat /etc/network/interfaces | grep -P '^\s*address\s*\d*\.\d*\.\d*\.\d*' | grep -P -o '\d*\.\d*\s*$' | grep -P -o '^\d*'

   register: result


 - name: Обработка вывода команды получения 3-го октета IP-адреса

   set_fact: oktet="{{ result.stdout }}"


 - name: Получен 3-й октет IP-адреса

   debug:

     msg: '{{ oktet }}'



Модуль set_fact можно использовать для создания сразу нескольких переменных. Кроме того, можно создавать переменные-словари и переменные-списки.



- name: Создание переменных Ansible

set_fact:

simpleVar1: 12345

simpleVar2: "This is string"

varAsDict:

dictKey1: "Value for key 1"

dictKey2: "Value for key 2"

dictKey3: "Value for key 3"

varAsList:

- listValue1

- listValue2

- listValue3



Внимание! Переменные, созданные через set_fact, начинают существовать с момента их определения, и область видимости не зависят от иерархии блоков, в которых они создаются. По-сути, создаются факты - т. е. глобальные переменные, которые содержат какую-то информацию. Изменение значения данных переменных происходит по ходу выполнения ansible-кода. Эти переменные видны после создания и в подключаемых (include...) yml-файлах. То есть, их можно рассматривать просто как глобальные переменные в традиционных языках программирования.



Передача переменных из основного плейбука в подключаемый


В Ansible переменные в подключаемые плейбуки передаются автоматически. То есть, если задачи подключаются из другого файла через директиву include_tasks, то в подключаемом файле все перемененные основного файла доступны.


Подключение задач, расположенных в другом файле, происходит следующим образом:



basePlaybook.plb.yml


---

- hosts: ourHosts


vars:

userName: "vasya"

userConfigDir: "/home/{{ userName }}"


 tasks:

  - include_tasks: subSetVideomode.plb.yml



Сами задачи в дополнительном файле оформляются не как полноценный плейбук, а как просто набор задач:



subSetVideomode.plb.yml


- name: Создание директории автозапуска для пользователя {{ userName }}

 file:

    path: "{{ userConfigDir }}/autostart"

    state: directory

    owner: "{{ userName }}"

    group: "{{ userName }}"


- name: Создание команд настройки монитора

...



Передача переменных в подключаемый плейбук в цикле


Помимо автоматически пробрасываемых переменных, в подключаемый плейбук можно передать переменные из списка через цикл. При каждой итерации цикла будет вызываться плейбук с переменной цикла, в которой будет находиться итерируемое значение.


В следующем примере происходит последовательный вызов подчиненного плейбука по строкам списка, причем каждая строка представляет из себя массив переменных:



basePlaybook.plb.yml


---

- hosts: ourHosts

 tasks:

 - include_tasks: ../subroutine/subSetVideomode.plb.yml

   loop:

     - [ "user",      "/home/user/.config" ]

     - [ "teacher", "/home/teacher/.config" ]

     - [ "root",      "/root/.config" ]

   loop_control:

       loop_var: userData



subSetVideomode.plb.yml


---

- name: Получение параметров пользователя

 set_fact:

   userName:       "{{ userData[0] }}"

   userConfigDir:  "{{ userData[1] }}"


- name: Создание директории автозапуска для команд установки видеорежима

 file:

   path: "{{ userConfigDir }}/autostart"

   state: directory

   owner: "{{ userName }}"

   group: "{{ userName }}"



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования