diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0483ba5..3d32e75 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,7 +39,7 @@ test: - echo "Распаковываем секреты..." - ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml - echo "Запускаем тесты через Молекулу..." - - molecule test --parallel + - molecule test --parallel --destroy=always - echo "Упаковываем секреты..." - ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt allow_failure: false diff --git a/Dockerfile b/Dockerfile index d703bce..aa8fc36 100644 --- a/Dockerfile +++ b/Dockerfile @@ -50,8 +50,8 @@ RUN pip install --upgrade pip && \ docker # Копируем ssh ключ -COPY id_rsa /root/.ssh/id_rsa -RUN chmod 600 /root/.ssh/id_rsa +#COPY id_rsa /root/.ssh/id_rsa +#RUN chmod 600 /root/.ssh/id_rsa # Устанавливаем рабочую директорию WORKDIR /ansible diff --git a/Dockerfile-CentOS b/Dockerfile-CentOS new file mode 100644 index 0000000..0e4a063 --- /dev/null +++ b/Dockerfile-CentOS @@ -0,0 +1,22 @@ +# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule + +# Используем официальный образ Fedora +FROM quay.io/fedora/python-312 + +USER root + +# Обновляем пакеты и устанавливаем systemd +RUN dnf -y update && \ + dnf -y install systemd rsync && \ + dnf clean all && \ + rm -rf /var/cache/dnf /tmp/* /var/tmp/* + +# Настраиваем окружение для systemd +ENV container=docker +STOPSIGNAL SIGRTMIN+3 + +# Создаем необходимые директории для systemd +VOLUME [ "/sys/fs/cgroup" ] + +# Запускаем systemd при старте контейнера +CMD ["/sbin/init"] \ No newline at end of file diff --git a/Dockerfile-Ubuntu b/Dockerfile-Ubuntu new file mode 100644 index 0000000..7c3ed80 --- /dev/null +++ b/Dockerfile-Ubuntu @@ -0,0 +1,20 @@ +# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule + +# Используем официальный образ Ubuntu 20.04 +FROM geerlingguy/docker-ubuntu2004-ansible:latest + +# Обновляем пакеты и устанавливаем systemd +RUN apt-get update && \ + apt-get install -y systemd systemd-sysv rsync && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# Указываем, что контейнер использует systemd в качестве init-системы +ENV container=docker +STOPSIGNAL SIGRTMIN+3 + +# Создаем необходимые директории для systemd +VOLUME [ "/sys/fs/cgroup" ] + +# Запускаем systemd при старте контейнера +CMD ["/sbin/init"] \ No newline at end of file diff --git a/Makefile b/Makefile index b9974cb..7d96b56 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Глобальные переменные IMAGE ?= ansible TAG ?= 0.1 -REGISTRY ?= hub.cism-ms.ru +REGISTRY ?= hub.cism-ms.ru/ansible # По умолчанию используем docker. Для локальной разработки используйте docker-compose RUN_MODE ?= docker @@ -13,15 +13,16 @@ else ifeq ($(RUN_MODE), docker) --name $(IMAGE) \ -v $(PWD):/ansible \ -v /var/run/docker.sock:/var/run/docker.sock \ + -v ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro \ -e ANSIBLE_VAULT_PASSWORD_FILE=/ansible/vault-password.txt \ --privileged \ --workdir /ansible \ - $(REGISTRY)/ansible/$(IMAGE) + $(REGISTRY)/$(IMAGE) else $(error Invalid RUN_MODE. Use "docker-compose" or "docker") endif -view create edit show delete test lint deploy new init build rebuild prune release push pull: +view create edit show delete test lint deploy new init build rebuild prune release images push pull shell: @true #################################################################################################### @@ -30,14 +31,15 @@ view create edit show delete test lint deploy new init build rebuild prune relea init: @echo "Шаг 1: Создание Docker-образа..." @make docker build - @echo "Шаг 2: Создание нового vault-файла с паролем..." + @echo "Шаг 2: Создание Docker-образов для запуска Molecule..." + @make docker images + @echo "Шаг 3: Создание нового vault-файла с паролем..." @read -p "Введите пароль для vault: " VAULT_PASSWORD; \ echo "$$VAULT_PASSWORD" > vault-password.txt; \ make vault create - @echo "Шаг 3: Создание нового брэнча в гите..." + @echo "Шаг 4: Создание нового брэнча в гите..." @make git new - - @echo "Шаг 4: Создание новой роли..." + @echo "Шаг 5: Создание новой роли..." @make role new #################################################################################################### @@ -47,30 +49,33 @@ docker: @case "$(word 2, $(MAKECMDGOALS))" in \ build) \ docker buildx create --use --name multiarch-builder --driver docker-container; \ - cp ~/.ssh/id_rsa .; \ if [ "$(RUN_MODE)" = "docker-compose" ]; then \ docker compose build $(c); \ else \ - docker build -t $(REGISTRY)/ansible/$(IMAGE) .; \ - fi; \ - rm id_rsa;; \ + docker build -t $(REGISTRY)/$(IMAGE) .; \ + fi;; \ rebuild) \ docker buildx create --use --name multiarch-builder --driver docker-container; \ - cp ~/.ssh/id_rsa .; \ if [ "$(RUN_MODE)" = "docker-compose" ]; then \ docker compose build --no-cache $(c); \ else \ - docker build --no-cache -t $(REGISTRY)/ansible/$(IMAGE) .; \ - fi; \ - rm id_rsa;; \ + docker build --no-cache -t $(REGISTRY)/$(IMAGE) .; \ + fi;; \ prune) \ docker system prune -af;; \ + shell) \ + clear; \ + echo "Entering to Ansible container shell..."; \ + $(RUN) bash ;; \ release) \ docker buildx create --use --name multiarch-builder --driver docker-container; \ - cp ~/.ssh/id_rsa .; \ docker login $(REGISTRY); \ - docker buildx build -t $(REGISTRY)/ansible/$(IMAGE):$(TAG) -t $(REGISTRY)/ansible/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .; \ - rm id_rsa;; \ + docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .;; \ + images) \ + docker buildx create --use --name multiarch-builder --driver docker-container; \ + docker login $(REGISTRY); \ + docker buildx build -t $(REGISTRY)/centos:latest --platform linux/amd64,linux/arm64 --push -f Dockerfile-CentOS .; \ + docker buildx build -t $(REGISTRY)/ubuntu:latest --platform linux/amd64,linux/arm64 --push -f Dockerfile-Ubuntu .;; \ *) echo "Unknown action. Available actions: build, rebuild, prune, release";; \ esac @@ -84,6 +89,8 @@ vault: edit) $(RUN) bash -c "ansible-vault edit --vault-password-file vault-password.txt vars/secrets.yml";; \ delete) $(RUN) bash -c "rm vars/secrets.yml";; \ rekey) $(RUN) bash -c "ansible-vault rekey --vault-password-file vault-password.txt vars/secrets.yml";; \ + decrypt) $(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml";; \ + encrypt) $(RUN) bash -c "ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault-password.txt vars/secrets.yml";; \ *) echo "Unknown action";; \ esac @@ -110,7 +117,7 @@ role: clear; \ echo "Running test roles..."; \ $(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml"; \ - $(RUN) bash -c "molecule test --parallel"; \ + $(RUN) bash -c "docker login $(REGISTRY) && molecule test --parallel --destroy=always"; \ $(RUN) bash -c "ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file vault-password.txt";; \ deploy) \ clear; \ diff --git a/README.md b/README.md index 7b0b9ec..4c967db 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ - **make docker build** - создание контейнера - **make docker rebuild** - пересоздание контейнера, если были внесены изменения в Dockerfile - **make docker prune** - очистить систему от лишних образов +- **make docker shell** - войти в контейнер Shell - **make docker release** - собирает образ контейнера и пушит его в докер реджистри +- **make docker images** - собрать образы контейнеров с systemd, для удобного тестирования ролей. Или ввести команду: @@ -35,6 +37,8 @@ - **make vault edit** - отредактировать файл переменных - **make vault show** - показать содержимое файла переменных - **make vault rekey** - сменить пароль шифрования +- **make vault encrypt** - зашифровать файл секретов +- **make vault decrypt** - расшифровать файл секретов ### Работа с Git @@ -48,8 +52,10 @@ molecule/default/molecule.yml ```yaml - name: ubuntu-instance - image: "geerlingguy/docker-ubuntu2004-ansible:latest" + image: "your.docker-registry.com/your-image:latest" privileged: true pre_build_image: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro ``` -помните, что образ обязательно должен содержать python не ниже версии 3.12 \ No newline at end of file +Помните, что образ обязательно должен содержать python не ниже версии 3.12 и systemd для нормального тестирования ролей. \ No newline at end of file diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml new file mode 100644 index 0000000..82979c7 --- /dev/null +++ b/molecule/default/destroy.yml @@ -0,0 +1,8 @@ +- name: Destroy containers on interrupt + hosts: localhost + tasks: + - name: Ensure containers are destroyed + docker_container: + name: "{{ item.name }}" + state: absent + loop: "{{ molecule_yml.platforms }}" \ No newline at end of file diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml index 106748c..9ceea66 100644 --- a/molecule/default/molecule.yml +++ b/molecule/default/molecule.yml @@ -9,15 +9,26 @@ driver: name: docker platforms: - - name: centos-instance - image: "quay.io/fedora/python-312" + - name: centos + image: "hub.cism-ms.ru/ansible/centos:latest" privileged: true pre_build_image: true - - - name: ubuntu-instance - image: "geerlingguy/docker-ubuntu2004-ansible:latest" + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + tmpfs: + - /tmp + - /run + - name: ubuntu + image: "hub.cism-ms.ru/ansible/ubuntu:latest" privileged: true pre_build_image: true + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:ro + - /var/run/docker.sock:/var/run/docker.sock + tmpfs: + - /tmp + - /run provisioner: name: ansible @@ -29,6 +40,22 @@ provisioner: lint: name: ansible-lint - verifier: name: ansible + +scenario: + name: default + test_sequence: + - dependency + - cleanup + - destroy + - syntax + - create + - prepare + - converge + - idempotence + - side_effect + - verify + - cleanup + - destroy +