adding separate deploy_portainer_stack role
parent
5cd48b220f
commit
d230b4aa8e
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
# defaults file for chatton.deploy_portainer_stack
|
||||||
|
|
||||||
|
portainer_stack_name: ""
|
||||||
|
# required directories for this stack
|
||||||
|
portainer_stack_directories: []
|
||||||
|
|
||||||
|
# variables passed to the template function
|
||||||
|
portainer_stack_template_vars: {}
|
||||||
|
|
||||||
|
# list of docker networks which should be created
|
||||||
|
portainer_stack_external_docker_networks: []
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
import os
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
existing = eval(os.getenv("EXISTING_VOLUMES"))
|
||||||
|
stack_name = os.getenv("STACK_NAME")
|
||||||
|
docker_compose_dir = os.getenv("DOCKER_COMPOSE_DIR")
|
||||||
|
|
||||||
|
full_volume_names = []
|
||||||
|
missing_volumes = []
|
||||||
|
services = [{"name": stack_name}]
|
||||||
|
for service in services:
|
||||||
|
service_name = service["name"]
|
||||||
|
docker_file = f"{docker_compose_dir}/{service_name}/docker-compose.yml"
|
||||||
|
docker_compose_dict = yaml.safe_load(Path(docker_file).read_text())
|
||||||
|
|
||||||
|
# no volumes specified in the compose file
|
||||||
|
if "volumes" not in docker_compose_dict:
|
||||||
|
continue
|
||||||
|
|
||||||
|
volumes = docker_compose_dict["volumes"]
|
||||||
|
|
||||||
|
for v in volumes:
|
||||||
|
full_volume_names.append(f"{service_name}_{v}")
|
||||||
|
|
||||||
|
for volume_name in full_volume_names:
|
||||||
|
if volume_name not in existing:
|
||||||
|
missing_volumes.append(volume_name)
|
||||||
|
|
||||||
|
for mv in missing_volumes:
|
||||||
|
if mv:
|
||||||
|
print(mv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
galaxy_info:
|
||||||
|
author: Cian Hatton
|
||||||
|
namespace: chatton
|
||||||
|
description: Deploy a single portainer stack.
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.1"
|
||||||
|
galaxy_tags: []
|
||||||
|
platforms:
|
||||||
|
- name: Debian
|
||||||
|
versions:
|
||||||
|
- all
|
||||||
|
dependencies: []
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
---
|
||||||
|
- name: Docker Compose | Create a directory if it does not exist
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}'
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
|
||||||
|
- name: Docker Compose | Template Docker Compose Files
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: '{{ portainer_stack_name }}.j2'
|
||||||
|
dest: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}/docker-compose.yml'
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0440
|
||||||
|
vars:
|
||||||
|
template_vars: "{{ portainer_stack_template_vars }}"
|
||||||
|
|
||||||
|
- name: Directories | Ensure required directories
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: '{{ item }}'
|
||||||
|
state: directory
|
||||||
|
mode: '0755'
|
||||||
|
with_items: "{{ portainer_stack_directories }}"
|
||||||
|
|
||||||
|
- name: Docker | Find docker volumes
|
||||||
|
ansible.builtin.shell: docker volume ls -f name={{ portainer_stack_name }} --format '{{ '{{' }} .Name {{ '}}' }}'
|
||||||
|
register: find_volumes
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Docker | Find volumes that need to be restored
|
||||||
|
ansible.builtin.script: scripts/find-volumes-to-restore.py
|
||||||
|
environment:
|
||||||
|
EXISTING_VOLUMES: "{{ find_volumes.stdout_lines }}"
|
||||||
|
STACK_NAME: '{{ portainer_stack_name }}'
|
||||||
|
DOCKER_COMPOSE_DIR: '{{ directories.docker_compose_directory }}'
|
||||||
|
args:
|
||||||
|
executable: python3
|
||||||
|
register: python_output
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Build list of volumes to restore.
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
restore_volumes: "{{ restore_volumes | default([]) + [{'volume_name':item}] }}"
|
||||||
|
with_items: "{{ python_output.stdout_lines | list }}"
|
||||||
|
|
||||||
|
- name: Restore any missing volumes from S3
|
||||||
|
ansible.builtin.include_role:
|
||||||
|
name: chatton.docker_backup.docker_s3_volume_restore
|
||||||
|
when: restore_volumes is defined
|
||||||
|
vars:
|
||||||
|
docker_backup_restore_force: false
|
||||||
|
docker_backup_restore_latest_s3_key: true
|
||||||
|
docker_backup_s3_restores: "{{ restore_volumes }}"
|
||||||
|
|
||||||
|
- name: Docker | Create required docker networks
|
||||||
|
docker_network:
|
||||||
|
name: '{{ docker_network }}'
|
||||||
|
loop: '{{ portainer_stack_external_docker_networks }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: docker_network
|
||||||
|
|
||||||
|
- name: Portainer | Update Stack
|
||||||
|
chatton.portainer.portainer_stack:
|
||||||
|
username: admin
|
||||||
|
password: '{{ portainer.password }}'
|
||||||
|
docker_compose_file_path: '{{ directories.docker_compose_directory }}/{{ portainer_stack_name }}/docker-compose.yml'
|
||||||
|
stack_name: '{{ portainer_stack_name }}'
|
||||||
|
endpoint_id: '{{ portainer_stack_endpoint_id }}'
|
||||||
|
state: present
|
||||||
Loading…
Reference in New Issue