неділя, 24 листопада 2024 р.

Встановлення Ansible в Docker контейнері

Задача

Ansible – програмний продукт з відкритим кодом, який є зручним інструментом виконання дій паралельно на компонентах великих систем. Компоненти можуть бути на будь-яких платформах – Linux/Unix, мережеві пристрої різних виробників типу Cisco, Juniper, системи на хмарних платформах типу AWS, Azure і т.п. Головна умова – компоненти повинні забезпечити доступ по SSH. Виконання сценаріїв (playbooks) Ansible може застосовуватися для розгортання систем і для виконання широкого спектру задач з автоматизації, можна вважати, що Ansible є одним з можливих інструментів реалізації концепції Infrastructure as Code (IaC), хоча для забезпечення ідемпотентності потрібні певні зусилля.

Для окремого хоста Ansible є зручним інструментом для розгортання і автоматизації. За умови максимального використання Docker для інсталяції пакунків (про яке було зазначено в дописі Встановлення Docker на Linux сервері) розгортання хоста в певній наперед заданій конфігурації може виглядати, наприклад, таким чином:

  • інсталяція мінімальної операційної системи (ОС)

  • інсталяція Docker

  • інсталяція Git в Docker

  • інсталяція Ansible в Docker

  • клонування Git-репозиторію зі сценаріями Ansible

  • виконання сценаріїв Ansible

Отже наша задача сьогодні – встановлення Ansible в Docker контейнері на сервері з Ubuntu 22.04.

Інформаційний пошук

Для пошуку Docker образу Ansible відвідуємо Docker Hub. Пошук по моделі ansible видає тисячи результатів. При сортуванні за найкращим співпадінням – Best Match, яке застосовується за замовчуванням, серед результатів, які відображаються на екрані (перші 25) звертаємо увагу на дату останнього оновлення (образи, які останній раз оновлювалися декілька років тому, нас не цікавлять), кількість завантажень і кількість зірочок. Найбільш привабливим виглядає alpine/ansible. Додатковим аргументом для використання цього образу є те, що ми вже використовували образ Git від цього постачальника.

Встановлення Ansible і налаштування для використання

В описі образу alpine/ansible надане посилання на Dockerfile, за допомогою якого було побудовано цей образ:

FROM alpine:3


RUN apk add --update --no-cache ansible bash openssh sshpass


ENTRYPOINT []

CMD ["ansible", "--help"]


Недоліком тут є те, що команди, які передаються в контейнер в якості ENTRYPOINT, виконуються в кореневому каталозі (/). Нам потрібно, щоб робочим каталогом був поточний каталог, в якому буде запускатися ansible контейнер. Отже образ потрібно змінити. Створюємо свій Dockerfile на основі наведеного для alpine/ansible, в якому створюємо і визначаємо в якості робочого каталог /work:


chd@REBEL:~$ mkdir -p docker/ansible

chd@REBEL:~$ cd docker/ansible

chd@REBEL:~$ vi Dockerfile


FROM alpine:3


RUN apk add --update --no-cache ansible bash openssh sshpass \

&& mkdir -p /work


WORKDIR /work


ENTRYPOINT []

CMD ["ansible", "--help"]


Будуємо новий образ з іменем ansible:


chd@REBEL:~/docker/ansible$ docker build -t ansible .

[+] Building 16.8s (7/7) FINISHED                         docker:default

 => [internal] load build definition from Dockerfile                0.0s

 => => transferring dockerfile: 196B                                0.0s

 => [internal] load metadata for docker.io/library/alpine:3         0.8s

 => [internal] load .dockerignore                                   0.0s

 => => transferring context: 2B                                     0.0s

 => CACHED [1/3] FROM docker.io/library/alpine:3@sha256:1e42bbe2…   0.0s

 => [2/3] RUN apk add --update --no-cache ansible bash openssh …    9.8s

 => [3/3] WORKDIR /work                                             0.0s

 => exporting to image                                              6.1s

 => => exporting layers                                             6.1s

 => => writing image sha256:652494262c5b24cd5c0221f60851d2114538…   0.0s

 => => naming to docker.io/library/ansible                          0.0s


chd@REBEL:~/docker/ansible$ docker images

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE

ansible      latest    652494262c5b   45 seconds ago   410MB

alpine/git   latest    507906c82962   7 days ago       89.5MB


Перевірка працездатності ansible контейнера – відображення версії ansible:


chd@REBEL:~/docker/ansible$ docker run -it --rm --name ansible ansible ansible --version

ansible [core 2.17.0]


Ansible працездатний, поточна версія – 2.17.0.

Пересвідчуємося, що в якості робочого каталогу використовується /root:


chd@REBEL:~/docker/ansible$ docker run -it --rm --name ansible ansible pwd

/work


Для зручності використання додамо наступні рядки до файлу ~/.bash_aliases (якщо цей файл відсутній, можна його створити):


alias ansible='docker run -it --rm --name ansible -v ${HOME}:/root -v $(pwd):/work ansible ansible'


alias ansible-playbook='docker run -it --rm --name ansible-playbook -v ${HOME}:/root -v $(pwd):/workansible ansible-playbook'


В наведених командах домашній каталог монтується в контейнері як /root, а поточний – як /work.


Примітка: типово в файлі .bashrc знаходяться наступні рядки, які забезпечують виконання файлу .bash_aliases при початку нової bash сесії:


if [ -f ~/.bash_aliases ]; then

    . ~/.bash_aliases

fi


Для актуалізації нових псевдонімів (aliases) викоуємо команду:


chd@REBEL:~$ source ~/.bashrc


Перевіряємо працездатність нових команд:


chd@REBEL:~$ ansible --version

ansible [core 2.17.0]


chd@REBEL:~$ ansible -m ping localhost

[WARNING]: No inventory was parsed, only implicit localhost is available

localhost | SUCCESS => {

    "changed": false,

    "ping": "pong"

}


chd@REBEL:~$ ansible-playbook --version

ansible-playbook [core 2.17.0]


Для перевірки команди ansible-playbook створюємо тестовий сценарій test.yaml:


chd@REBEL:~$ mkdir ansible

chd@REBEL:~$ cd ansible

chd@REBEL:~/ansible$ vi test.yaml 

                                                                                      

- hosts: localhost

  gather_facts: no


  tasks:

    - ping:


chd@REBEL:~/ansible$ ansible-playbook test.yaml

[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'


PLAY [localhost] *******************************************************


TASK [ping] ************************************************************

ok: [localhost]


PLAY RECAP *************************************************************

localhost   : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Посилання

Немає коментарів:

Дописати коментар