This commit is contained in:
2025-03-20 11:16:54 +03:00
parent 85ccc44d7e
commit 1c3e6949e1
8 changed files with 120 additions and 30 deletions

View File

@@ -39,7 +39,7 @@ test:
- echo "Распаковываем секреты..." - echo "Распаковываем секреты..."
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml - ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
- echo "Запускаем тесты через Молекулу..." - echo "Запускаем тесты через Молекулу..."
- molecule test --parallel - molecule test --parallel --destroy=always
- echo "Упаковываем секреты..." - echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt - ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
allow_failure: false allow_failure: false

View File

@@ -50,8 +50,8 @@ RUN pip install --upgrade pip && \
docker docker
# Копируем ssh ключ # Копируем ssh ключ
COPY id_rsa /root/.ssh/id_rsa #COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa #RUN chmod 600 /root/.ssh/id_rsa
# Устанавливаем рабочую директорию # Устанавливаем рабочую директорию
WORKDIR /ansible WORKDIR /ansible

22
Dockerfile-CentOS Normal file
View File

@@ -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"]

20
Dockerfile-Ubuntu Normal file
View File

@@ -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"]

View File

@@ -1,7 +1,7 @@
# Глобальные переменные # Глобальные переменные
IMAGE ?= ansible IMAGE ?= ansible
TAG ?= 0.1 TAG ?= 0.1
REGISTRY ?= hub.cism-ms.ru REGISTRY ?= hub.cism-ms.ru/ansible
# По умолчанию используем docker. Для локальной разработки используйте docker-compose # По умолчанию используем docker. Для локальной разработки используйте docker-compose
RUN_MODE ?= docker RUN_MODE ?= docker
@@ -13,15 +13,16 @@ else ifeq ($(RUN_MODE), docker)
--name $(IMAGE) \ --name $(IMAGE) \
-v $(PWD):/ansible \ -v $(PWD):/ansible \
-v /var/run/docker.sock:/var/run/docker.sock \ -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 \ -e ANSIBLE_VAULT_PASSWORD_FILE=/ansible/vault-password.txt \
--privileged \ --privileged \
--workdir /ansible \ --workdir /ansible \
$(REGISTRY)/ansible/$(IMAGE) $(REGISTRY)/$(IMAGE)
else else
$(error Invalid RUN_MODE. Use "docker-compose" or "docker") $(error Invalid RUN_MODE. Use "docker-compose" or "docker")
endif 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 @true
#################################################################################################### ####################################################################################################
@@ -30,14 +31,15 @@ view create edit show delete test lint deploy new init build rebuild prune relea
init: init:
@echo "Шаг 1: Создание Docker-образа..." @echo "Шаг 1: Создание Docker-образа..."
@make docker build @make docker build
@echo "Шаг 2: Создание нового vault-файла с паролем..." @echo "Шаг 2: Создание Docker-образов для запуска Molecule..."
@make docker images
@echo "Шаг 3: Создание нового vault-файла с паролем..."
@read -p "Введите пароль для vault: " VAULT_PASSWORD; \ @read -p "Введите пароль для vault: " VAULT_PASSWORD; \
echo "$$VAULT_PASSWORD" > vault-password.txt; \ echo "$$VAULT_PASSWORD" > vault-password.txt; \
make vault create make vault create
@echo "Шаг 3: Создание нового брэнча в гите..." @echo "Шаг 4: Создание нового брэнча в гите..."
@make git new @make git new
@echo "Шаг 5: Создание новой роли..."
@echo "Шаг 4: Создание новой роли..."
@make role new @make role new
#################################################################################################### ####################################################################################################
@@ -47,30 +49,33 @@ docker:
@case "$(word 2, $(MAKECMDGOALS))" in \ @case "$(word 2, $(MAKECMDGOALS))" in \
build) \ build) \
docker buildx create --use --name multiarch-builder --driver docker-container; \ docker buildx create --use --name multiarch-builder --driver docker-container; \
cp ~/.ssh/id_rsa .; \
if [ "$(RUN_MODE)" = "docker-compose" ]; then \ if [ "$(RUN_MODE)" = "docker-compose" ]; then \
docker compose build $(c); \ docker compose build $(c); \
else \ else \
docker build -t $(REGISTRY)/ansible/$(IMAGE) .; \ docker build -t $(REGISTRY)/$(IMAGE) .; \
fi; \ fi;; \
rm id_rsa;; \
rebuild) \ rebuild) \
docker buildx create --use --name multiarch-builder --driver docker-container; \ docker buildx create --use --name multiarch-builder --driver docker-container; \
cp ~/.ssh/id_rsa .; \
if [ "$(RUN_MODE)" = "docker-compose" ]; then \ if [ "$(RUN_MODE)" = "docker-compose" ]; then \
docker compose build --no-cache $(c); \ docker compose build --no-cache $(c); \
else \ else \
docker build --no-cache -t $(REGISTRY)/ansible/$(IMAGE) .; \ docker build --no-cache -t $(REGISTRY)/$(IMAGE) .; \
fi; \ fi;; \
rm id_rsa;; \
prune) \ prune) \
docker system prune -af;; \ docker system prune -af;; \
shell) \
clear; \
echo "Entering to Ansible container shell..."; \
$(RUN) bash ;; \
release) \ release) \
docker buildx create --use --name multiarch-builder --driver docker-container; \ docker buildx create --use --name multiarch-builder --driver docker-container; \
cp ~/.ssh/id_rsa .; \
docker login $(REGISTRY); \ docker login $(REGISTRY); \
docker buildx build -t $(REGISTRY)/ansible/$(IMAGE):$(TAG) -t $(REGISTRY)/ansible/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .; \ docker buildx build -t $(REGISTRY)/$(IMAGE):$(TAG) -t $(REGISTRY)/$(IMAGE):latest --platform linux/amd64,linux/arm64 --push .;; \
rm id_rsa;; \ 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";; \ *) echo "Unknown action. Available actions: build, rebuild, prune, release";; \
esac esac
@@ -84,6 +89,8 @@ vault:
edit) $(RUN) bash -c "ansible-vault edit --vault-password-file vault-password.txt vars/secrets.yml";; \ edit) $(RUN) bash -c "ansible-vault edit --vault-password-file vault-password.txt vars/secrets.yml";; \
delete) $(RUN) bash -c "rm 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";; \ 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";; \ *) echo "Unknown action";; \
esac esac
@@ -110,7 +117,7 @@ role:
clear; \ clear; \
echo "Running test roles..."; \ echo "Running test roles..."; \
$(RUN) bash -c "ansible-vault decrypt --vault-password-file vault-password.txt vars/secrets.yml"; \ $(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";; \ $(RUN) bash -c "ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file vault-password.txt";; \
deploy) \ deploy) \
clear; \ clear; \

View File

@@ -11,7 +11,9 @@
- **make docker build** - создание контейнера - **make docker build** - создание контейнера
- **make docker rebuild** - пересоздание контейнера, если были внесены изменения в Dockerfile - **make docker rebuild** - пересоздание контейнера, если были внесены изменения в Dockerfile
- **make docker prune** - очистить систему от лишних образов - **make docker prune** - очистить систему от лишних образов
- **make docker shell** - войти в контейнер Shell
- **make docker release** - собирает образ контейнера и пушит его в докер реджистри - **make docker release** - собирает образ контейнера и пушит его в докер реджистри
- **make docker images** - собрать образы контейнеров с systemd, для удобного тестирования ролей.
Или ввести команду: Или ввести команду:
@@ -35,6 +37,8 @@
- **make vault edit** - отредактировать файл переменных - **make vault edit** - отредактировать файл переменных
- **make vault show** - показать содержимое файла переменных - **make vault show** - показать содержимое файла переменных
- **make vault rekey** - сменить пароль шифрования - **make vault rekey** - сменить пароль шифрования
- **make vault encrypt** - зашифровать файл секретов
- **make vault decrypt** - расшифровать файл секретов
### Работа с Git ### Работа с Git
@@ -48,8 +52,10 @@
molecule/default/molecule.yml molecule/default/molecule.yml
```yaml ```yaml
- name: ubuntu-instance - name: ubuntu-instance
image: "geerlingguy/docker-ubuntu2004-ansible:latest" image: "your.docker-registry.com/your-image:latest"
privileged: true privileged: true
pre_build_image: true pre_build_image: true
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
``` ```
помните, что образ обязательно должен содержать python не ниже версии 3.12 Помните, что образ обязательно должен содержать python не ниже версии 3.12 и systemd для нормального тестирования ролей.

View File

@@ -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 }}"

View File

@@ -9,15 +9,26 @@ driver:
name: docker name: docker
platforms: platforms:
- name: centos-instance - name: centos
image: "quay.io/fedora/python-312" image: "hub.cism-ms.ru/ansible/centos:latest"
privileged: true privileged: true
pre_build_image: true pre_build_image: true
volumes:
- name: ubuntu-instance - /sys/fs/cgroup:/sys/fs/cgroup:ro
image: "geerlingguy/docker-ubuntu2004-ansible:latest" - /var/run/docker.sock:/var/run/docker.sock
tmpfs:
- /tmp
- /run
- name: ubuntu
image: "hub.cism-ms.ru/ansible/ubuntu:latest"
privileged: true privileged: true
pre_build_image: 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: provisioner:
name: ansible name: ansible
@@ -29,6 +40,22 @@ provisioner:
lint: lint:
name: ansible-lint name: ansible-lint
verifier: verifier:
name: ansible name: ansible
scenario:
name: default
test_sequence:
- dependency
- cleanup
- destroy
- syntax
- create
- prepare
- converge
- idempotence
- side_effect
- verify
- cleanup
- destroy