diff --git a/defaults/main.yml b/defaults/main.yml index 21145aa..d7a8b17 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -1,33 +1,28 @@ --- # defaults file for docker_systemd_service -container_name: "{{ name }}" -container_docker_pull: true -container_docker_pull_force_source: true -container_labels: [] -container_cmd: [] -container_host_network: false -container_network: "" -container_user: "" -container_hostname: "" -container_links: [] -container_ports: [] -container_hosts: [] -container_volumes: [] -container_cap_add: [] -container_cap_drop: [] -container_devices: [] -container_privileged: false -container_args: "" -docker_path: "/usr/bin/docker" -service_name: "{{ container_name }}_container" -service_systemd_options: [] -service_systemd_unit_options: - After: docker.service - PartOf: docker.service - Requires: docker.service -service_enabled: true -service_masked: false -service_state: started -service_restart: true -template_env_path: "env.j2" -template_unit_path: "unit.j2" +docker_systemd_service_container_name: "{{ name }}" +docker_systemd_service_image: +docker_systemd_service_container_env: {} +docker_systemd_service_container_pull_image: true +docker_systemd_service_container_pull_force_source: true +docker_systemd_service_container_labels: [] +docker_systemd_service_container_cmd: [] +docker_systemd_service_container_host_network: false +docker_systemd_service_container_network: "" +docker_systemd_service_container_user: "" +docker_systemd_service_container_hostname: "" +docker_systemd_service_container_links: [] +docker_systemd_service_container_ports: [] +docker_systemd_service_container_hosts: [] +docker_systemd_service_container_volumes: [] +docker_systemd_service_container_cap_add: [] +docker_systemd_service_container_cap_drop: [] +docker_systemd_service_container_devices: [] +docker_systemd_service_container_privileged: false +docker_systemd_service_container_args: "" +docker_systemd_service_name: "{{ docker_systemd_service_container_name }}_container" +docker_systemd_service_systemd_options: [] +docker_systemd_service_enabled: true +docker_systemd_service_masked: false +docker_systemd_service_state: started +docker_systemd_service_restart: true diff --git a/handlers/main.yml b/handlers/main.yml index 2b0c091..ef576c2 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -1,7 +1,10 @@ --- # handlers file for docker_systemd_service -- name: "restart container {{ container_name }}" - service: - name: '{{ service_name }}.service' +- name: "Restart service(s)" + ansible.builtin.service: + name: "{{ docker_systemd_service_name }}.service" state: restarted - when: service_restart and service_state != "stopped" and not enable_and_start.changed + listen: "systemctl-restart-service" + when: docker_systemd_service_restart + and docker_systemd_service_state != "stopped" + and not _enable_and_start.changed diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml index 2cf5a38..1271eed 100644 --- a/molecule/default/converge.yml +++ b/molecule/default/converge.yml @@ -1,6 +1,7 @@ --- - name: Converge hosts: all + become: true tasks: - name: "Include ednxzu.docker_systemd_service" ansible.builtin.include_role: diff --git a/molecule/default/requirements.yml b/molecule/default/requirements.yml new file mode 100644 index 0000000..1316891 --- /dev/null +++ b/molecule/default/requirements.yml @@ -0,0 +1,6 @@ +--- +# requirements file for molecule +roles: + - name: ednxzu.manage_repositories + - name: ednxzu.manage_apt_packages + - name: ednxzu.install_docker diff --git a/molecule/default/verify.yml b/molecule/default/verify.yml index 60161b1..ec450ea 100644 --- a/molecule/default/verify.yml +++ b/molecule/default/verify.yml @@ -2,4 +2,5 @@ - name: Verify hosts: all gather_facts: true + become: true tasks: diff --git a/molecule/default_vagrant/converge.yml b/molecule/default_vagrant/converge.yml index 974e9c9..1271eed 100644 --- a/molecule/default_vagrant/converge.yml +++ b/molecule/default_vagrant/converge.yml @@ -1,7 +1,8 @@ --- - name: Converge hosts: all + become: true tasks: - - name: "Include ednxzu.${REPO_NAME}" + - name: "Include ednxzu.docker_systemd_service" ansible.builtin.include_role: - name: "ednxzu.${REPO_NAME}" + name: "ednxzu.docker_systemd_service" diff --git a/molecule/default_vagrant/group_vars/all.yml b/molecule/default_vagrant/group_vars/all.yml new file mode 100644 index 0000000..a2f343b --- /dev/null +++ b/molecule/default_vagrant/group_vars/all.yml @@ -0,0 +1,27 @@ +--- +docker_systemd_service_container_name: "nginx" +docker_systemd_service_image: nginx +docker_systemd_service_container_env: {} +docker_systemd_service_container_pull_image: true +docker_systemd_service_container_pull_force_source: false +docker_systemd_service_container_labels: [] +docker_systemd_service_container_cmd: [] +docker_systemd_service_container_host_network: false +docker_systemd_service_container_network: "" +docker_systemd_service_container_user: "" +docker_systemd_service_container_hostname: "" +docker_systemd_service_container_links: [] +docker_systemd_service_container_ports: [] +docker_systemd_service_container_hosts: [] +docker_systemd_service_container_volumes: [] +docker_systemd_service_container_cap_add: [] +docker_systemd_service_container_cap_drop: [] +docker_systemd_service_container_devices: [] +docker_systemd_service_container_privileged: false +docker_systemd_service_container_args: "" +docker_systemd_service_name: "{{ docker_systemd_service_container_name }}_container" +docker_systemd_service_systemd_options: [] +docker_systemd_service_enabled: true +docker_systemd_service_masked: false +docker_systemd_service_state: started +docker_systemd_service_restart: true diff --git a/molecule/default_vagrant/prepare.yml b/molecule/default_vagrant/prepare.yml new file mode 100644 index 0000000..af09212 --- /dev/null +++ b/molecule/default_vagrant/prepare.yml @@ -0,0 +1,8 @@ +--- +- name: Prepare + hosts: all + become: true + tasks: + - name: "Install docker" + ansible.builtin.include_role: + name: ednxzu.install_docker diff --git a/molecule/default_vagrant/requirements.yml b/molecule/default_vagrant/requirements.yml new file mode 100644 index 0000000..1316891 --- /dev/null +++ b/molecule/default_vagrant/requirements.yml @@ -0,0 +1,6 @@ +--- +# requirements file for molecule +roles: + - name: ednxzu.manage_repositories + - name: ednxzu.manage_apt_packages + - name: ednxzu.install_docker diff --git a/molecule/default_vagrant/verify.yml b/molecule/default_vagrant/verify.yml index 60161b1..ec450ea 100644 --- a/molecule/default_vagrant/verify.yml +++ b/molecule/default_vagrant/verify.yml @@ -2,4 +2,5 @@ - name: Verify hosts: all gather_facts: true + become: true tasks: diff --git a/tasks/install.yml b/tasks/install.yml index fed9c7c..c62cc6f 100644 --- a/tasks/install.yml +++ b/tasks/install.yml @@ -1,37 +1,36 @@ --- # task/install file for docker_systemd_service -- name: Create ENV file for {{ service_name }}.service - template: - src: "{{ template_env_path }}" - dest: "{{ sysconf_dir }}/{{ container_name }}" +- name: "Create ENV file(s) for docker service(s)" + ansible.builtin.template: + src: env.j2 + dest: "{{ docker_systemd_service_sysconf_dir }}/{{ docker_systemd_service_container_name }}" owner: root group: root mode: '0600' - when: container_env is defined - notify: restart container {{ container_name }} + notify: systemctl-restart-service -- name: Pull image {{ container_image }} - docker_image: - name: '{{ container_image }}' - force_source: '{{ container_docker_pull_force_source | bool }}' +- name: "Pull docker image(s)" + community.docker.docker_image: + name: "{{ docker_systemd_service_image }}" + force_source: "{{ docker_systemd_service_container_pull_force_source | bool }}" source: pull - when: container_docker_pull - notify: restart container {{ container_name }} + when: docker_systemd_service_container_pull_image + notify: systemctl-restart-service -- name: Create unit {{ service_name }}.service - template: - src: "{{ template_unit_path }}" - dest: /etc/systemd/system/{{ service_name }}.service +- name: "Create unit file(s) for service(s)" + ansible.builtin.template: + src: unit.j2 + dest: "/etc/systemd/system/{{ docker_systemd_service_name }}.service" owner: root group: root mode: '0644' - notify: restart container {{ container_name }} + notify: systemctl-restart-service -- name: Enable and start {{ container_name }} - systemd: - name: '{{ service_name }}.service' +- name: "Enable and start service(s)" + ansible.builtin.systemd: + name: '{{ docker_systemd_service_name }}.service' daemon_reload: true - enabled: "{{ service_enabled }}" - masked: "{{ service_masked }}" - state: "{{ service_state }}" - register: enable_and_start + enabled: "{{ docker_systemd_service_enabled }}" + masked: "{{ docker_systemd_service_masked }}" + state: "{{ docker_systemd_service_state }}" + register: _enable_and_start diff --git a/tasks/main.yml b/tasks/main.yml index d06798c..77d46d7 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -1,10 +1,9 @@ --- # task/main file for docker_systemd_service -- name: Load distro-specific vars - include_vars: "{{ ansible_os_family }}.yml" - tags: always +- name: "Import install.yml" + ansible.builtin.include_tasks: install.yml + when: docker_systemd_service_state != "absent" -- include_tasks: install.yml - when: service_state != "absent" -- include_tasks: uninstall.yml - when: service_state == "absent" +- name: "Import uninstall.yml" + ansible.builtin.include_tasks: uninstall.yml + when: docker_systemd_service_state == "absent" diff --git a/tasks/uninstall.yml b/tasks/uninstall.yml index d4420dc..9faf8d3 100644 --- a/tasks/uninstall.yml +++ b/tasks/uninstall.yml @@ -1,22 +1,22 @@ --- # task/uninstall file for docker_systemd_service -- name: Remove ENV file for {{ service_name }}.service - file: - path: "{{ sysconf_dir }}/{{ container_name }}" +- name: "Remove ENV file(s) for service(s)" + ansible.builtin.file: + path: "{{ docker_systemd_service_sysconf_dir }}/{{ docker_systemd_service_container_name }}" state: absent -- name: Disable and stop {{ container_name }} - systemd: - name: '{{ service_name }}.service' +- name: "Disable and stop service(s)" + ansible.builtin.systemd: + name: '{{ docker_systemd_service_name }}.service' enabled: false state: stopped -- name: Remove unit {{ service_name }}.service - file: - path: /etc/systemd/system/{{ service_name }}.service +- name: "Remove unit file(s) for service(s)" + ansible.builtin.file: + path: /etc/systemd/system/{{ docker_systemd_service_name }}.service state: absent -- name: Reload systemd units - systemd: +- name: "Reload systemd units" + ansible.builtin.systemd: daemon_reload: true changed_when: false diff --git a/templates/env.j2 b/templates/env.j2 index 8e25a65..f5e5931 100644 --- a/templates/env.j2 +++ b/templates/env.j2 @@ -1,3 +1,3 @@ -{% for k,v in container_env|dictsort %} +{% for k,v in docker_systemd_service_container_env|dictsort %} {{ k }}={{ v }} {% endfor %} \ No newline at end of file diff --git a/templates/unit.j2 b/templates/unit.j2 index 2a75907..4495efa 100644 --- a/templates/unit.j2 +++ b/templates/unit.j2 @@ -2,54 +2,51 @@ {% macro params(name, vals) %} {% for v in vals %}{{ name }} {{ v }} {% endfor %} {% endmacro %} -{% set service_systemd_options_keys = service_systemd_options | selectattr("key") | map(attribute="key") | list %} +{% set service_systemd_options_keys = docker_systemd_service_systemd_options | selectattr("key") | map(attribute="key") | list %} [Unit] -{% for key, value in service_systemd_unit_options | dictsort %} +{% for key, value in docker_systemd_service_systemd_unit_options | dictsort %} {{ key }}={{ value }} {% endfor %} [Service] -{% for item in service_systemd_options %} +{% for item in docker_systemd_service_systemd_options %} {{ item['key'] }}={{ item['value'] }} {% endfor %} -{% if container_env is defined %} +{% if docker_systemd_service_container_env is defined %} {% if not 'EnvironmentFile' in service_systemd_options_keys %} -EnvironmentFile={{ sysconf_dir }}/{{ container_name }} +EnvironmentFile={{ docker_systemd_service_sysconf_dir }}/{{ docker_systemd_service_container_name }} {% endif %} {% endif %} {% if not 'ExecStartPre' in service_systemd_options_keys %} -ExecStartPre=-{{ docker_path }} rm -f {{ container_name }} +ExecStartPre=-{{ docker_systemd_service_docker_path }} rm -f {{ docker_systemd_service_container_name }} {% endif %} {% if not 'ExecStart' in service_systemd_options_keys %} -ExecStart={{ docker_path }} run \ - --name {{ container_name }} \ - --rm \ - {% if container_env is defined %}--env-file {{ sysconf_dir }}/{{ container_name }} {% endif %}\ - {{ params('--volume', container_volumes) }}\ - {% if container_host_network == true %}--network host {% else %}{{ params('--publish', container_ports) }}{% endif %}\ - {% if container_network %}--network {{ container_network }}{% endif %} \ - {% if container_user %}--user {{ container_user }}{% endif %} \ - {% if container_hostname %}--hostname {{ container_hostname }}{% endif %} \ - {{ params('--link', container_links) }}\ - {{ params('--add-host', container_hosts) }}\ - {{ params('--label', container_labels) }}\ - {{ params('--cap-add', container_cap_add) }}\ - {{ params('--cap-drop', container_cap_drop) }}\ - {{ params('--device', container_devices) }}\ - {% if container_privileged == true %}--privileged{% endif %}\ - {{ container_args | trim }} \ - {{ container_image }} {% if container_cmd is string %}{{ container_cmd | trim }}{% else %}{{ container_cmd | join(' ') | trim }}{% endif %} +{% if docker_systemd_service_container_env is defined %}ExecStart={{ docker_systemd_service_docker_path }} run --name {{ docker_systemd_service_container_name }} --rm --env-file {{ docker_systemd_service_sysconf_dir }}/{{ docker_systemd_service_container_name }} {% endif %}\ +{{ params('--volume', docker_systemd_service_container_volumes)~' \\'| trim }} +{% if docker_systemd_service_container_host_network == true %}--network host \{% else %}{{ params('--publish', docker_systemd_service_container_ports)~'\\'| trim }}{% endif +%} +{% if docker_systemd_service_container_network %}--network {{ docker_systemd_service_container_network }} {% endif %}\ +{% if docker_systemd_service_container_user %}--user {{ docker_systemd_service_container_user }} {% endif %}\ +{% if docker_systemd_service_container_hostname %}--hostname {{ docker_systemd_service_container_hostname }} {% endif %}\ +{{ params('--link', docker_systemd_service_container_links)~' \\'| trim }} +{{ params('--add-host', docker_systemd_service_container_hosts)~' \\'| trim }} +{{ params('--label', docker_systemd_service_container_labels)~' \\'| trim }} +{{ params('--cap-add', docker_systemd_service_container_cap_add)~' \\'| trim }} +{{ params('--cap-drop', docker_systemd_service_container_cap_drop)~' \\'| trim }} +{{ params('--device', docker_systemd_service_container_devices)~' \\'| trim }} +{% if docker_systemd_service_container_privileged == true %}--privileged {% endif %}\ +{{ docker_systemd_service_container_args~' \\'| trim}} +{{ docker_systemd_service_image }} {% if docker_systemd_service_container_cmd is string %}{{ docker_systemd_service_container_cmd | trim }}{% else %}{{ docker_systemd_service_container_cmd | join(' ') | trim }}{% endif %} {% endif %} {% if not 'ExecStop' in service_systemd_options_keys %} -ExecStop={{ docker_path }} stop {{ container_name }} +ExecStop={{ docker_systemd_service_docker_path }} stop {{ docker_systemd_service_container_name }} {% endif %} {% if container_start_post is defined %} ExecStartPost=-{{ container_start_post }} {% endif %} {% if not 'SyslogIdentifier' in service_systemd_options_keys %} -SyslogIdentifier={{ container_name }} +SyslogIdentifier={{ docker_systemd_service_container_name }} {% endif %} {% if not 'Restart' in service_systemd_options_keys %} Restart=always @@ -59,4 +56,4 @@ RestartSec=10s {% endif %} [Install] -WantedBy=docker.service \ No newline at end of file +WantedBy=docker.service diff --git a/vars/main.yml b/vars/main.yml index 1476f66..e2ab7eb 100644 --- a/vars/main.yml +++ b/vars/main.yml @@ -1,3 +1,8 @@ --- # vars file for docker_systemd_service -sysconf_dir: /etc/default \ No newline at end of file +docker_systemd_service_sysconf_dir: /etc/default +docker_systemd_service_docker_path: "/usr/bin/docker" +docker_systemd_service_systemd_unit_options: + After: docker.service + PartOf: docker.service + Requires: docker.service