paint-brush
Ansible 101: работа с фактами и шаблонамик@cloudkungfu
903 чтения
903 чтения

Ansible 101: работа с фактами и шаблонами

к cloud-kung-fu4m2024/01/30
Read on Terminal Reader

Слишком долго; Читать

Ansible использует переменные, факты и шаблоны для создания адаптируемых рабочих процессов автоматизации. Переменные обеспечивают динамическое управление конфигурацией, факты предоставляют информацию, специфичную для системы, а шаблоны создают настраиваемые файлы конфигурации. Такой подход гарантирует возможность многократного использования и гибкость плейбуков в различных средах.
featured image - Ansible 101: работа с фактами и шаблонами
cloud-kung-fu HackerNoon profile picture
0-item

В Ansible переменные и факты, а также шаблоны являются основными инструментами для создания гибких рабочих процессов автоматизации. Переменные позволяют вам динамически управлять конфигурациями и изменять их. Факты — это особое подмножество переменных, которые Ansible собирает из удаленных систем, предоставляя информацию, зависящую от контекста.


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


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

Переменные и факты

Переменные позволяют изменять параметры без изменения основной логики playbook.

Как факты, переменные и шаблоны работают вместе

  • Типы переменных:
    • Логическое значение: значения True или False.

    • Список: упорядоченный набор предметов.

    • Словарь: пары ключ-значение для сложных структур данных.

    • Зарегистрированные переменные: фиксирует выходные данные задач для дальнейшего использования в вашей книге действий.

    • Факты: переменные, собираемые автоматически, которые предоставляют подробную информацию об удаленных системах, которыми вы управляете.


NB: Избегайте конфликтов в именах переменных, используя скобки.


 - name: Print the distribution of the target hosts: all vars: curr_time: "{{ now() }}" tasks: - name: Distro Check ansible.builtin.debug: msg: "The target system is {{ ansible_facts['distribution'] }}. Timestamp: {{ curr_time }}"

Шаблоны и файлы

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


 - name: Write distro name hosts: all tasks: - name: Write distro name ansible.builtin.template: src: distro.j2 dest: /root/distro.txt mode: '644' # src: location of jinja2 template file # dest: location it will be copied to # permissions that will be granted to the file

Упражняться

Мы собираемся использовать семейство ОС, чтобы определить, следует ли устанавливать NGINX из Lighttpd, а затем развернем на удаленном хосте пользовательскую домашнюю страницу, содержащую NGINX, без жесткого кодирования имен хостов.


  1. Клонируйте репо.
 git clone https://github.com/perplexedyawdie/ansible-learn.git


2. Перейдите в каталог «Факты и шаблоны».

 cd ansible-learn/facts-and-templates


3. Разверните среду с помощью docker-compose

 docker compose up -d --build


4. Подключение к серверу Ansible по SSH.

 ssh -o StrictHostKeyChecking=no -o NoHostAuthenticationForLocalhost=yes root@localhost -p 2200 # password: test123

Переменные и факты

5. Создайте плейбук с именем server_setup.yaml . Здесь мы настроим NGINX и Lighttpd, а затем выведем имя дистрибутива для каждого удаленного хоста.


 - name: Install NGINX on Debian & Lighttpd on RedHat hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Install NGINX for Debian-based systems ansible.builtin.apt: name: nginx state: present when: ansible_facts['os_family'] == dev1 - name: Install Lighttpd for RedHat-based systems ansible.builtin.yum: name: lighttpd state: present when: ansible_facts['os_family'] == dev2 - name: Display the distribution ansible.builtin.debug: msg: "The server is running {{ ansible_facts['distribution'] }}"


6. Запустите ansible-lint.

 ansible-lint server_setup.yaml


7. Запустите плейбук.

 ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml server_setup.yaml


8. Подтвердите, что установка прошла успешно.

 ssh -i /root/.ssh/id_rsa_ansible root@server3 nginx -V ssh -i /root/.ssh/id_rsa_ansible root@server2 lighttpd -v ssh -i /root/.ssh/id_rsa_ansible root@server1 lighttpd -v

Шаблоны и файлы

9. Создайте файл шаблона Jinja2 с именем index.html.j2


Он будет автоматически заполнен семейством и дистрибутивом ОС.


 <html> <head> <title>Welcome to {{ ansible_facts['os_family'] }}</title> </head> <body> <h1>Server running on {{ ansible_facts['distribution'] }}</h1> </body> </html>


10. Создайте сборник сценариев custom_homepage.yaml.


Мы развертываем созданную выше пользовательскую домашнюю страницу в NGINX, а затем перезагружаем сервер.


 - name: Deploy Custom Homepage and restart hosts: all vars: dev1: "Debian" dev2: "RedHat" tasks: - name: Create Homepage with Jinja2 Template for NGINX ansible.builtin.template: src: index.html.j2 dest: /var/www/html/index.html mode: '644' when: ansible_facts['os_family'] == dev1 notify: restart nginx handlers: - name: Restart NGINX listen: "restart nginx" ansible.builtin.service: name: nginx state: restarted when: ansible_facts['os_family'] == dev1


11. Запускаем линтер.

 ansible-lint custom_homepage.yaml


12. Запустите плейбук.

 ansible-playbook --key-file /root/.ssh/id_rsa_ansible -u root -i inventory.yaml custom_homepage.yaml


13. Подтвердите развертывание, посетив http://localhost:2203 в своем браузере.

Резюме

Потрясающее усилие! 🙌 Мы научились использовать переменные и факты в сборнике пьес, а также создавать динамические файлы с помощью шаблонов. Далее мы рассмотрим модульность и обработку ошибок. А пока, береги себя!