Перейти к основному контенту

Ansible

Задание 0. Построение стенда

Схема виртуального лабораторного стенда

Рисунок 1. Схема стенда

1. Создать виртуальный стенд для работы

Название виртуальной машины Источник Тип инстанса Сети для внешнего подключения Размер диска
Ansible Образ-Ubuntu-server20.04 small external-net 15GB
node1 Образ-Ubuntu-server20.04 small external-net 15GB
node2 Образ-CentOS-7 small external-net 15GB

2. Установить ANSIBLE

PIP

  1. Проверить наличие python на узле:
    python3 -v
    
  2. При отсутствии python, его необходимо установить:
    sudo apt install python3
    
  3. Проверяем наличие менеджера пакетов pip:
    python3 -m pip --version
    
  4. При отсутствии pip, его необходимо установить:
    sudo apt install python3-pip
    

При наличии python с менеджером пакетов pip, можно установить используя его.

Для установки с помощью pip необходимо ввести команду

python3 -m pip install --user ansible

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

python3 -m pip install --user ansible-core

Ansible и Ansible Core тесно связаны, но есть небольшая разница между ними. Ansible Core представляет собой базовый движок автоматизации, который включает основные функции управления конфигурациями и выполнения задач через SSH. Он является основой для всей экосистемы Ansible. С другой стороны, Ansible как платформа включает в себя не только ядро, но и дополнительные инструменты, модули, плагины и библиотеки, расширяющие функциональность и возможности автоматизации. Таким образом, Ansible Core представляет собой базовую часть, в то время как Ansible включает в себя эту базу и дополнительные компоненты для расширения функциональности и упрощения управления инфраструктурой.

Ubuntu

Для установки на Ubuntu можно использовать стандартный менеджер пакетов apt

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Debian

Так-как репозиторий debian стал deprecated, возможно использование обходных путей для установки пакета

Debian Ubuntu UBUNTU_CODENAME
Debian 12 (Bookworm) Ubuntu 22.04 (Jammy) jammy
Debian 11 (Bullseye) Ubuntu 20.04 (Focal) focal
Debian 10 (Buster) Ubuntu 18.04 (Bionic) bionic

Пример для Debian12

UBUNTU_CODENAME=jammy

wget -O- "https://keyserver.ubuntu.com/pks/lookup?fingerprint=on&op=get&search=0x6125E2A8C77F2818FB7BD15B93C4A3FD7BB9C367" | sudo gpg --dearmour -o /usr/share/keyrings/ansible-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/ansible-archive-keyring.gpg] http://ppa.launchpad.net/ansible/ansible/ubuntu $UBUNTU_CODENAME main" | sudo tee /etc/apt/sources.list.d/ansible.list

sudo apt update && sudo apt install ansible

Проверка установки ansible

ansible --version

3. Минимальная настройка ANSIBLE

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

  1. ANSIBLE_CONFIG (переменная окружения)

  2. ansible.cfg (в текущем каталоге, откуда происходит запуск)

  3. ~/.ansible.cfg (в домашнем каталоге пользователя)

  4. /etc/ansible/ansible.cfg

    В ходе работы мы предлагаем такой конфиг, разместив его в домашней директории

    [defaults]
    # Отключение проверки хостовых ключей SSH.Это позволяет Ansible подключаться к хостам без подтверждения их хостовых ключей.
    host_key_checking   = False
    # Настройка метода сбора информации о системе хоста. "smart" означает автоматически определить наилучший метод, исходя из условий.
    gathering           = smart
    # Указание метода передачи данных между хостами. 
    transfer_method     = piped
    # Настройка параметров SSH.
    ssh_args            = "-o ControlMaster=auto -o ControlPersist=60s"
    # Максимальное количество параллельных процессов (форков) Ansible.Это определяет, сколько хостов может обрабатываться параллельно. 
    forks               = 20
    

    Тут представлена малая часть параметров которые можно использовать, полный список можно получить в документации https://docs.ansible.com/ansible/latest/reference_appendices/config.html

4. Написание инвентори

Ansible использует файлы инвентаря для определения групп хостов и их параметров. Создайте файл inventory.ini и определите в нем хосты, с которыми будет взаимодействовать Ansible:

[web]
# Добавление узла  с именем web и ip адресом 172.17.5.5
node1 ansible_host=172.17.5.5

[all:vars]
# Добавление общей переменной для всех хостов в inventory, с указанием общего имени пользователя
ansible_user    =   cloudadmin

Проверить inventory, можно использовав встроенный модуль ansible ping:

ansible -i inventory.ini all -m ping 

Пример валидного ответа

Валидная проверка

Также можно получить всю существующую информацию об хостах:

ansible -i inventory.ini all -m setup 

Установить пакет git используя модуль apt:

ansible all -i inventory.ini -m apt -a "name=git state=present" --become

Опция --become в командах Ansible используется для выполнения задач с привилегиями суперпользователя (обычно root). Грубо говоря как использования sudo при работе в терминале.

Выполнить команду ss -tulpan на удаленных узлах:

ansible all -i inventory.ini -m command -a "ss -tulpan" --become

5. Написание плейбуков

Плейбуки в Ansible - это текстовые файлы в формате YAML, которые содержат описание задач, которые должны быть выполнены на целевых хостах. Их основное предназначение - автоматизация конфигурации и управления системами. Попробуем написать простой плейбук и будем его пополнять в процессе работы:

---
- name: Update packages
  hosts: node
  become: yes
  tasks:
  - name: Update all packages 
    apt: 
      update_cache: yes
      upgrade: 'yes'

Для выполнения плейбука можно выполнить команду:

ansible-playbook playbook.yaml -i inventory.ini

Пример того, когда при выполнение плейбука обновляются пакеты: Пример выполнения плейбука, когда пакеты не были обновлены:

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

---
- name: Update packages
  hosts: node
  become: yes
  tasks:
  - name: Update all packages 
    apt: 
      update_cache: yes
      upgrade: 'yes'
  - name: Install nginx
    ansible.builtin.apt:
      package:
        -  nginx
      state: present
      update_cache: yes
  - name: Copy config nginx
    ansible.builtin.template:
      src:  nginx.conf
      dest: /etc/nginx/nginx.conf

Также можно заметить, что в последней строке происходит копирования файлов, нам необходимо создать файл nginx.conf и заполнить его:

user  {{ nginx_user }};
worker_processes  2048;
worker_priority     -1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
  worker_connections  auto;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout  65;
  reset_timedout_connection  on;
  client_body_timeout        35;
  send_timeout               30;
  gzip on;
  gzip_min_length     1000;
  gzip_vary on;
  gzip_proxied        expired no-cache no-store private auth;
  gzip_types          text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    gzip_disable        "msie6";
  types_hash_max_size 2048;
  client_max_body_size 512m;
  proxy_buffer_size   64k;
  proxy_buffers   4 64k;
  proxy_busy_buffers_size   64k;
  server_names_hash_bucket_size 64;
  include /etc/nginx/modules-enabled/*.conf;
  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

Можно заметить, что в данном конфигурационном файле мы начинаем использовать переменные.Переменных могло быть и больше, но для демонстрации их использования, вполне, достаточно. Сами переменные заключены в двойные фигурные скобки и были нами определены в файле инвентори в данном случае (переменная nginx_user, будет определена в настройках плейбука инвентори, тк будет зависиеть от установленной системы, так как для каждого типа операционной системы она должна быть своя).
Модифицируем наш инвентори и добавим второй узел и переменые среды для node1:

[node]
node1 ansible_host=172.17.5.5 nginx_user=www-data
node2 ansible_host=172.17.5.6 nginx_user=root

[all:vars]
ansible_user    =   cloudadmin

Выполним плейпбук

ansible-playbook playbook.yaml -i inventory.ini

Во время, выполнения мы можем увидеть ошибку, связанную с тем, что centos использует yum, а не apt, как и все redhart семейство:

Для того, чтобы сделать плейбук более универсальным, нам необходимо добавить условия и сделать установку для семейства redhat и тогда плейбук, будет выглядеть так:

---
- name: Update packages
  hosts: node
  become: yes
  tasks:
  - name: Install nginx "Debian"
    ansible.builtin.apt:
      package:
        -  nginx
      state: present
      update_cache: yes
    when: ansible_facts['os_family'] == "Debian"
  - name: Install nginx "redhat"
    ansible.builtin.yum:
      name:
        -  nginx
      state: present
    when: ansible_facts['os_family'] == "RedHat"
  - name: Copy config nginx
    ansible.builtin.template:
      src:  nginx.conf
      dest: /etc/nginx/nginx.conf