commit 666e7a9ae1593b20c514e65dc8d5457775ecfb86 Author: Tobias Manske Date: Fri May 5 22:19:15 2023 +0200 Split role from infra repo diff --git a/README.md b/README.md new file mode 100644 index 0000000..f03d0c6 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +compose_project +========= + +Helps you deploy and update a remote docker-compose project. + +Requirements +------------ + +Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required. + +Role Variables +-------------- + +`service`: name of the service to be deployed. Currently part of the role templates. + +`compose_dir`: Directory which contains all compose services on the target + +Dependencies +------------ + + +Example Playbook +---------------- + +Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too: + + - hosts: servers + roles: + - { role: compose_project, service: traefik } + - { role: compose_project, service: nextcloud } + +License +------- + +MIT + +Author Information +------------------ diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..f17db7c --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,6 @@ +--- +# defaults file for roles/compose_project +service: dummy +compose_dir: /home/core/compose +state: present # or absent +restart: smart # or always or never diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..a81635b --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for roles/compose_project diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..7f827d5 --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,52 @@ +galaxy_info: + author: Tobias Manske + description: Deploys a docker compose directory and restarts on change + company: null + + # If the issue tracker for your role is not on github, uncomment the + # next line and provide a value + # issue_tracker_url: http://example.com/issue/tracker + + # Choose a valid license ID from https://spdx.org - some suggested licenses: + # - BSD-3-Clause (default) + # - MIT + # - GPL-2.0-or-later + # - GPL-3.0-only + # - Apache-2.0 + # - CC-BY-4.0 + license: MIT + + min_ansible_version: 2.1 + + # If this a Container Enabled role, provide the minimum Ansible Container version. + # min_ansible_container_version: + + # + # Provide a list of supported platforms, and for each platform a list of versions. + # If you don't wish to enumerate all versions for a particular platform, use 'all'. + # To view available platforms and versions (or releases), visit: + # https://galaxy.ansible.com/api/v1/platforms/ + # + # platforms: + # - name: Fedora + # versions: + # - all + # - 25 + # - name: SomePlatform + # versions: + # - all + # - 1.0 + # - 7 + # - 99.99 + + galaxy_tags: [] + # List tags for your role here, one per line. A tag is a keyword that describes + # and categorizes the role. Users find roles by searching for tags. Be sure to + # remove the '[]' above, if you add tags to this list. + # + # NOTE: A tag is limited to a single word comprised of alphanumeric characters. + # Maximum 20 tags per role. + +dependencies: [] + # List your role dependencies here, one per line. Be sure to remove the '[]' above, + # if you add dependencies to this list. diff --git a/tasks/create.yml b/tasks/create.yml new file mode 100644 index 0000000..171d6c2 --- /dev/null +++ b/tasks/create.yml @@ -0,0 +1,68 @@ +--- + +- block: + - name: Create Temporary directory + tempfile: + state: directory + changed_when: false + register: temp_file + - name: Create directory structure + file: + state: directory + dest: '{{ temp_file.path }}/{{ item.path }}' + mode: "{{ item.mode }}" + changed_when: false + with_filetree: "./templates/{{ service | mandatory }}" + when: item.state == 'directory' + loop_control: + label: '{{ item.path }}' + - name: Template Service Files + ansible.builtin.template: + src: "{{ item.src }}" + dest: "{{ temp_file.path }}/{{ item.path }}" + mode: "{{ item.mode }}" + force: true + trim_blocks: false + changed_when: false + with_filetree: "./templates/{{ service | mandatory }}" + loop_control: + label: '{{ item.path }}' + when: item.state == 'file' + delegate_to: localhost + check_mode: no + +- name: Create Service Directory + file: + state: directory + path: "{{ compose_dir | mandatory }}" + +- name: Copy Compose files + become: false + ansible.posix.synchronize: + src: "{{ temp_file.path | mandatory }}/" + dest: "{{ service_dir | mandatory }}" + archive: false + checksum: true + delete: true + recursive: true + mode: push + owner: false + group: false + perms: false + register: compose_files + +- name: Delete temporary directory + ansible.builtin.file: + path: "{{ temp_file.path }}" + state: absent + changed_when: false + +- name: Restart Service + community.docker.docker_compose: + project_src: "{{ service_dir | mandatory }}" + state: present + restarted: true + recreate: smart + build: true + remove_orphans: true + when: (compose_files.changed and restart == "smart") or restart == "always" diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..cceaa6a --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,18 @@ +--- + +- name: Set service_dir + ansible.builtin.set_fact: + service_dir: "{{ compose_dir | mandatory }}/{{ service | mandatory }}{% if service_name is defined %}-{{ service_name }}{% endif %}" + cacheable: true + +- ansible.builtin.debug: + msg: "Working on {{ service }}{% if service_name is defined %}-{{ service_name }}{% endif %}" + verbosity: 0 + +- include_tasks: create.yml + when: state == "present" + +- include_tasks: remove.yml + when: state == "absent" + +... diff --git a/tasks/remove.yml b/tasks/remove.yml new file mode 100644 index 0000000..2e9e61d --- /dev/null +++ b/tasks/remove.yml @@ -0,0 +1,18 @@ +--- +- name: Check if service is present + stat: + path: "{{ service_dir | mandatory }}" + register: dir + +- name: Stop Service + community.docker.docker_compose: + project_src: "{{ service_dir | mandatory }}" + state: absent + remove_orphans: true + when: dir.stat.exists == True + +- name: Remove Service + file: + state: absent + path: "{{ service_dir | mandatory }}" + when: dir.stat.exists == True diff --git a/tests/inventory b/tests/inventory new file mode 100644 index 0000000..878877b --- /dev/null +++ b/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/tests/test.yml b/tests/test.yml new file mode 100644 index 0000000..1011e2e --- /dev/null +++ b/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - roles/compose_project diff --git a/vars/main.yml b/vars/main.yml new file mode 100644 index 0000000..965845f --- /dev/null +++ b/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for roles/compose_project