> ~ biozz / Blogs

Ansible #1 - Подготовка

Руководство по Ansible - Часть 1 - Подготовка

Иван Елфимов, 2020-07-12, 3 мин (слов: 491)

ОБНОВЛЕНИЕ 2023-07-02

Я выпустил эту и другие части обучения по Ansible (объявление) на ansible.biozz.dev. Там гораздо более приятный формат для чтения, рекомендую посмотреть вместо этого.

Определения

Control node - любой компьютер, на котором установлен Ansible. С него можно запускать команды и плейбуки.

Managed nodes - устройства/серверы в сети, которыми можно управлять с помощью Ansible. Иногда называют “хост”. На них Ansible не установлен.

Inventory - список, управляемых хостов/нод. Иногда инвентарь называют хостфайлом. Там указывают IP адреса серверов. В инвентаре можно объединять хосты в группы для удобства выкатывания.

Modules - единица кода, которую выполняет Ansible. Может настраивать систему, можно объединять в задачи “tasks”, можно выполнять в рамках плейбука.

Tasks - единица действия, которое может выполнить Ansible. Можно выполнять таски разово с помощью ad-hoc команд.

Playbooks - упорядоченный список тасок. Может включать в себя переменные. Пишется на YAML.

Папки

Создать папку ansible, в ней будут находиться все конфиги и отправная точка для команд.

Создать папку containers в папке ansible.

Ansible

Установить ansible:

> pip install ansible

Я пользуюсь pyenv для работы с virtualenv, поэтому у меня были предварительно выполнены команды pyenv virtualenv 3.8.2 ansible-3.8.2 и pyenv local ansible-3.8.2

Хосты

У нас будет два Debian хоста в виде Docker-контейнеров. Так как Ansible будет ругаться на пароли при подключении по SSH, мы сразу настраиваем авторизацию по ключу. Файлы конфигурации контейнеров взяты практически один-в-один из репозитория Praqma/alpine-sshd.

Создать Dockerfile:

FROM debian:10.4
RUN apt-get update \
    && apt-get install -y openssh-server python3.7 \
    && mkdir /var/run/sshd\ 
    && mkdir /root/.ssh \
    && chmod 0700 /root/.ssh \
    && ssh-keygen -A \
    && sed -i s/^#PasswordAuthentication\ yes/PasswordAuthentication\ no/ /etc/ssh/sshd_config
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/usr/sbin/sshd", "-D"]

Создать docker-entrypoint.sh:

#!/bin/sh
if [ -z "${AUTHORIZED_KEYS}" ]; then
  echo "Need your ssh public key as AUTHORIZED_KEYS env variable. Abnormal exit ..."
  exit 1
fi
echo "Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS env variable ..."
echo "${AUTHORIZED_KEYS}" > /root/.ssh/authorized_keys
# Execute the CMD from the Dockerfile:
exec "$@"

Создать docker-compose.yml:

version: "3"

services:
  deb1:
    build: .
    environment:
      AUTHORIZED_KEYS: ${AUTHORIZED_KEYS}
    ports:
      - "2222:22"
  deb2:
    build: .
    environment:
      AUTHORIZED_KEYS: ${AUTHORIZED_KEYS}
    ports:
      - "2223:22"

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

> export AUTHORIZED_KEYS=$(cat ~/.ssh/id_rsa.pub)
> docker-compose up --build

Если всё ок, то в конце вывода будет примерно такое:

Creating containers_deb1_1 ... done
Creating containers_deb2_1 ... done
Attaching to containers_deb2_1, containers_deb1_1
deb2_1  | Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS env variable ...
deb1_1  | Populating /root/.ssh/authorized_keys with the value from AUTHORIZED_KEYS env variable ...

Проверить подключение по ssh:

> ssh root@localhost -p 2222
> ssh root@localhost -p 2223

Базовый инвентарь

Создать inventory.yml:

---
debs:
  hosts:
    deb1:
      ansible_port: 2222
      ansible_host: localhost
      ansible_user: root
      ansible_python_interpreter: /usr/bin/python3.7
    deb2:
      ansible_port: 2223
      ansible_host: localhost
      ansible_user: root
      ansible_python_interpreter: /usr/bin/python3.7

Конфигурация Ansible

Создать ansible.cfg:

[defaults]
inventory = /path/to/inventory.yml

Что должно получиться

├── containers
│   ├── Dockerfile
│   ├── docker-compose.yml
│   └── docker-entrypoint.sh
├── ansible.cfg
└── inventory.yml

Материалы из этой части

Переводы: en