Сценарии использования Ansible Core#

В данном разделе представлено несколько примеров распространенных сценариев использования инструмента.

Автоматизация развертывания приложений#

Основные этапы автоматизации развертывания приложений с Ansible Core:

  1. Подготовьте окружение:

    • Убедитесь, что Ansible Core установлен на управляющем сервере.

    • Настройте SSH-доступ к целевым серверам, чтобы Ansible Core мог выполнять команды удаленно.

  2. Создайте файл inventory. Пример файла inventory.ini:

    [webservers]
    web1.example.com
    web2.example.com
    
    [databases]
    db1.example.com
    
  3. Создайте 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
    
  4. Запустите playbook:

    ansible-playbook -i inventory.ini deploy.yml
    

    Ansible Core выполнит все задачи, указанные в playbook, на всех хостах, указанных в файле inventory.

  5. Убедитесь, что 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 на группе серверов:

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

    [webservers]
    server1.example.com
    server2.example.com
    
  2. Создайте 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, если конфигурационный файл был изменен.

  3. Создайте шаблон nginx.conf.j2, который будет использоваться для генерации конфигурационного файла Nginx. Например:

    server {
        listen 80;
        server_name {{ ansible_hostname }};
    
        location / {
            root /var/www/html;
            index index.html index.htm;
        }
    }
    
  4. Запустите playbook:

    ansible-playbook -i inventory.ini setup_nginx.yml
    

Обновление систем#

Пример сценария для автоматизации обновления систем с помощью Ansible Core - обновления всех пакетов на серверах:

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

     [sberlinux]
     sberlinux1.example.com
     sberlinux2.example.com
    
     [debian_ubuntu]
     debian1.example.com
     ubuntu1.example.com
    
  2. Создайте 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
    
  3. Запустите playbook:

    ansible-playbook -i inventory.ini update_packages.yml
    

    Данный playbook:

    • обновляет пакеты на серверах SberLinux OS до последних версий с использованием yum;

    • обновляет кеш пакетов и выполняет полное обновление всех установленных пакетов на серверах Debian и Ubuntu с использованием apt.

  4. (Опционально) при необходимости перезагрузки системы после обновления ядра добавьте следующую задачу в соответствующий раздел 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, включающего создание пользователей, добавление их в группы и настройку прав доступа:

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

    [webservers]
    server1.example.com
    server2.example.com
    
  2. Создайте 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.

  3. Запустите playbook:

    ansible-playbook -i inventory.ini manage_users.yml
    

Мониторинг и сбор данных о состоянии серверов#

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

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

    [monitoring_servers]
    server1.example.com
    server2.example.com
    
  2. Создайте 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 выводит информацию об использовании дискового пространства.

  3. Запустите playbook:

    ansible-playbook -i inventory.ini monitoring.yml
    

Оркестрация многосерверных развертываний#

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

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

    [webservers]
    webserver1.example.com
    webserver2.example.com
    
    [dbservers]
    dbserver1.example.com
    
  2. Создайте 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 создает пользователя базы данных с правами на созданную базу данных.

  3. Запустите playbook:

    ansible-playbook -i inventory.ini deploy_application.yml
    

Тестирование инфраструктуры#

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

  1. Создайте файл inventory.ini, в котором будут перечислены серверы. Например:

    [webservers]
    webserver1.example.com
    webserver2.example.com
    
  2. Создайте 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 проверяет код возврата предыдущей задачи. Если веб-сервер не отвечает с указанным кодом, будет выдано сообщение об ошибке.

  3. Запустите playbook:

    ansible-playbook -i inventory.ini test_infrastructure.yml
    

Управление сетевыми устройствами#

Пример сценария по настройке маршрутизатора Cisco, включая создание VLAN, настройку интерфейсов и применение базовых параметров:

  1. Создайте файл inventory.ini, в котором будут перечислены сетевые устройства. Например:

    [cisco_routers]
    router1 ansible_host=<IP_address> ansible_user=admin ansible_password=<password> ansible_network_os=<OS>
    
  2. Создайте 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.

  3. Запустите playbook:

    ansible-playbook -i inventory.ini configure_network.yml