nickjj.docker

Co to jest ansible-docker? CI

To jest rola Ansible, która:

  • Instaluje Docker (wsparcie dla edycji, kanałów i wersji)
  • Instaluje Docker Compose v2 i / lub Docker Compose v1 (wsparcie dla wersji)
  • Instaluję pakiet docker PIP, aby moduły docker_* w Ansible działały
  • Zarządza danymi logowania do rejestru Docker
  • Konfiguruje jednego lub więcej użytkowników do uruchamiania Dockera bez dostępu root
  • Konfiguruje opcje demona Dockera i zmienne środowiskowe
  • Konfiguruje zadanie cron do wykonywania poleceń czyszczenia Docker

Dlaczego warto użyć tej roli?

Jeżeli tak jak ja, lubisz Dockera, to ta rola dostarcza wszystko, co potrzebujesz, aby rozpocząć pracę z gotowym do użycia hostem Docker.

Jeśli nie wiesz, czym jest Docker, lub chcesz stać się ekspertem w tej dziedzinie, zajrzyj do Dive into Docker: The Complete Docker Course for Developers.

Obsługiwane platformy

  • Ubuntu 20.04 LTS (Focal Fossa)
  • Ubuntu 22.04 LTS (Jammy Jellyfish)
  • Debian 11 (Bullseye)
  • Debian 12 (Bookworm)

Poprzednie wersje mogą działać lub nie, ale nie są oficjalnie wspierane.


Patrzysz na dokumentację gałęzi master, która może być zaktualizowana w stosunku do najnowszej wersji. Przełącz na najnowszą wersję.


Szybki start

Filozofia moich ról polega na tym, aby ułatwić rozpoczęcie pracy, ale także zapewnić możliwość dostosowania niemal wszystkiego.

Co jest skonfigurowane domyślnie?

Zainstalowana zostanie najnowsza stabilna wersja Docker CE i Docker Compose v2, oczyszczanie dysku Docker odbywa się raz w tygodniu, a logi kontenerów Docker będą wysyłane do journald.

Przykład playbooka

---

# docker.yml

- name: Przykład
  hosts: "all"
  become: true

  roles:
    - role: "nickjj.docker"
      tags: ["docker"]

Użycie: ansible-playbook docker.yml

Instalacja

$ ansible-galaxy install nickjj.docker

Domyślne zmienne roli

Instalacja Dockera

Kanał

Chcesz używać kanału "stable" czy "test"? Możesz dodać więcej niż jeden (kolejność ma znaczenie).

docker__channel: ["stable"]

Wersja

  • Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Dockera
  • Gdy ustawione na konkretną wersję, ta wersja Dockera zostanie zainstalowana i przypięta
docker__version: ""

# Na przykład, przypinając do wersji 25.0.
docker__version: "25.0"

# Na przykład, przypinając do bardziej precyzyjnej wersji 25.0.
docker__version: "25.0.5"

Wersje są przypinane z * na końcu wersji pakietu, więc dostaniesz mniejsze i poprawki zabezpieczeń, chyba że przypniesz dokładną wersję.

Strategia aktualizacji
  • Gdy ustawione na "present", uruchomienie tej roli w przyszłości nie zainstaluje nowszych wersji (jeśli są dostępne)
  • Gdy ustawione na "latest", uruchomienie tej roli w przyszłości zainstaluje nowsze wersje (jeśli są dostępne)
docker__state: "present"
Strategia downgrade

Najłatwiejszym sposobem na downgrade byłoby ręczne odinstalowanie pakietu Docker, a następnie uruchomienie tej roli z przypiętą konkretną wersją Dockera.

# Komenda Ansible do zatrzymania i usunięcia pakietu Docker CE na wszystkich hostach.
ansible all -m systemd -a "name=docker-ce state=stopped" \
  -m apt -a "name=docker-ce autoremove=true purge=true state=absent" -b

Instalacja Docker Compose v2

Docker Compose v2 zostanie zainstalowane przy użyciu oficjalnego docker-compose-plugin, którym zarządza Docker.

Wersja

  • Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Docker Compose v2
  • Gdy ustawione na konkretną wersję, ta wersja Docker Compose v2 zostanie zainstalowana i przypięta
docker__compose_v2_version: ""

# Na przykład, przypinając do wersji 2.29.
docker__compose_v2_version: "2.29"

# Na przykład, przypinając do bardziej precyzyjnej wersji 2.29.1.
docker__compose_v2_version: "2.29.1"
Strategia aktualizacji

Będzie korzystać z zmiennej docker__state opisanej powyżej w sekcji Docker z tymi samymi zasadami.

Strategia downgrade

Jak w przypadku samego Dockera, najłatwiejszym sposobem na odinstalowanie Docker Compose v2 jest ręczne uruchomienie poniższej komendy, a następnie przypięcie konkretnej wersji Docker Compose v2.

# Komenda Ansible do usunięcia pakietu Docker Compose Plugin na wszystkich hostach.
ansible all -m apt -a "name=docker-compose-plugin autoremove=true purge=true state=absent" -b

Instalacja Docker Compose v1

Domyślnie ta rola nie instaluje Docker Compose v1, ponieważ jest on oficjalnie wycofany i nie otrzymuje już aktualizacji od Dockera. Jednak ta rola jest w stanie go zainstalować. Wystarczy ustawić docker__pip_docker_compose_state: "present", ponieważ ta rola domyślnie ustawia tę wartość na absent.

Technicznie obie wersje mogą być zainstalowane razem, ponieważ v1 uzyskuje dostęp za pomocą docker-compose, a v2 za pomocą docker compose (zwróć uwagę na brak myślnika).

Sugerowałbym, aby nie instalować v1, chyba że naprawdę go potrzebujesz do celów legacy. Jeśli zdecydujesz się go zainstalować, możesz skonfigurować, która wersja zostanie zainstalowana poniżej. Jeśli nie zostanie ustawiona do zainstalowania, te wersje zostaną pozostawione nieużywane:

Wersja

  • Gdy ustawione na "", zainstalowana zostanie najnowsza wersja Docker Compose v1
  • Gdy ustawione na konkretną wersję, ta wersja Docker Compose v1 zostanie zainstalowana i przypięta
docker__compose_version: ""

# Na przykład, przypinając do wersji 1.29.
docker__compose_version: "1.29"

# Na przykład, przypinając do bardziej precyzyjnej wersji 1.29.
docker__compose_version: "1.29.2"

Strategie aktualizacji i downgrade będą opisane w innej sekcji tego dokumentu.

Konfigurowanie użytkowników do uruchamiania Dockera bez root

Lista użytkowników, którzy mają zostać dodani do grupy docker.

Pamiętaj, że ten użytkownik musi już istnieć, ta rola go nie tworzy. Jeśli chcesz tworzyć użytkowników, sprawdź moją rolę użytkownika.

Ta rola nie konfiguruje Namespace Użytkownika ani innych funkcji bezpieczeństwa domyślnie. Jeśli dodany tutaj użytkownik ma dostęp SSH do serwera, to effectively dajesz mu dostęp root do serwera, ponieważ może uruchamiać Dockera bez sudo i mapować woluminy w dowolnej lokalizacji w systemie plików.

W kontrolowanym środowisku jest to bezpieczne, ale jak w przypadku wszystkiego związane z bezpieczeństwem, warto to wiedzieć na wstępie. Możesz włączyć Namespace Użytkownika i wszelkie inne opcje za pomocą zmiennej docker__daemon_json, która jest opisana później.

# Domyślnie próbuj użyć użytkownika sudo, ale wróć do root.
docker__users: ["{{ ansible_env.SUDO_USER | d('root') }}"]

# Na przykład, jeśli użytkownik, którego chcesz ustawić jest inny niż użytkownik sudo.
docker__users: ["admin"]

Konfigurowanie logowania do rejestru Docker

Zaloguj się do jednego lub więcej rejestrów Docker (takich jak Docker Hub).

# Twoje dane logowania trafią do katalogu domowego tego użytkownika.
docker__login_become_user: "{{ docker__users | first | d('root') }}"
# 0 lub więcej rejestrów do logowania.
docker__registries:
  - #registry_url: "https://index.docker.io/v1/"
    username: "twoja_nazwa_użytkownika_docker_hub"
    password: "twoje_hasło_docker_hub"
    #email: "twó[email protected]"
    #reauthorize: false
    #config_path: "$HOME/.docker/config.json"
    #state: "present"
docker__registries: []

Właściwości poprzedzone * są wymagane.

  • registry_url domyślnie ustawione na https://index.docker.io/v1/
  • *username to twoja nazwa użytkownika rejestru Docker
  • *password to twoje hasło rejestru Docker
  • email domyślnie nie jest używane (nie wszystkie rejestry go używają)
  • reauthorize domyślnie ustawione na false, a gdy true to aktualizuje twoje dane logowania
  • config_path domyślnie do katalogu docker__login_become_user's $HOME
  • state domyślnie ustawione na "present", gdy "absent" logowanie zostanie usunięte

Konfigurowanie opcji demona Docker (json)

Domyślne opcje demona Docker, jakie miałyby być w /etc/docker/daemon.json.

docker__default_daemon_json: |
  "log-driver": "journald",
  "features": {
    "buildkit": true
  }

# Dodaj swoje własne dodatkowe opcje demona bez nadpisywania domyślnych opcji.
# Trzyma się tego samego formatu co domyślne opcje, i nie martw się o
# rozpoczęcie od przecinka. Szablon doda przecinek, jeśli będzie to potrzebne.
docker__daemon_json: ""

Konfigurowanie opcji demona Docker (flagi)

Flagi, które są ustawiane podczas uruchamiania demona Docker, nie mogą być zmieniane w pliku daemon.json. Domyślnie Docker ustawia -H unix://, co oznacza, że ta opcja nie może być zmieniana za pomocą opcji json.

Dodaj lub zmień flagi startowe demona Docker podając je dokładnie tak, jak miałyby się pojawić w wierszu poleceń.

# Każda flaga wiersza poleceń powinna być osobnym elementem na liście.
#
# Używasz wersji Dockera sprzed 18.09?
#   Musisz ustawić `-H fd://` zamiast `-H unix://`.
docker__daemon_flags:
  - "-H unix://"

Jeżeli nie dostarczysz jakiegoś rodzaju flagi -H tutaj, Docker nie uruchomi się.

Konfigurowanie zmiennych środowiskowych demona Docker

docker__daemon_environment: []

# Na przykład, oto jak ustawić kilka zmiennych środowiskowych proxy.
docker__daemon_environment:
  - "HTTP_PROXY=http://proxy.example.com:80"
  - "HTTPS_PROXY=https://proxy.example.com:443"

Konfigurowanie zaawansowanych dyrektyw systemd

Ta rola pozwala pakietowi Docker zarządzać swoim własnym plikiem jednostki systemd i dostosowywać takie rzeczy jak flagi demona Docker i zmienne środowiskowe, używając wzoru nadpisania systemd.

Jeśli wiesz, co robisz, możesz nadpisać lub dodać do jakiejkolwiek dyrektywy systemd Dockera, ustawiając tę zmienną. Cokolwiek dodasz do tego ciągu, zostanie zapisane w /etc/systemd/system/docker.service.d/custom.conf tak, jak jest.

docker__systemd_override: ""

Konfigurowanie związanych z Docker zadania cron

Domyślnie to zadanie bezpiecznie zwolni miejsce na dysku używane przez Dockera w każdą niedzielę o północy.

# `a` usuwa nieużywane obrazy (przydatne w produkcji).
# `f` wymusza, aby to się zdarzyło bez pytania o zgodę.
docker__cron_jobs_prune_flags: "af"

# Kontroluje harmonogram czyszczenia systemu Dockera.
docker__cron_jobs_prune_schedule: ["0", "0", "*", "*", "0"]

docker__cron_jobs:
  - name: "Czyszczenie dysku Docker"
    job: "docker system prune -{{ docker__cron_jobs_prune_flags }} > /dev/null 2>&1"
    schedule: "{{ docker__cron_jobs_prune_schedule }}"
    cron_file: "docker-disk-clean-up"
    #user: "{{ (docker__users | first) | d('root') }}"
    #state: "present"

Właściwości poprzedzone * są wymagane.

  • *name to opis zadania cron
  • *job to polecenie, które ma być uruchomione w zadaniu cron
  • *schedule to format standardowego zadania cron na każdą niedzielę o północy
  • *cron_file zapisuje plik cron w /etc/cron.d, zamiast w indywidualnej crontabie użytkownika
  • user domyślnie ustawione na pierwszego użytkownika docker__users lub root, jeśli ten nie jest dostępny
  • state domyślnie ustawione na "present", gdy "absent" plik cron zostanie usunięty

Konfigurowanie menedżera pakietów APT

Docker wymaga zainstalowania kilku zależności, aby działał. Nie powinieneś musieć edytować żadnej z tych zmiennych.

# Lista pakietów do zainstalowania.
docker__package_dependencies:
  - "apt-transport-https"
  - "ca-certificates"
  - "cron"
  - "gnupg2"
  - "software-properties-common"

# Ansible identyfikuje architektury CPU inaczej niż Docker.
docker__architecture_map:
  "x86_64": "amd64"
  "aarch64": "arm64"
  "aarch": "arm64"
  "armhf": "armhf"
  "armv7l": "armhf"

# Adres URL klucza GPG Dockera.
docker__apt_repository_url: "https://download.docker.com/linux/{{ ansible_distribution | lower }}"

# Wartość sumy kontrolnej klucza GPG Dockera.
docker__apt_key_checksum: "sha256:1500c1f56fa9e26b9b8f42452a553675796ade0807cdce11975eb98170b3a570"

# Górny rejestr APT Dockera.
docker__apt_repository: >
  deb [arch={{ docker__architecture_map[ansible_architecture] }}
  signed-by=/etc/apt/keyrings/docker.asc]
  {{ docker__apt_repository_url }}
  {{ ansible_distribution_release }} {{ docker__channel | join(' ') }}

Instalacja pakietów Pythona z Virtualenv i PIP

Konfigurowanie Virtualenv

Zamiast zanieczyszczać wersję Pythona na serwerze, wszystkie pakiety PIP są instalowane w Virtualenv według twojego wyboru.

docker__pip_virtualenv: "/usr/local/lib/docker/virtualenv"

Instalacja PIP i jego zależności

Ta rola instaluje PIP, ponieważ Docker Compose v1 jest instalowane za pomocą pakietu docker-compose PIP, a moduły docker_* w Ansible używają pakietu docker PIP.

docker__pip_dependencies:
  - "gcc"
  - "python3-setuptools"
  - "python3-dev"
  - "python3-pip"
  - "virtualenv"

Instalacja pakietów PIP

docker__default_pip_packages:
  - name: "docker"
    state: "{{ docker__pip_docker_state }}"
  - name: "docker-compose"
    version: "{{ docker__compose_version }}"
    path: "/usr/local/bin/docker-compose"
    src: "{{ docker__pip_virtualenv + '/bin/docker-compose' }}"
    state: "{{ docker__pip_docker_compose_state }}"

# Dodaj swoje własne pakiety PIP z tymi samymi właściwościami jak powyżej.
docker__pip_packages: []

Właściwości poprzedzone * są wymagane.

  • *name to nazwa pakietu
  • version to wersja pakietu do zainstalowania (lub "" jeśli nie jest to określone)
  • path to docelowa ścieżka symlinka
  • src to źródłowa ścieżka do symlinka
  • state domyślnie ustawione na "present", inne wartości mogą być "forcereinstall" lub "absent"
Stan pakietu PIP
  • Gdy ustawione na "present", pakiet zostanie zainstalowany, ale nie zaktualizowany w przyszłych uruchomieniach
  • Gdy ustawione na "forcereinstall", pakiet zawsze zostanie (re)zainstalowany i zaktualizowany w przyszłych uruchomieniach
  • Gdy ustawione na "absent", pakiet zostanie pominięty lub usunięty
docker__pip_docker_state: "present"
docker__pip_docker_compose_state: "absent"

Praca z modułami docker_* w Ansible

Ta rola używa docker_login do logowania się do rejestru Docker, ale możesz też używać innych modułów docker_* w swoich rolach. Nie będą one działać, jeśli nie poinstruujesz Ansible, aby użył Virtualenv tej roli.

Na poziomie inwentarza, playbooka lub zadania musisz ustawić ansible_python_interpreter: "/usr/local/bin/python3-docker". To działa, ponieważ ta rola tworzy skrypt proxy z binarnym plikiem Pythona Virtualenv do python3-docker.

Możesz spojrzeć na zadanie docker_login tej roli jako przykład, jak to zrobić na poziomie zadania.

Licencja

MIT

O projekcie

Install and configure Docker / Docker Compose.

Zainstaluj
ansible-galaxy install nickjj.docker
Licencja
mit
Pobrania
649.7k
Właściciel
Currently a self employed freelance developer & teacher. I mainly work with Flask, Rails, Bash, Docker, Kubernetes, Ansible & Terraform. Also a @docker captain.