Поиск по сайту:

Как работать с переменными и фактами Ansible. Часть 8


Мы упоминали переменные в этой серии статей об Ansible просто для того, чтобы немного подбодрить вас. Переменная, как и во многих языках программирования, по сути является ключом, представляющим значение.

Что представляет собой допустимое имя переменной?

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

Давайте рассмотрим несколько примеров допустимых и неприемлемых имен переменных:

Примеры допустимых имен переменных:

football 
foot_ball
football20 
foot_ball20

Примеры недопустимых имен переменных:

foot ball
20 
foot-ball

Давайте обсудим типы переменных:

1. Переменные игровой книги

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

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

Вот простой пример пьесы:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

В приведенном выше плейбуке переменная приветствие заменяется значением Hello world! при запуске плейбука. Playbook просто печатает сообщение Hello world! при выполнении.

Кроме того, вы можете иметь список или массив переменных, как показано:

В приведенной ниже книге показана переменная под названием континенты. Переменная содержит 5 разных значений — названий континентов. К каждому из этих значений можно легко получить доступ, используя индекс 0 в качестве первой переменной.

В приведенном ниже примере сборника сценариев извлекается и отображается Азия (индекс 1).

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

Список переменных может быть структурирован аналогичным образом, как показано:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Чтобы перечислить все элементы в списке, используйте модуль with_items. Это позволит перебрать все значения в массиве.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Другой тип переменных Ansible — переменная словарь.

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

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

В приведенном выше примере vlans — это словарная переменная, а id и port — пары ключ-значение.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Для port_id, поскольку мы начинаем значение с текста, а не с переменной, кавычки для фигурных скобок не нужны.

2. Специальные переменные

Ansible предоставляет список предопределенных переменных, на которые можно ссылаться в шаблонах и сборниках сценариев Jinja2, но которые не могут быть изменены или определены пользователем.

В совокупности список предопределенных переменных Ansible называется Фактами Ansible, и они собираются при выполнении книги сценариев.

Чтобы получить список всех переменных Ansible, используйте модуль setup в специальной команде Ansible, как показано ниже:

ansible -m setup hostname

Это отобразит вывод в формате JSON, как показано:

ansible -m setup localhost

Из вывода мы видим, что некоторые примеры специальных переменных Ansible включают:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Существует множество других специальных переменных Ansible, это всего лишь несколько примеров.

Эти переменные можно использовать в шаблоне Jinja2, как показано:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. Переменные инвентаря

Наконец, в списке у нас есть переменные инвентаря Ansible. Инвентаризация — это файл в формате INI, содержащий все хосты, которыми управляет Ansible.

В инвентарях вы можете назначить переменную хост-системе и позже использовать ее в книге сценариев.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

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

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

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

Например:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

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

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

А в файле плейбука YAML это будет определено, как показано:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Анзибль Факты

При запуске плейбуков первая задача, которую выполняет Ansible, — это выполнение задачи настройки. Я почти уверен, что вы, должно быть, столкнулись с выводом:

TASK:  [Gathering facts] *********

Ansible факты — это не что иное, как свойства системы или фрагменты информации об удаленных узлах, к которым вы подключились. Эта информация включает в себя архитектуру системы, версию ОС, информацию BIOS, системное время и дату, время безотказной работы системы, IP-адрес и информацию об оборудовании, и это лишь некоторые из них.

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

ansible -m setup hostname

Например:

ansible -m setup database_server

Это распечатает большой набор данных в формате JSON, как показано:

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

Пользовательские факты

Знаете ли вы также, что вы можете создавать свои собственные факты, которые можно собирать с помощью Ansible? Да, ты можешь. Так как же это сделать? Давайте переключим передачи и посмотрим, как это сделать.

Первым шагом является создание каталога /etc/ansible/facts.d на управляемом или удаленном узле.

Внутри этого каталога создайте файл(ы) с расширением .fact. Этот файл(ы) будет возвращать данные JSON, когда книга воспроизведения запускается на узле управления Ansible, что включает в себя другие факты, которые Ansible получает после запуска книги воспроизведения.

Вот пример пользовательского файла фактов под названием date_time.fact, который извлекает дату и время.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

Добавьте в него следующие строки.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Сохраните и выйдите из файла.

Теперь назначьте разрешения на выполнение:

chmod +x /etc/ansible/facts.d/date_time.fact

Теперь я создал сборник сценариев на узле управления Ansible под названием check_date.yml.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Добавьте файл фактов к переменной ansible_local. ansible_local хранит все пользовательские факты.

Теперь запустите playbook и посмотрите, как Ansible извлекает информацию, сохраненную в файле фактов:

ansible_playbook check_date.yml

Заключение

На этом мы подходим к концу этого руководства по работе с переменными и фактами Ansible.