From 079b0081116c32363d0f6882dec067e90dfdcd4e Mon Sep 17 00:00:00 2001 From: uumas Date: Fri, 21 Apr 2023 07:44:23 +0300 Subject: [PATCH] container: support bind mounted db data directory and mysql config --- roles/container/defaults/main.yml | 1 + roles/container/meta/argument_specs.yml | 13 +++++++++ roles/container/tasks/database.yml | 37 ++++++++++++++++++++++-- roles/container/tasks/init.yml | 5 ++-- roles/container/tasks/main.yml | 23 ++++++++++++--- roles/container/tasks/volumes.yml | 13 +-------- roles/container/templates/mariadb.cnf.j2 | 8 +++++ 7 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 roles/container/templates/mariadb.cnf.j2 diff --git a/roles/container/defaults/main.yml b/roles/container/defaults/main.yml index b8265d5..19edc13 100644 --- a/roles/container/defaults/main.yml +++ b/roles/container/defaults/main.yml @@ -2,5 +2,6 @@ docker_host_user: false docker_volume_type: named +docker_mariadb_config: {} timezone: Etc/UTC diff --git a/roles/container/meta/argument_specs.yml b/roles/container/meta/argument_specs.yml index 368bbce..e39b9b4 100644 --- a/roles/container/meta/argument_specs.yml +++ b/roles/container/meta/argument_specs.yml @@ -37,6 +37,19 @@ argument_specs: description: "database_passwords[docker_service] is a string with the password used for communication between the service and database. Required if docker_database is postgres or mariadb" type: dict required: false + docker_mariadb_config: + description: | + A dict specifying config for mariadb. For example + mysqld: + innodb_buffer_pool_size: '4G' + aria_pagecache_buffer_size': '4G' + would set + [mysqld] + innodb_buffer_pool_size = 4G + aria_pagecache_buffer_size = 4G + type: dict + required: false + default: {} docker_additional_services: description: "List of additional services to configure (in separate containers). These will be accessible with hostname [_suffix]_" type: list diff --git a/roles/container/tasks/database.yml b/roles/container/tasks/database.yml index 0061482..df2ee20 100644 --- a/roles/container/tasks/database.yml +++ b/roles/container/tasks/database.yml @@ -28,6 +28,39 @@ db_container_data: /data/db when: docker_database == 'mongo' +- name: Reset db container mount definition var + set_fact: + db_container_mount_definition: [] + +- name: Set up database container data bind mount + when: docker_volume_type == 'bind' + block: + - name: Create db data bind mount directory for {{ docker_service_name }} + file: + path: "{{ docker_mounts_dir }}/db" + state: directory + + - name: Set db_container_mount_definition for db data bind mount + set_fact: + db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_mounts_dir + '/db', 'target': db_container_data, 'type': 'bind'}] }}" + +- name: Set up database container config bind mount + when: db_config_mounts_needed + block: + - name: Put mariadb config in place + template: + src: mariadb.cnf.j2 + dest: "{{ docker_mounts_dir }}/mariadb.cnf" + + - name: Set db_container_mount_definition for db config bind mount + set_fact: + db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_mounts_dir + '/mariadb.cnf', 'target': '/etc/mysql/conf.d/custom.cnf', 'type': 'bind', 'read_only': true}] }}" + +- name: Set db_container_mount_definition for db data named volume + set_fact: + db_container_mount_definition: "{{ db_container_mount_definition + [{'source': docker_service_name + '_db', 'target': db_container_data, 'type': 'volume'}] }}" + when: docker_volume_type == 'named' + - name: Set db published ports var set_fact: db_published_ports: ["127.0.0.1:{{ ports[docker_service_name].db }}:{{ db_image_port }}"] @@ -41,8 +74,6 @@ env: "{{ db_container_env | default(omit) }}" published_ports: "{{ db_published_ports | default(omit) }}" restart_policy: always - mounts: - - source: "{{ docker_service_name + '_db' }}" - target: "{{ db_container_data }}" + mounts: "{{ db_container_mount_definition }}" networks: "{{ container_networks | default(omit) }}" log_driver: local diff --git a/roles/container/tasks/init.yml b/roles/container/tasks/init.yml index dae6db8..4e5292e 100644 --- a/roles/container/tasks/init.yml +++ b/roles/container/tasks/init.yml @@ -13,14 +13,15 @@ template_mounts_needed: "{{ docker_mounts | selectattr('template', 'defined') | list | length > 0 }}" volumes_needed: "{{ docker_mounts | selectattr('name', 'defined') | list | length > 0 }}" dockerfile_needed: "{{ dockerfile is defined and dockerfile | length > 0 }}" + db_config_mounts_needed: "{{ docker_mariadb_config | length > 0 }}" - name: Set more assistive variables set_fact: bind_volumes_needed: "{{ volumes_needed and docker_volume_type == 'bind' }}" named_volumes_needed: "{{ volumes_needed and docker_volume_type == 'named' }}" - name: Set even more assistive variables set_fact: - create_opt_directory: "{{ dockerfile_needed or docker_host_user or bind_volumes_needed or template_mounts_needed }}" - create_mounts_directory: "{{ bind_volumes_needed or template_mounts_needed }}" + create_opt_directory: "{{ dockerfile_needed or docker_host_user or bind_volumes_needed or template_mounts_needed or db_config_mounts_needed }}" + create_mounts_directory: "{{ bind_volumes_needed or template_mounts_needed or db_config_mounts_needed }}" - name: Set docker service full name set_fact: diff --git a/roles/container/tasks/main.yml b/roles/container/tasks/main.yml index 4c22883..247ad1b 100644 --- a/roles/container/tasks/main.yml +++ b/roles/container/tasks/main.yml @@ -24,10 +24,6 @@ include_tasks: proxy.yml when: reverse_proxy_type != 'none' -- name: Database container - include_tasks: database.yml - when: docker_database != 'none' - - name: Additional services when: docker_additional_services is defined block: @@ -74,6 +70,25 @@ container_workdir: /opt/{{ docker_service }} when: docker_service_suffix is not defined +- name: Create mounts directory + when: create_mounts_directory + block: + - name: Set docker_mounts_dir + set_fact: + docker_mounts_dir: "{{ container_workdir }}/mounts" + + - name: Create directory {{ docker_mounts_dir }} + file: + path: "{{ docker_mounts_dir }}" + state: directory + owner: "{{ user.uid | default(omit) }}" + group: "{{ user.group | default(omit) }}" + mode: 0700 + +- name: Database container + include_tasks: database.yml + when: docker_database != 'none' + - name: Container volumes import_tasks: volumes.yml diff --git a/roles/container/tasks/volumes.yml b/roles/container/tasks/volumes.yml index e340725..eff7a1d 100644 --- a/roles/container/tasks/volumes.yml +++ b/roles/container/tasks/volumes.yml @@ -3,18 +3,7 @@ - name: Create directories and put files in them when: create_mounts_directory block: - - name: Set docker_mounts_dir - set_fact: - docker_mounts_dir: "{{ container_workdir }}/mounts" - - - name: Create directory {{ docker_mounts_dir }} - file: - path: "{{ docker_mounts_dir }}" - state: directory - owner: "{{ user.uid | default(omit) }}" - group: "{{ user.group | default(omit) }}" - mode: 0700 - - name: Define mounts directory owner + - name: Define mount directory owner set_fact: mount_owner: "{{ user.uid if docker_host_user else image_user | default('') }}" mount_group: "{{ user.group if docker_host_user else '' }}" diff --git a/roles/container/templates/mariadb.cnf.j2 b/roles/container/templates/mariadb.cnf.j2 new file mode 100644 index 0000000..f7bb75e --- /dev/null +++ b/roles/container/templates/mariadb.cnf.j2 @@ -0,0 +1,8 @@ +# {{ ansible_managed }} + +{% for section in docker_mariadb_config | dict2items %} +[{{ section.key }}] +{% for item in section.value | dict2items %} +{{ item.key }} = {{ item.value }} +{% endfor %} +{% endfor %}