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

Как установить и настроить Ansible в Ubuntu 22.04


Это руководство существует для этих версий ОС

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 18.04 (Bionic Beaver)

На этой странице

  1. Предпосылки
  2. Шаг 1. Установите Ansible
  3. Шаг 2. Настройка файла инвентаризации
    1. Организация серверов в группы и подгруппы

    1. Настройка ключей SSH на узлах с существующим открытым ключом

    1. Проверьте использование диска
    2. Нацеливание на отдельные хосты и группы
    3. Обновить все серверы

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

    В этом руководстве мы узнаем, как установить и настроить Ansible на сервере Ubuntu 22.04.

    Предпосылки

    • Две или более серверные системы под управлением Ubuntu 22.04 с установленным сервером OpenSSH.
    • И сервер, и узлы доступны через общедоступные IP-адреса.
    • Пользователь без полномочий root с привилегиями sudo настроен на сервере Ansible, а пользователь root с паролем настроен на клиентах Ansible.

    Шаг 1 — Установите Ansible

    Мы будем использовать официальный репозиторий Ansibles для установки его последней версии. Добавьте официальный репозиторий Ansibles на сервер.

    $ sudo add-apt-repository ppa:ansible/ansible
    

    К счастью, Ubuntu поставляется с Ansible 2.9, которую мы и установим. Выполните следующую команду, чтобы установить Ansible.

    $ sudo apt install ansible -y
    

    Проверьте свою установку, выполнив следующую команду.

    $ ansible --version
    ansible [core 2.13.3rc1]
      config file = /etc/ansible/ansible.cfg
      configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python3/dist-packages/ansible
      ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections
      executable location = /usr/bin/ansible
      python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
      jinja version = 3.0.3
      libyaml = True
    

    Установите и активируйте пакет python3-argcomplete, чтобы настроить поддержку завершения Ansible bash.

    $ sudo apt install python3-argcomplete
    $ sudo activate-global-python-argcomplete3
    

    Теперь вы можете нажать клавишу Tab, чтобы получить список параметров оболочки bash.

    Шаг 2 - Настройка файла инвентаризации

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

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

    Ansible поставляется с файлом Inventory по умолчанию, доступным по адресу /etc/ansible/hosts. Откройте его с помощью редактора Nano.

    $ sudo nano /etc/ansible/hosts
    

    Вставьте следующий код в конец файла.

    [servers]
    server1 ansible_host=203.0.113.111
    server2 ansible_host=203.0.113.112
    server3 ansible_host=203.0.113.113
    
    [all:vars]
    ansible_python_interpreter=/usr/bin/python3
    

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

    Группа all:vars задает параметр ansible_python_interpreter для всех хостов в инвентаре. Это гарантирует, что Ansible использует исполняемый файл Python 3 вместо Python 2, который был удален из последних версий Ubuntu.

    Когда вы закончите, сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено подтвердить ваши изменения.

    Примечание. Вы также можете создать свой файл Inventory в любом месте по вашему выбору, который затем можно передать, используя параметр -i при выполнении команд Ansible.

    Вы можете проверить свой инвентарный список с помощью следующей команды.

    $ ansible-inventory --list -y
    all:
      children:
        servers:
          hosts:
            server1:
              ansible_host: 203.0.113.111
              ansible_python_interpreter: /usr/bin/python3
            server2:
              ansible_host: 203.0.113.112
              ansible_python_interpreter: /usr/bin/python3
            server3:
              ansible_host: 203.0.113.113
              ansible_python_interpreter: /usr/bin/python3
        ungrouped: {}
    

    Организация серверов в группы и подгруппы

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

    [webservers]
    203.0.113.111
    203.0.113.112
    
    [dbservers]
    203.0.113.113
    server_hostname
    
    [development]
    203.0.113.111
    203.0.113.113
    
    [production]
    203.0.113.112
    server_hostname
    
    

    Шаг 3 — Настройте ключи SSH

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

    Используйте следующие шаги, чтобы создать и настроить ключ SSH для Ansible и его узлов.

    Создайте ключ для Ansible.

    $ ssh-keygen -t rsa -b 4096 -C "Ansible key"
    

    Скопируйте открытый ключ в свои учетные записи на удаленных серверах. Для этого мы будем использовать команду ssh-copy-id.

    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    $ ssh-copy-id -i $HOME/.ssh/id_rsa.pub 
    

    Вот и все. Теперь Ansible сможет общаться с вашими серверами.

    Настройте ключи SSH на узлах с существующим открытым ключом

    Если у клиентов уже включены открытые ключи, вам придется выполнить определенные дополнительные шаги. Для этого вам нужно создать нового пользователя, доступного только Ansible на каждом сервере узла. Этот пользователь будет иметь привилегии sudo, доступные без пароля, и к нему можно будет получить доступ только с вашего сервера ansible.

    Чтобы создать пользователя ansible, выполните следующую команду.

    $ sudo adduser ansible
    

    Выберите надежный пароль и оставьте все остальные поля пустыми.

    Теперь настройте доступ sudo без пароля для этого пользователя с помощью следующей команды.

    $ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible
    

    Теперь, когда вы добавили и настроили нового пользователя, вы можете скопировать ключ SSH с вашего доступного сервера на сервер узла, используя следующую команду.

    $ ssh-copy-id 
    

    Вам будет предложено ввести пароль для пользователя ansible. Введите его, и ключ SSH будет скопирован.

    Затем отключите вход на основе пароля для пользователя ansible на сервере узла.

    $ sudo usermod -L ansible
    

    Теперь ваш сервер узла доступен только с сервера Ansible, поскольку только этот сервер имеет для него открытый ключ, и вы не можете использовать его с привилегиями sudo на сервере узла напрямую, поскольку вход с паролем отключен.

    Вам придется повторить эти шаги для каждого узла сервера. Кроме того, в этом руководстве замените пользователя root на пользователя ansible.

    Шаг 4 - Тестовое соединение

    После настройки файла инвентаризации и ключей SSH мы должны проверить, может ли Ansible подключиться к серверам.

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

    $ ansible all -m ping -u root
    

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

    server1 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    server2 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    server3 | SUCCESS => {
        "changed": false,
        "ping": "pong"
    }
    

    Если вы впервые используете Ansible, вам будет предложено подтвердить подлинность всех серверов. При появлении запроса введите yes и нажмите ENTER для подтверждения.

    Шаг 5 — Запустите несколько основных команд

    Давайте запустим некоторые основные команды на серверах с помощью Ansible. Для запуска любой команды на сервере используется следующий формат.

    $ ansible all -a "command" -u <username>
    

    Проверьте использование диска

    Во-первых, давайте проверим использование диска на всех наших серверах.

    $ ansible all -a "df -h" -u root
    server1 | CHANGED | rc=0 >>
    Filesystem      Size  Used Avail Use% Mounted on
    tmpfs           198M  972K  197M   1% /run
    /dev/sda2        50G  3.9G   44G   9% /
    tmpfs           989M     0  989M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           198M  4.0K  198M   1% /run/user/1000
    
    server2 | CHANGED | rc=0 >>
    Filesystem      Size  Used Avail Use% Mounted on
    tmpfs           198M  922K  197M   1% /run
    /dev/sda2        50G  4.9G   43G  10% /
    tmpfs           989M     0  989M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           198M  4.0K  198M   1% /run/user/1000
    

    Таргетинг на отдельные хосты и группы

    До сих пор мы запускали команды на всех удаленных серверах одновременно. Но это не всегда так. Чтобы запустить команду только на одном сервере, вы должны использовать следующий формат.

    $ ansible server1 -a "uptime" -u root
    server1 | CHANGED | rc=0 >>
     21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19
    

    Приведенная выше команда проверяет время безотказной работы на server1 из группы инвентаризации.

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

    $ ansible server1:server2 -m ping -u root
    

    Вы также можете настроить таргетинг на группы или подгруппы непосредственно из файла инвентаризации.

    $ ansible groupname -m ping -u <username>
    

    Обновите все серверы

    В этом руководстве мы предполагаем, что все удаленные серверы работают под управлением ОС Debian или Ubuntu.

    Выполните следующую команду, чтобы обновить программное обеспечение на всех ваших серверах.

    $ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root
    

    Параметр -m определяет модуль для запуска Ansible. Параметр -a относится к аргументам или командам для связанного модуля. Здесь мы используем модуль apt Ansible для обновления серверов точно так же, как мы использовали модуль ping в нашем последнем примере. update_cache обновляет кэш APT на сервере, а upgrade=yes указывает Ansible запустить apt upgrade. команда.

    Если вы используете пользователя ansible, как описано выше, вам необходимо изменить команду ansible, чтобы она выполнялась с повышенными привилегиями sudo.

    $ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible
    

    Здесь -K запрашивает пароль для повышения привилегий. -b запускает операцию ansible с become, которая позволяет вам быть другим пользователем. Обе переменные вместе позволяют запускать ansible с повышенными привилегиями sudo. Вам нужно будет использовать это для всех команд, которые требуют привилегий sudo.

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

    $ ansible all -a "reboot" -u root
    

    Это были лишь некоторые из основных команд, которые вы можете запускать с помощью Ansible.

    Шаг 6 — Введение в Playbooks

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

    Теперь мы создадим playbook для установки Nginx и настроим HTML-страницу на узле Ansible. Создайте каталог для Ansible в своем домашнем каталоге.

    $ mkdir ~/ansible
    

    Создайте и откройте файл playbook для редактирования.

    $ cd ~/ansible
    $ nano testplaybook.yml
    

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

    Первым шагом для определения воспроизведения является определение целевых хостов с помощью директивы hosts: all. Директива become используется для указания того, что следующие задачи должны выполняться привилегированным пользователем.

    Мы определим три задачи: одну для добавления пользователя, одну для обновления всех пакетов и последнюю для установки сервера Nginx. Раздел vars в playbook используется для определения пользовательских переменных. Мы определяем две переменные: одну для пользователя, которого нужно добавить, а вторую — для определения состояния пакета, который нужно установить. Чтобы использовать переменную, нам нужно заключить имя переменной в двойные фигурные скобки.

    Модуль ansible.builtin.user используется для добавления нового пользователя с привилегиями sudo. Чтобы добавить пользователя, мы используем переменные name, пароль и group. Для переменной group задано значение sudo, чтобы предоставить пользователю права суперпользователя. Вы не можете поместить открытый текст-пароль в файл playbook, поэтому мы добавим хешированный секрет SHA. Для этого мы будем использовать утилиту mkpasswd. Чтобы установить его, выполните следующую команду, чтобы установить пакет whois.

    $ sudo apt install whois
    

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

    $ mkpasswd --method=sha-512
    Password:
    $6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1
    

    Директива update_cache предназначена для обновления списка системных репозиториев точно так же, как команда apt update и upgrade: dist указывает Ansible выполнить обновление системы. Третья задача не требует пояснений и устанавливает последнюю версию сервера Nginx.

    На основе информации, которую мы обсудили, вставьте следующий код в файл. Вставьте полученный хэш-ключ в качестве значения переменной password.

    ---
    - name: Test playbook
      hosts: all
      become: true
      vars:
          state: latest
          user: navjot
      tasks:
      - name: Add the user {{ user }}
        ansible.builtin.user:
          name: "{{ user }}"
          password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1'
          group: sudo
      - name: Upgrade all apt packages
        apt:
          update_cache: yes
          upgrade: dist
      - name: Install the {{ state }} of package "nginx"
        apt:
          name: "nginx"
          state: "{{ state }}"
    

    Сохраните файл, нажав Ctrl + X и введя Y, когда будет предложено подтвердить изменения.

    Чтобы выполнить playbook, выполните следующую команду. Флаг --ask-become-pass запросит ваш пароль root для выполнения операции с повышенными правами.

    $ ansible-playbook testplaybook.yml --ask-become-pass
    

    Вы получите следующий вывод.

    BECOME password:
    
    PLAY [Test playbook] ***************************************************************************************************
    
    TASK [Gathering Facts] *************************************************************************************************
    ok: [server1]
    ok: [server2]
    ok: [server3]
    
    TASK [Add the user casablanca] *****************************************************************************************
    changed: [server3]
    changed: [server2]
    changed: [server1]
    
    TASK [Upgrade all apt packages] ****************************************************************************************
    changed: [server1]
    changed: [server2]
    changed: [server3]
    
    TASK [Install the latest of package "nginx"] ***************************************************************************
    changed: [server3]
    changed: [server2]
    changed: [server1]
    
    PLAY RECAP *************************************************************************************************************
    server1                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    server2                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    server3                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
    

    Это подтверждает, что ваш плейбук успешно запущен.

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

    $ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass 
    

    Заключение

    На этом наше руководство по установке и настройке Ansible на сервере Ubuntu 22.04 завершено. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.