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