Ansible в Docker: установка в контейнер.

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

В этой статье мы рассмотрим оба варианта. В качестве основы будем использовать два популярных образа Alpine и Ubuntu. Для каждого варианта приведены инструкции по установке вручную и создание собственных Dockerfile.

Почему именно Alpine и Ubuntu?

Ubuntu — популярный дистрибутив Linux, широко поддерживается, и большинство руководств касаются именно его.

Alpine — легкий и минималистичный образ, идеально подходит для контейнеров с минимальным размером, но чуть сложнее в настройке.

Установка Ansible в контейнере с Ubuntu

1. Ручная установка

Запустите контейнер Ubuntu командой docker run:

[root@waky practice]# docker run -dt --name ansible_container ubuntu
6a4bc56db574103061b1456148617a81288e5325c8a0228c4a2e71510d702f0e
[root@waky practice]#

Зайдите в консоль контейнера с помощью docker exec:

[root@waky practice]# docker exec -it ansible_container /bin/bash
root@6a4bc56db574:/#

Обновите пакеты в контейнере:

root@6a4bc56db574:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu noble InRelease [256 kB]
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Get:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
Get:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease [126 kB]
Get:5 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Packages [331 kB]
Get:6 http://archive.ubuntu.com/ubuntu noble/restricted amd64 Packages [117 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages [1808 kB]
Get:8 http://archive.ubuntu.com/ubuntu noble/universe amd64 Packages [19.3 MB]
Get:9 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages [1700 kB]
Get:10 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Packages [1182 kB]
Get:11 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Packages [2796 kB]
Get:12 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Packages [33.1 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Packages [35.9 kB]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Packages [2929 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Packages [1943 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages [2059 kB]
Get:17 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Packages [34.3 kB]
Get:18 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Packages [49.4 kB]
Fetched 35.0 MB in 10s (3494 kB/s)
Reading package lists... Done
root@6a4bc56db574:/#

Установите software-properties-common:

root@6a4bc56db574:/# apt-get install -y software-properties-common
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  adduser appstream ca-certificates dbus dbus-bin dbus-daemon dbus-session-bus-common dbus-system-bus-common dbus-user-session dirmngr distro-info-data dmsetup gir1.2-girepository-2.0
  gir1.2-glib-2.0 gir1.2-packagekitglib-1.0 gpg gpg-agent gpgconf iso-codes krb5-locales libapparmor1 libappstream5 libargon2-1 libbrotli1 libcap2-bin libcryptsetup12 libcurl3t64-gnutls
  libdbus-1-3 libdevmapper1.02.1 libduktape207 libdw1t64 libelf1t64 libexpat1 libfdisk1 libgirepository-1.0-1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data libgssapi-krb5-2 libgstreamer1.0-0
  libicu74 libjson-c5 libk5crypto3 libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 libksba8 libldap-common libldap2 libnghttp2-14 libnss-systemd libpackagekit-glib2-18 libpam-cap libpam-systemd
  libpolkit-agent-1-0 libpolkit-gobject-1-0 libpsl5t64 libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib libreadline8t64 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsqlite3-0 libssh-4 libstemmer0d libsystemd-shared libunwind8 libxml2 libxmlb2 libyaml-0-2 lsb-release media-types netbase networkd-dispatcher openssl packagekit packagekit-tools
  pinentry-curses polkitd publicsuffix python-apt-common python3 python3-apt python3-blinker python3-cffi-backend python3-cryptography python3-dbus python3-distro python3-distro-info python3-gi
  python3-httplib2 python3-jwt python3-launchpadlib python3-lazr.restfulclient python3-lazr.uri python3-minimal python3-oauthlib python3-pkg-resources python3-pyparsing python3-six
  python3-software-properties python3-wadllib python3.12 python3.12-minimal readline-common sgml-base shared-mime-info systemd systemd-dev systemd-resolved systemd-sysv systemd-timesyncd tzdata
  ucf unattended-upgrades xdg-user-dirs xml-core xz-utils
Suggested packages:
  liblocale-gettext-perl perl cron quota ecryptfs-utils apt-config-icons gnupg pinentry-gnome3 tor keyboxd scdaemon isoquery low-memory-monitor krb5-doc krb5-user gstreamer1.0-tools
  libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql iw | wireless-tools pinentry-doc polkitd-pkla python3-doc
  python3-tk python3-venv python-apt-doc python-blinker-doc python-cryptography-doc python3-cryptography-vectors python-dbus-doc python3-crypto python3-keyring python3-testresources
  python3-setuptools python-pyparsing-doc python3.12-venv python3.12-doc binutils binfmt-support readline-doc sgml-base-doc systemd-container systemd-homed systemd-userdbd systemd-boot libfido2-1
  libip4tc2 libqrencode4 libtss2-esys-3.0.2-0 libtss2-mu-4.0.1-0 libtss2-rc0 libtss2-tcti-device0 bsd-mailx default-mta | mail-transport-agent needrestart powermgmt-base debhelper
The following NEW packages will be installed:
  adduser appstream ca-certificates dbus dbus-bin dbus-daemon dbus-session-bus-common dbus-system-bus-common dbus-user-session dirmngr distro-info-data dmsetup gir1.2-girepository-2.0
  gir1.2-glib-2.0 gir1.2-packagekitglib-1.0 gpg gpg-agent gpgconf iso-codes krb5-locales libapparmor1 libappstream5 libargon2-1 libbrotli1 libcap2-bin libcryptsetup12 libcurl3t64-gnutls
  libdbus-1-3 libdevmapper1.02.1 libduktape207 libdw1t64 libelf1t64 libexpat1 libfdisk1 libgirepository-1.0-1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data libgssapi-krb5-2 libgstreamer1.0-0
  libicu74 libjson-c5 libk5crypto3 libkeyutils1 libkmod2 libkrb5-3 libkrb5support0 libksba8 libldap-common libldap2 libnghttp2-14 libnss-systemd libpackagekit-glib2-18 libpam-cap libpam-systemd
  libpolkit-agent-1-0 libpolkit-gobject-1-0 libpsl5t64 libpython3-stdlib libpython3.12-minimal libpython3.12-stdlib libreadline8t64 librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsqlite3-0 libssh-4 libstemmer0d libsystemd-shared libunwind8 libxml2 libxmlb2 libyaml-0-2 lsb-release media-types netbase networkd-dispatcher openssl packagekit packagekit-tools
  pinentry-curses polkitd publicsuffix python-apt-common python3 python3-apt python3-blinker python3-cffi-backend python3-cryptography python3-dbus python3-distro python3-distro-info python3-gi
  python3-httplib2 python3-jwt python3-launchpadlib python3-lazr.restfulclient python3-lazr.uri python3-minimal python3-oauthlib python3-pkg-resources python3-pyparsing python3-six
  python3-software-properties python3-wadllib python3.12 python3.12-minimal readline-common sgml-base shared-mime-info software-properties-common systemd systemd-dev systemd-resolved systemd-sysv
  systemd-timesyncd tzdata ucf unattended-upgrades xdg-user-dirs xml-core xz-utils
0 upgraded, 123 newly installed, 0 to remove and 0 not upgraded.
…
root@6a4bc56db574:/#

Установите репозиторий Ansible:

root@6a4bc56db574:/# add-apt-repository --yes --update ppa:ansible/ansible
Repository: 'Types: deb
URIs: https://ppa.launchpadcontent.net/ansible/ansible/ubuntu/
Suites: noble
Components: main
'
Description:
Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications— automate in a language that approaches plain English, using SSH, with no agents to install on remote systems.

http://ansible.com/

If you face any issues while installing Ansible PPA, file an issue here:
https://github.com/ansible-community/ppa/issues
More info: https://launchpad.net/~ansible/+archive/ubuntu/ansible
Adding repository.
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Hit:2 http://security.ubuntu.com/ubuntu noble-security InRelease
Hit:3 http://archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease
Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 Components [665 kB]
Get:6 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble InRelease [17.8 kB]
Get:7 http://security.ubuntu.com/ubuntu noble-security/main amd64 Components [25.4 kB]
Get:8 http://security.ubuntu.com/ubuntu noble-security/universe amd64 Components [91.4 kB]
Get:9 http://security.ubuntu.com/ubuntu noble-security/restricted amd64 Components [156 B]
Get:10 http://security.ubuntu.com/ubuntu noble-security/multiverse amd64 Components [157 B]
Get:11 http://archive.ubuntu.com/ubuntu noble/universe amd64 Components [5943 kB]
Get:12 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble/main amd64 Packages [709 B]
Get:13 http://archive.ubuntu.com/ubuntu noble/multiverse amd64 Components [41.9 kB]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Components [236 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 Components [520 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble-updates/restricted amd64 Components [159 B]
Get:17 http://archive.ubuntu.com/ubuntu noble-updates/multiverse amd64 Components [888 B]
Get:18 http://archive.ubuntu.com/ubuntu noble-backports/main amd64 Components [7877 B]
Get:19 http://archive.ubuntu.com/ubuntu noble-backports/universe amd64 Components [11.9 kB]
Get:20 http://archive.ubuntu.com/ubuntu noble-backports/restricted amd64 Components [161 B]
Get:21 http://archive.ubuntu.com/ubuntu noble-backports/multiverse amd64 Components [161 B]
Fetched 7562 kB in 3s (2251 kB/s)
Reading package lists... Done
root@6a4bc56db574:/#

Установите Ansible:

root@6a4bc56db574:/# apt-get install -y ansible
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  ansible-core libbsd0 libcbor0.10 libedit2 libfido2-1 libsodium23 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client python-babel-localedata python3-babel
  python3-bcrypt python3-certifi python3-chardet python3-idna python3-jinja2 python3-jmespath python3-kerberos python3-markupsafe python3-nacl python3-ntlm-auth python3-packaging python3-paramiko
  python3-requests python3-requests-ntlm python3-resolvelib python3-tz python3-urllib3 python3-winrm python3-xmltodict python3-yaml sshpass xauth
Suggested packages:
  keychain libpam-ssh monkeysphere ssh-askpass python-jinja2-doc python-nacl-doc python3-gssapi python3-invoke python3-openssl python3-socks python-requests-doc python3-brotli
The following NEW packages will be installed:
  ansible ansible-core libbsd0 libcbor0.10 libedit2 libfido2-1 libsodium23 libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 openssh-client python-babel-localedata python3-babel
  python3-bcrypt python3-certifi python3-chardet python3-idna python3-jinja2 python3-jmespath python3-kerberos python3-markupsafe python3-nacl python3-ntlm-auth python3-packaging python3-paramiko
  python3-requests python3-requests-ntlm python3-resolvelib python3-tz python3-urllib3 python3-winrm python3-xmltodict python3-yaml sshpass xauth
0 upgraded, 39 newly installed, 0 to remove and 0 not upgraded.
Need to get 30.0 MB of archives.
After this operation, 270 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 libbsd0 amd64 0.12.1-1build1.1 [41.2 kB]
Get:2 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-yaml amd64 6.0.1-2build2 [123 kB]
Get:3 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble/main amd64 ansible-core all 2.19.4-1ppa~noble [1133 kB]
Get:4 http://archive.ubuntu.com/ubuntu noble/main amd64 libcbor0.10 amd64 0.10.2-1.2ubuntu2 [25.8 kB]
Get:5 http://archive.ubuntu.com/ubuntu noble/main amd64 libedit2 amd64 3.1-20230828-1build1 [97.6 kB]
Get:6 http://archive.ubuntu.com/ubuntu noble/main amd64 libfido2-1 amd64 1.14.0-1build3 [83.5 kB]
Get:7 http://archive.ubuntu.com/ubuntu noble/main amd64 libxau6 amd64 1:1.0.9-1build6 [7160 B]
Get:8 http://archive.ubuntu.com/ubuntu noble/main amd64 libxdmcp6 amd64 1:1.1.3-0ubuntu6 [10.3 kB]
Get:9 http://archive.ubuntu.com/ubuntu noble/main amd64 libxcb1 amd64 1.15-1ubuntu2 [47.7 kB]
Get:10 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-data all 2:1.8.7-1build1 [115 kB]
Get:11 http://archive.ubuntu.com/ubuntu noble/main amd64 libx11-6 amd64 2:1.8.7-1build1 [650 kB]
Get:12 http://archive.ubuntu.com/ubuntu noble/main amd64 libxext6 amd64 2:1.3.4-1build2 [30.4 kB]
Get:13 http://archive.ubuntu.com/ubuntu noble/main amd64 libxmuu1 amd64 2:1.1.3-3build2 [8958 B]
Get:14 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 openssh-client amd64 1:9.6p1-3ubuntu13.14 [906 kB]
Get:15 http://archive.ubuntu.com/ubuntu noble/main amd64 xauth amd64 1:1.1.2-1build1 [25.6 kB]
Get:16 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-markupsafe amd64 2.1.5-1build2 [12.7 kB]
Get:17 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-jinja2 all 3.1.2-1ubuntu1.3 [108 kB]
Get:18 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-packaging all 24.0-1 [41.1 kB]
Get:19 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-resolvelib all 1.0.1-1 [25.7 kB]
Get:20 http://archive.ubuntu.com/ubuntu noble/main amd64 libsodium23 amd64 1.0.18-1build3 [161 kB]
Get:21 http://archive.ubuntu.com/ubuntu noble/main amd64 python-babel-localedata all 2.10.3-3build1 [6357 kB]
Get:22 https://ppa.launchpadcontent.net/ansible/ansible/ubuntu noble/main amd64 ansible all 12.2.0-1ppa~noble [19.0 MB]
Get:23 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-tz all 2024.1-2 [31.4 kB]
Get:24 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-babel all 2.10.3-3build1 [87.5 kB]
Get:25 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-certifi all 2023.11.17-1 [165 kB]
Get:26 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-chardet all 5.2.0+dfsg-1 [117 kB]
Get:27 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-idna all 3.6-2ubuntu0.1 [49.0 kB]
Get:28 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-jmespath all 1.0.1-1 [21.3 kB]
Get:29 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-kerberos amd64 1.1.14-3.1build9 [21.2 kB]
Get:30 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-nacl amd64 1.5.0-4build1 [57.9 kB]
Get:31 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-ntlm-auth all 1.5.0-1 [21.3 kB]
Get:32 http://archive.ubuntu.com/ubuntu noble/main amd64 python3-bcrypt amd64 3.2.2-1build1 [33.0 kB]
Get:33 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-paramiko all 2.12.0-2ubuntu4.1 [137 kB]
Get:34 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-urllib3 all 2.0.7-1ubuntu0.2 [93.3 kB]
Get:35 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-requests all 2.31.0+dfsg-1ubuntu1.1 [50.8 kB]
Get:36 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-requests-ntlm all 1.1.0-3 [6308 B]
Get:37 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 python3-xmltodict all 0.13.0-1ubuntu0.24.04.1 [14.3 kB]
Get:38 http://archive.ubuntu.com/ubuntu noble/universe amd64 python3-winrm all 0.4.3-2 [31.9 kB]
Get:39 http://archive.ubuntu.com/ubuntu noble/universe amd64 sshpass amd64 1.09-1 [11.7 kB]
Fetched 30.0 MB in 9s (3394 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libbsd0:amd64.
(Reading database ... 10458 files and directories currently installed.)
Preparing to unpack .../00-libbsd0_0.12.1-1build1.1_amd64.deb ...
Unpacking libbsd0:amd64 (0.12.1-1build1.1) ...
Selecting previously unselected package python3-yaml.
Preparing to unpack .../01-python3-yaml_6.0.1-2build2_amd64.deb ...
Unpacking python3-yaml (6.0.1-2build2) ...
Selecting previously unselected package libcbor0.10:amd64.
Preparing to unpack .../02-libcbor0.10_0.10.2-1.2ubuntu2_amd64.deb ...
Unpacking libcbor0.10:amd64 (0.10.2-1.2ubuntu2) ...
Selecting previously unselected package libedit2:amd64.
Preparing to unpack .../03-libedit2_3.1-20230828-1build1_amd64.deb ...
Unpacking libedit2:amd64 (3.1-20230828-1build1) ...
Selecting previously unselected package libfido2-1:amd64.
Preparing to unpack .../04-libfido2-1_1.14.0-1build3_amd64.deb ...
Unpacking libfido2-1:amd64 (1.14.0-1build3) ...
Selecting previously unselected package libxau6:amd64.
Preparing to unpack .../05-libxau6_1%3a1.0.9-1build6_amd64.deb ...
Unpacking libxau6:amd64 (1:1.0.9-1build6) ...
Selecting previously unselected package libxdmcp6:amd64.
Preparing to unpack .../06-libxdmcp6_1%3a1.1.3-0ubuntu6_amd64.deb ...
Unpacking libxdmcp6:amd64 (1:1.1.3-0ubuntu6) ...
Selecting previously unselected package libxcb1:amd64.
Preparing to unpack .../07-libxcb1_1.15-1ubuntu2_amd64.deb ...
Unpacking libxcb1:amd64 (1.15-1ubuntu2) ...
Selecting previously unselected package libx11-data.
Preparing to unpack .../08-libx11-data_2%3a1.8.7-1build1_all.deb ...
Unpacking libx11-data (2:1.8.7-1build1) ...
Selecting previously unselected package libx11-6:amd64.
Preparing to unpack .../09-libx11-6_2%3a1.8.7-1build1_amd64.deb ...
Unpacking libx11-6:amd64 (2:1.8.7-1build1) ...
Selecting previously unselected package libxext6:amd64.
Preparing to unpack .../10-libxext6_2%3a1.3.4-1build2_amd64.deb ...
Unpacking libxext6:amd64 (2:1.3.4-1build2) ...
Selecting previously unselected package libxmuu1:amd64.
Preparing to unpack .../11-libxmuu1_2%3a1.1.3-3build2_amd64.deb ...
Unpacking libxmuu1:amd64 (2:1.1.3-3build2) ...
Selecting previously unselected package openssh-client.
Preparing to unpack .../12-openssh-client_1%3a9.6p1-3ubuntu13.14_amd64.deb ...
Unpacking openssh-client (1:9.6p1-3ubuntu13.14) ...
Selecting previously unselected package xauth.
Preparing to unpack .../13-xauth_1%3a1.1.2-1build1_amd64.deb ...
Unpacking xauth (1:1.1.2-1build1) ...
Selecting previously unselected package python3-markupsafe.
Preparing to unpack .../14-python3-markupsafe_2.1.5-1build2_amd64.deb ...
Unpacking python3-markupsafe (2.1.5-1build2) ...
Selecting previously unselected package python3-jinja2.
Preparing to unpack .../15-python3-jinja2_3.1.2-1ubuntu1.3_all.deb ...
Unpacking python3-jinja2 (3.1.2-1ubuntu1.3) ...
Selecting previously unselected package python3-packaging.
Preparing to unpack .../16-python3-packaging_24.0-1_all.deb ...
Unpacking python3-packaging (24.0-1) ...
Selecting previously unselected package python3-resolvelib.
Preparing to unpack .../17-python3-resolvelib_1.0.1-1_all.deb ...
Unpacking python3-resolvelib (1.0.1-1) ...
Selecting previously unselected package ansible-core.
Preparing to unpack .../18-ansible-core_2.19.4-1ppa~noble_all.deb ...
Unpacking ansible-core (2.19.4-1ppa~noble) ...
Selecting previously unselected package ansible.
Preparing to unpack .../19-ansible_12.2.0-1ppa~noble_all.deb ...
Unpacking ansible (12.2.0-1ppa~noble) ...
Selecting previously unselected package libsodium23:amd64.
Preparing to unpack .../20-libsodium23_1.0.18-1build3_amd64.deb ...
Unpacking libsodium23:amd64 (1.0.18-1build3) ...
Selecting previously unselected package python-babel-localedata.
Preparing to unpack .../21-python-babel-localedata_2.10.3-3build1_all.deb ...
Unpacking python-babel-localedata (2.10.3-3build1) ...
Selecting previously unselected package python3-tz.
Preparing to unpack .../22-python3-tz_2024.1-2_all.deb ...
Unpacking python3-tz (2024.1-2) ...
Selecting previously unselected package python3-babel.
Preparing to unpack .../23-python3-babel_2.10.3-3build1_all.deb ...
Unpacking python3-babel (2.10.3-3build1) ...
Selecting previously unselected package python3-certifi.
Preparing to unpack .../24-python3-certifi_2023.11.17-1_all.deb ...
Unpacking python3-certifi (2023.11.17-1) ...
Selecting previously unselected package python3-chardet.
Preparing to unpack .../25-python3-chardet_5.2.0+dfsg-1_all.deb ...
Unpacking python3-chardet (5.2.0+dfsg-1) ...
Selecting previously unselected package python3-idna.
Preparing to unpack .../26-python3-idna_3.6-2ubuntu0.1_all.deb ...
Unpacking python3-idna (3.6-2ubuntu0.1) ...
Selecting previously unselected package python3-jmespath.
Preparing to unpack .../27-python3-jmespath_1.0.1-1_all.deb ...
Unpacking python3-jmespath (1.0.1-1) ...
Selecting previously unselected package python3-kerberos.
Preparing to unpack .../28-python3-kerberos_1.1.14-3.1build9_amd64.deb ...
Unpacking python3-kerberos (1.1.14-3.1build9) ...
Selecting previously unselected package python3-nacl.
Preparing to unpack .../29-python3-nacl_1.5.0-4build1_amd64.deb ...
Unpacking python3-nacl (1.5.0-4build1) ...
Selecting previously unselected package python3-ntlm-auth.
Preparing to unpack .../30-python3-ntlm-auth_1.5.0-1_all.deb ...
Unpacking python3-ntlm-auth (1.5.0-1) ...
Selecting previously unselected package python3-bcrypt.
Preparing to unpack .../31-python3-bcrypt_3.2.2-1build1_amd64.deb ...
Unpacking python3-bcrypt (3.2.2-1build1) ...
Selecting previously unselected package python3-paramiko.
Preparing to unpack .../32-python3-paramiko_2.12.0-2ubuntu4.1_all.deb ...
Unpacking python3-paramiko (2.12.0-2ubuntu4.1) ...
Selecting previously unselected package python3-urllib3.
Preparing to unpack .../33-python3-urllib3_2.0.7-1ubuntu0.2_all.deb ...
Unpacking python3-urllib3 (2.0.7-1ubuntu0.2) ...
Selecting previously unselected package python3-requests.
Preparing to unpack .../34-python3-requests_2.31.0+dfsg-1ubuntu1.1_all.deb ...
Unpacking python3-requests (2.31.0+dfsg-1ubuntu1.1) ...
Selecting previously unselected package python3-requests-ntlm.
Preparing to unpack .../35-python3-requests-ntlm_1.1.0-3_all.deb ...
Unpacking python3-requests-ntlm (1.1.0-3) ...
Selecting previously unselected package python3-xmltodict.
Preparing to unpack .../36-python3-xmltodict_0.13.0-1ubuntu0.24.04.1_all.deb ...
Unpacking python3-xmltodict (0.13.0-1ubuntu0.24.04.1) ...
Selecting previously unselected package python3-winrm.
Preparing to unpack .../37-python3-winrm_0.4.3-2_all.deb ...
Unpacking python3-winrm (0.4.3-2) ...
Selecting previously unselected package sshpass.
Preparing to unpack .../38-sshpass_1.09-1_amd64.deb ...
Unpacking sshpass (1.09-1) ...
Setting up libxau6:amd64 (1:1.0.9-1build6) ...
Setting up libsodium23:amd64 (1.0.18-1build3) ...
Setting up libcbor0.10:amd64 (0.10.2-1.2ubuntu2) ...
Setting up python3-ntlm-auth (1.5.0-1) ...
Setting up python3-bcrypt (3.2.2-1build1) ...
Setting up python3-resolvelib (1.0.1-1) ...
Setting up python3-kerberos (1.1.14-3.1build9) ...
Setting up python3-yaml (6.0.1-2build2) ...
Setting up python3-markupsafe (2.1.5-1build2) ...
Setting up sshpass (1.09-1) ...
Setting up python3-tz (2024.1-2) ...
Setting up python-babel-localedata (2.10.3-3build1) ...
Setting up python3-xmltodict (0.13.0-1ubuntu0.24.04.1) ...
Setting up python3-jinja2 (3.1.2-1ubuntu1.3) ...
Setting up python3-packaging (24.0-1) ...
Setting up python3-chardet (5.2.0+dfsg-1) ...
Setting up python3-certifi (2023.11.17-1) ...
Setting up libx11-data (2:1.8.7-1build1) ...
Setting up python3-jmespath (1.0.1-1) ...
Setting up python3-idna (3.6-2ubuntu0.1) ...
Setting up python3-urllib3 (2.0.7-1ubuntu0.2) ...
Setting up libfido2-1:amd64 (1.14.0-1build3) ...
Setting up libbsd0:amd64 (0.12.1-1build1.1) ...
Setting up python3-nacl (1.5.0-4build1) ...
Setting up libxdmcp6:amd64 (1:1.1.3-0ubuntu6) ...
Setting up libxcb1:amd64 (1.15-1ubuntu2) ...
Setting up python3-babel (2.10.3-3build1) ...
update-alternatives: using /usr/bin/pybabel-python3 to provide /usr/bin/pybabel (pybabel) in auto mode
Setting up libedit2:amd64 (3.1-20230828-1build1) ...
Setting up ansible-core (2.19.4-1ppa~noble) ...
Setting up python3-requests (2.31.0+dfsg-1ubuntu1.1) ...
Setting up libx11-6:amd64 (2:1.8.7-1build1) ...
Setting up ansible (12.2.0-1ppa~noble) ...
Setting up python3-paramiko (2.12.0-2ubuntu4.1) ...
Setting up libxmuu1:amd64 (2:1.1.3-3build2) ...
Setting up python3-requests-ntlm (1.1.0-3) ...
Setting up openssh-client (1:9.6p1-3ubuntu13.14) ...
Setting up libxext6:amd64 (2:1.3.4-1build2) ...
Setting up xauth (1:1.1.2-1build1) ...
Setting up python3-winrm (0.4.3-2) ...
Processing triggers for libc-bin (2.39-0ubuntu8.6) ...
root@6a4bc56db574:/#

Проверяем результат:

root@6a4bc56db574:/# ansible --version
ansible [core 2.19.4]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.12.3 (main, Nov  6 2025, 13:44:16) [GCC 13.3.0] (/usr/bin/python3)
  jinja version = 3.1.2
  pyyaml version = 6.0.1 (with libyaml v0.2.5)
root@6a4bc56db574:/#

Выйдем из контейнера:

root@6a4bc56db574:/# exit
exit
[root@waky practice]#

и удалим его с помощью docker rm:

[root@waky practice]# docker rm -f ansible_container
ansible_container
[root@waky practice]#

2. Создание Dockerfile для Ubuntu

Пакеты, установленные вручную, остаются пока существует контейнер. Чтобы не устанавливать каждый раз вручную, лучше добавить их сразу в образ.

Если вы не знакомы с созданием образов в Docker, вам поможет наша отдельная статья, посвященная данной теме. Создайте Dockerfile следующего содержания:

FROM ubuntu
RUN apt-get update && apt-get install -y software-properties-common && add-apt-repository --yes --update ppa:ansible/ansible && apt-get install -y ansible

Затем соберите образ:

[root@waky practice]# docker build -t my-ubuntu-ansible .
[+] Building 283.7s (6/6) FINISHED                                                                                                                                                    docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                            0.0s
 => => transferring dockerfile: 266B                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest                                                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                                                                               0.0s
 => => transferring context: 2B                                                                                                                                                                 0.0s
 => CACHED [1/2] FROM docker.io/library/ubuntu:latest                                                                                                                                           0.0s
 => [2/2] RUN apt-get update && apt-get install -y software-properties-common && add-apt-repository --yes --update ppa:ansible/ansible && apt-get install -y ansible                          224.7s
 => exporting to image                                                                                                                                                                         58.5s
 => => exporting layers                                                                                                                                                                        58.4s
 => => writing image sha256:c27721636a23ef502ec266abf178666504c1546faaf218845168a7d238920c87                                                                                                    0.0s
 => => naming to docker.io/library/my-ubuntu-ansible                                                                                                                                            0.0s
[root@waky practice]#

Запустите контейнер из нашего образа:

[root@waky practice]# docker run -dt --name ansible_container my-ubuntu-ansible
0b3e0016aec26304809dfaa52e9e8a35dfee7c20de71097bbe770a39c265ede6
[root@waky practice]#

Проверьте, что Ansible установлен в контейнере и работает:

[root@waky practice]# docker exec -it ansible_container ansible --version
ansible [core 2.19.4]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.12.3 (main, Nov  6 2025, 13:44:16) [GCC 13.3.0] (/usr/bin/python3)
  jinja version = 3.1.2
  pyyaml version = 6.0.1 (with libyaml v0.2.5)
[root@waky practice]#

Мы направили команду в контейнер и получили версию в ответ. Ansible готов к работе.

Удалим контейнер:

[root@waky practice]# docker rm -f ansible_container
ansible_container
[root@waky practice]#

Установка Ansible в контейнере с Alpine

Для Alpine процесс практически такой же, отличие в используемом пакетном менеджере.

1. Установка вручную

Запустите контейнер Alpine:

[root@waky practice]# docker run -dt --name ansible_container alpine
5c5fe99e1f87211fbf57fbeaea5ee7a23fbc378ba39feddf523af0a0129fc19d
[root@waky practice]# 

Установка Ansible в Alpine — более сложный процесс, потому что в репозиториях меньше пакетов. Лучший способ — установить Python и pip, затем через pip — Ansible.

Заходим в контейнер:

[root@waky practice]# docker exec -it ansible_container /bin/sh
/ #

Устанавливаем Python и pip:

/ # apk add --no-cache python3 py3-pip
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/APKINDEX.tar.gz
(1/25) Installing libbz2 (1.0.8-r6)
(2/25) Installing libexpat (2.7.3-r0)
(3/25) Installing libffi (3.4.8-r0)
(4/25) Installing gdbm (1.24-r0)
(5/25) Installing xz-libs (5.8.1-r0)
(6/25) Installing libgcc (14.2.0-r6)
(7/25) Installing libstdc++ (14.2.0-r6)
(8/25) Installing mpdecimal (4.0.1-r0)
(9/25) Installing ncurses-terminfo-base (6.5_p20250503-r0)
(10/25) Installing libncursesw (6.5_p20250503-r0)
(11/25) Installing libpanelw (6.5_p20250503-r0)
(12/25) Installing readline (8.2.13-r1)
(13/25) Installing sqlite-libs (3.49.2-r1)
(14/25) Installing python3 (3.12.12-r0)
(15/25) Installing python3-pycache-pyc0 (3.12.12-r0)
(16/25) Installing pyc (3.12.12-r0)
(17/25) Installing py3-setuptools-pyc (80.9.0-r0)
(18/25) Installing py3-pip-pyc (25.1.1-r0)
(19/25) Installing py3-parsing (3.2.3-r0)
(20/25) Installing py3-parsing-pyc (3.2.3-r0)
(21/25) Installing py3-packaging-pyc (25.0-r0)
(22/25) Installing python3-pyc (3.12.12-r0)
(23/25) Installing py3-packaging (25.0-r0)
(24/25) Installing py3-setuptools (80.9.0-r0)
(25/25) Installing py3-pip (25.1.1-r0)
Executing busybox-1.37.0-r19.trigger
OK: 66 MiB in 41 packages
/ #

Переходим к установке Ansible. pip не даст установить его под рутом, нужно либо настраивать виртуальное окружение, либо использовать параметр –break-system-packages, чтобы обойти ограничения.

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

/ # pip3 install ansible --break-system-packages
Collecting ansible
  Downloading ansible-13.0.0-py3-none-any.whl.metadata (8.1 kB)
Collecting ansible-core~=2.20.0 (from ansible)
  Downloading ansible_core-2.20.0-py3-none-any.whl.metadata (7.7 kB)
Collecting jinja2>=3.1.0 (from ansible-core~=2.20.0->ansible)
  Downloading jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)
Collecting PyYAML>=5.1 (from ansible-core~=2.20.0->ansible)
  Downloading pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl.metadata (2.4 kB)
Collecting cryptography (from ansible-core~=2.20.0->ansible)
  Downloading cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl.metadata (5.7 kB)
Requirement already satisfied: packaging in /usr/lib/python3.12/site-packages (from ansible-core~=2.20.0->ansible) (25.0)
Collecting resolvelib<2.0.0,>=0.8.0 (from ansible-core~=2.20.0->ansible)
  Downloading resolvelib-1.2.1-py3-none-any.whl.metadata (3.7 kB)
Collecting MarkupSafe>=2.0 (from jinja2>=3.1.0->ansible-core~=2.20.0->ansible)
  Downloading markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl.metadata (2.7 kB)
Collecting cffi>=2.0.0 (from cryptography->ansible-core~=2.20.0->ansible)
  Downloading cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl.metadata (2.6 kB)
Collecting pycparser (from cffi>=2.0.0->cryptography->ansible-core~=2.20.0->ansible)
  Downloading pycparser-2.23-py3-none-any.whl.metadata (993 bytes)
Downloading ansible-13.0.0-py3-none-any.whl (53.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.3/53.3 MB 4.5 MB/s eta 0:00:00
Downloading ansible_core-2.20.0-py3-none-any.whl (2.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.4/2.4 MB 5.4 MB/s eta 0:00:00
Downloading resolvelib-1.2.1-py3-none-any.whl (18 kB)
Downloading jinja2-3.1.6-py3-none-any.whl (134 kB)
Downloading markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl (23 kB)
Downloading pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl (790 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 790.2/790.2 kB 18.2 MB/s eta 0:00:00
Downloading cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl (4.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.7/4.7 MB 5.1 MB/s eta 0:00:00
Downloading cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl (221 kB)
Downloading pycparser-2.23-py3-none-any.whl (118 kB)
Installing collected packages: resolvelib, PyYAML, pycparser, MarkupSafe, jinja2, cffi, cryptography, ansible-core, ansible
Successfully installed MarkupSafe-3.0.3 PyYAML-6.0.3 ansible-13.0.0 ansible-core-2.20.0 cffi-2.0.0 cryptography-46.0.3 jinja2-3.1.6 pycparser-2.23 resolvelib-1.2.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.

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

/ # ansible --version
ansible [core 2.20.0]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.12/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.12.12 (main, Oct 11 2025, 15:09:54) [GCC 14.2.0] (/usr/bin/python3)
  jinja version = 3.1.6
  pyyaml version = 6.0.3 (with libyaml v0.2.5)
/ #

Покинем контейнер и удалим его:

/ # exit
[root@waky practice]# docker rm -f ansible_container
ansible_container
[root@waky practice]#

2. Создание Dockerfile для Alpine

Перенесем все наши шаги в Dockerfile:

FROM alpine
RUN apk add --no-cache python3 py3-pip && pip3 install ansible --break-system-packages

Соберите образ:

[root@waky practice]# docker build -t my-alpine-ansible .
[+] Building 166.2s (6/6) FINISHED                                                                                                                                                    docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                            0.1s
 => => transferring dockerfile: 196B                                                                                                                                                            0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                                                                                                0.0s
 => [internal] load .dockerignore                                                                                                                                                               0.1s
 => => transferring context: 2B                                                                                                                                                                 0.0s
 => CACHED [1/2] FROM docker.io/library/alpine:latest                                                                                                                                           0.0s
 => [2/2] RUN apk add --no-cache python3 py3-pip && pip3 install ansible --break-system-packages                                                                                              132.2s
 => exporting to image                                                                                                                                                                         33.3s
 => => exporting layers                                                                                                                                                                        33.2s
 => => writing image sha256:9548da87cc1d41b80ad1a56938efe2fa98ffdd6a21659e1bd647d90d0efd1856                                                                                                    0.0s
 => => naming to docker.io/library/my-alpine-ansible                                                                                                                                            0.0s
[root@waky practice]#

Запустите контейнер из полученного образа:

[root@waky practice]# docker run -dt --name ansible_container my-alpine-ansible
78a3e6e715d66ed3855f275d3edce970de30fadb2860949a7d3f90e9cde3dc14
[root@waky practice]#

Проверим, что Ansible установлен и работает:

[root@waky practice]# docker exec -it ansible_container ansible --version
ansible [core 2.20.0]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.12/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.12.12 (main, Oct 11 2025, 15:09:54) [GCC 14.2.0] (/usr/bin/python3)
  jinja version = 3.1.6
  pyyaml version = 6.0.3 (with libyaml v0.2.5)
[root@waky practice]#

Ansible успешно установлен и готов к работе.

Заключение

Мы с вами рассмотрели два способа установки Ansible в Docker контейнер. Если вы собираетесь использовать такой контейнер на постоянной основе, используйте вариант с Dockerfile.

Для Ubuntu установка Ansible проста благодаря пакетам из PPA и стандартной системе управления пакетами.

Для Alpine — предпочтительно использовать pip, чтобы установить Ansible, поскольку репозитории при минималистичном образе не содержат этого пакета.