Сценарии использования Ansible Core#
В данном разделе представлено несколько примеров распространенных сценариев использования инструмента.
Автоматизация развертывания приложений#
Основные этапы автоматизации развертывания приложений с Ansible Core:
Подготовьте окружение:
Убедитесь, что Ansible Core установлен на управляющем сервере.
Настройте SSH-доступ к целевым серверам, чтобы Ansible Core мог выполнять команды удаленно.
Создайте файл inventory. Пример файла
inventory.ini:[webservers] web1.example.com web2.example.com [databases] db1.example.comСоздайте playbook. Пример содержимого файла
deploy.ymlдля развертывания веб-приложения:--- - name: Deploy web application hosts: webservers become: yes tasks: - name: Install required packages apt: name: - nginx - git - python3-pip state: present - name: Clone application repository git: repo: '<URL_address>' dest: /var/www/myapp - name: Install application dependencies pip: requirements: /var/www/myapp/requirements.txt - name: Start nginx service service: name: nginx state: started enabled: yesЗапустите playbook:
ansible-playbook -i inventory.ini deploy.ymlAnsible Core выполнит все задачи, указанные в playbook, на всех хостах, указанных в файле inventory.
Убедитесь, что playbook из шагов 3 и 4 отработал корректно. Пример playbook для мониторинга состояния запущенного приложения и сбора информации о системных ресурсах:
--- - name: Deploy web application hosts: webservers become: yes tasks: - name: Install required packages apt: name: - nginx - git - python3-pip state: present - name: Clone application repository git: repo: '<URL_address>' dest: /var/www/myapp - name: Install application dependencies pip: requirements: /var/www/myapp/requirements.txt - name: Start nginx service service: name: nginx state: started enabled: yes
Управление конфигурацией веб-серверов#
Пример сценария установки и настройки веб-сервера Nginx на группе серверов:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[webservers] server1.example.com server2.example.comСоздайте playbook для установки и настройки Nginx, например, файл
setup_nginx.yml:--- - name: Install and configure Nginx web server hosts: webservers become: yes tasks: - name: Install nginx package apt: name: nginx state: present update_cache: yes - name: Copy configuration file template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: Restart nginx - name: Start and enable nginx service service: name: nginx state: started enabled: yes handlers: - name: Restart nginx service: name: nginx state: restartedДанный playbook:
устанавливает пакет Nginx на целевых серверах;
копирует конфигурационный файл Nginx из шаблона
nginx.conf.j2в нужное место на сервере;запускает и включает службу Nginx, чтобы она автоматически запускалась при перезагрузке системы;
использует обработчик для перезапуска Nginx, если конфигурационный файл был изменен.
Создайте шаблон
nginx.conf.j2, который будет использоваться для генерации конфигурационного файла Nginx. Например:server { listen 80; server_name {{ ansible_hostname }}; location / { root /var/www/html; index index.html index.htm; } }Запустите playbook:
ansible-playbook -i inventory.ini setup_nginx.yml
Обновление систем#
Пример сценария для автоматизации обновления систем с помощью Ansible Core - обновления всех пакетов на серверах:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[sberlinux] sberlinux1.example.com sberlinux2.example.com [debian_ubuntu] debian1.example.com ubuntu1.example.comСоздайте playbook для обновления пакетов на серверах, например, файл
update_packages.yml:--- - name: Update all packages on SberLinux OS systems hosts: sberlinux become: yes tasks: - name: Upgrade all packages yum: name: '*' state: latest - name: Update all packages on Debian/Ubuntu systems hosts: debian_ubuntu become: yes tasks: - name: Update package cache apt: update_cache: yes - name: Upgrade all packages apt: upgrade: distЗапустите playbook:
ansible-playbook -i inventory.ini update_packages.ymlДанный playbook:
обновляет пакеты на серверах SberLinux OS до последних версий с использованием
yum;обновляет кеш пакетов и выполняет полное обновление всех установленных пакетов на серверах Debian и Ubuntu с использованием
apt.
(Опционально) при необходимости перезагрузки системы после обновления ядра добавьте следующую задачу в соответствующий раздел playbook:
- name: Reboot the system if kernel was updated reboot: msg: "Rebooting after kernel update" connect_timeout: 5 timeout: 300 when: ansible_kernel != ansible_kernel_latest
Управление пользователями и правами доступа#
Пример сценария управления пользователями и правами доступа с использованием Ansible Core, включающего создание пользователей, добавление их в группы и настройку прав доступа:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[webservers] server1.example.com server2.example.comСоздайте playbook для управления пользователями, например, файл
manage_users.yml:--- - name: Manage users and permissions hosts: webservers become: yes tasks: - name: Create a new user user: name: newuser state: present shell: /bin/bash groups: sudo password: "{{ '<password>' | <password_hash>('sha512') }}" - name: Create another user user: name: anotheruser state: present shell: /bin/bash groups: developers - name: Ensure the developers group exists group: name: developers state: present - name: Set up SSH access for newuser authorized_key: user: newuser state: present key: "{{ lookup('file', '<path_to_public_key>.pub') }}" - name: Change password for anotheruser user: name: anotheruser password: "{{ '<newpassword>' | <password_hash>('sha512') }}"Данный playbook:
создает нового пользователя
newuser, добавляет его в группуsudoи устанавливает пароль. Пароль хешируется с использованием SHA-512;создает второго пользователя
anotheruserи добавляет его в группуdevelopers;проверяет, существует ли группа
developers, и создает ее, если она отсутствует;добавляет публичный SSH-ключ для пользователя
newuser, чтобы обеспечить доступ по SSH;изменяет пароль для пользователя
anotheruser.
Запустите playbook:
ansible-playbook -i inventory.ini manage_users.yml
Мониторинг и сбор данных о состоянии серверов#
Пример сценария сбора данных о состоянии серверов, включая загрузку процессора, использование памяти и дискового пространства:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[monitoring_servers] server1.example.com server2.example.comСоздайте playbook для сбора данных, например, файл
monitoring.yml:--- - name: Monitor server status hosts: monitoring_servers gather_facts: no tasks: - name: Gather CPU load command: uptime register: cpu_load - name: Gather memory usage command: free -m register: memory_usage - name: Gather disk usage command: df -h register: disk_usage - name: Display CPU load debug: msg: "CPU Load: {{ cpu_load.stdout }}" - name: Display memory usage debug: msg: "Memory Usage: {{ memory_usage.stdout }}" - name: Display disk usage debug: msg: "Disk Usage: {{ disk_usage.stdout }}"В данном playbook:
задача
Gather CPU loadвыполняет командуuptime, которая возвращает информацию о загрузке процессора, и сохраняет результат в переменнойcpu_load;Gather memory usageвыполняет командуfree -m, которая показывает использование памяти, и сохраняет результат в переменнойmemory_usage;Gather disk usageвыполняет командуdf -h, которая показывает использование дискового пространства, и сохраняет результат в переменнойdisk_usage;Display CPU loadвыводит информацию о загрузке процессора;Display memory usageвыводит информацию об использовании памяти;Display disk usageвыводит информацию об использовании дискового пространства.
Запустите playbook:
ansible-playbook -i inventory.ini monitoring.yml
Оркестрация многосерверных развертываний#
Пример сценария развертывания веб-приложений на нескольких серверах, включая установку необходимых зависимостей, настройку веб-сервера и запуск приложения:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[webservers] webserver1.example.com webserver2.example.com [dbservers] dbserver1.example.comСоздайте playbook для развертывания приложения, например, файл
deploy_application.yml:--- - name: Deploy web application hosts: webservers become: yes tasks: - name: Install required packages apt: name: - nginx - python3-pip state: present update_cache: yes - name: Copy application files copy: src: <path_to_app> dest: /var/www/html/ owner: www-data group: www-data mode: '0755' - name: Start and enable nginx service: name: nginx state: started enabled: yes - name: Set up database hosts: dbservers become: yes tasks: - name: Install MySQL server apt: name: mysql-server state: present update_cache: yes - name: Create database mysql_db: name: myapp_db state: present - name: Create database user mysql_user: name: myapp_user password: <secure_password> priv: "myapp_db.*:ALL" state: presentВ данном playbook:
первая часть разворачивает веб-приложение на серверах из группы
webservers:задача
Install required packagesустанавливает необходимые пакеты, такие какnginxиpython3-pip;Copy application filesкопирует файлы приложения на веб-серверы;Start and enable nginxзапускает и включает Nginx;
вторая часть настраивает базу данных на серверах из группы
dbservers:задача
Install MySQL serverустанавливает сервер MySQL;Create databaseсоздает базу данных для приложения;Create database userсоздает пользователя базы данных с правами на созданную базу данных.
Запустите playbook:
ansible-playbook -i inventory.ini deploy_application.yml
Тестирование инфраструктуры#
Пример сценария проверки того, что необходимые пакеты установлены, службы запущены и конфигурационные файлы имеют правильные параметры:
Создайте файл
inventory.ini, в котором будут перечислены серверы. Например:[webservers] webserver1.example.com webserver2.example.comСоздайте playbook для тестирования инфраструктуры, например, файл
test_infrastructure.yml:--- - name: Test infrastructure hosts: webservers become: yes tasks: - name: Check if nginx is installed command: dpkg -l | grep nginx register: nginx_installed ignore_errors: yes - name: Assert nginx is installed assert: that: - nginx_installed.rc == 0 fail_msg: "Nginx is not installed on {{ inventory_hostname }}" - name: Check if nginx service is running service_facts: - name: Assert nginx service is running assert: that: - "'nginx' in services" - services['nginx'].state == 'running' fail_msg: "Nginx service is not running on {{ inventory_hostname }}" - name: Check if the configuration file exists stat: path: /etc/nginx/nginx.conf register: nginx_conf - name: Assert nginx configuration file exists assert: that: - nginx_conf.stat.exists fail_msg: "Nginx configuration file does not exist on {{ inventory_hostname }}" - name: Check if the web server is responding uri: url: http://localhost status_code: 200 register: web_response - name: Assert web server is responding assert: that: - web_response.status == 200 fail_msg: "Web server is not responding on {{ inventory_hostname }}"В данном playbook:
задача
Check if nginx is installedпроверяет, установлен ли Nginx, и сохраняет результат в переменнойnginx_installed;Assert nginx is installedиспользует модульassertдля проверки кода возврата предыдущей задачи. Если Nginx не установлен, будет выдано сообщение об ошибке;Check if nginx service is runningсобирает факты о службах, чтобы проверить состояние Nginx;Assert nginx service is runningпроверяет, что служба Nginx запущена;Check if the configuration file existsпроверяет, существует ли файл конфигурации Nginx;Assert nginx configuration file existsпроверяет код возврата предыдущей задачи. Если файл конфигурации не существует, будет выдано сообщение об ошибке;Check if the web server is respondingотправляет HTTP-запрос на локальный веб-сервер и проверяет, что он отвечает с кодом200;Assert web server is respondingпроверяет код возврата предыдущей задачи. Если веб-сервер не отвечает с указанным кодом, будет выдано сообщение об ошибке.
Запустите playbook:
ansible-playbook -i inventory.ini test_infrastructure.yml
Управление сетевыми устройствами#
Пример сценария по настройке маршрутизатора Cisco, включая создание VLAN, настройку интерфейсов и применение базовых параметров:
Создайте файл
inventory.ini, в котором будут перечислены сетевые устройства. Например:[cisco_routers] router1 ansible_host=<IP_address> ansible_user=admin ansible_password=<password> ansible_network_os=<OS>Создайте playbook для настройки сетевого устройства, например, файл
configure_network.yml:--- - name: Configure Cisco Router hosts: cisco_routers gather_facts: no tasks: - name: Create VLAN 10 ios_vlan: vlan_id: 10 name: "VLAN10" state: present - name: Create VLAN 20 ios_vlan: vlan_id: 20 name: "VLAN20" state: present - name: Configure interface for VLAN 10 ios_interface: name: GigabitEthernet0/1 description: "Uplink to VLAN 10" mode: access access_vlan: 10 state: up - name: Configure interface for VLAN 20 ios_interface: name: GigabitEthernet0/2 description: "Uplink to VLAN 20" mode: access access_vlan: 20 state: up - name: Set hostname ios_config: lines: - hostname Router1В данном playbook:
задача
Create VLAN 10создает VLAN с идентификатором 10 и именемVLAN10;Create VLAN 20создает VLAN с идентификатором 20 и именемVLAN20;Configure interface for VLAN 10настраивает интерфейсGigabitEthernet0/1как доступный дляVLAN10;Configure interface for VLAN 20настраивает интерфейсGigabitEthernet0/2как доступный дляVLAN20;Set hostnameустанавливает имя маршрутизатора -Router1.
Запустите playbook:
ansible-playbook -i inventory.ini configure_network.yml