# Define an empty list for the mappings to be assigned to - set_fact: mappings: [] tags: always # Container name always equals the Dict name - set_fact: container_Name="{{ item.value.name | default(item.key) }}" tags: always # Container hostname is the container name by default but can be overridden by setting 'hostname' - set_fact: container_hostname="{{ item.value.hostname | default (container_Name) }}" tags: always - set_fact: container_configDir="{{ containerConfigDir }}/container-configs/{{ container_Name }}/" tags: always # Create the config storage directory if it doesnt already exist - name: "Create config dir" file: path: "{{ container_configDir }}" state: directory tags: always #----------------------------------Check NETWORK---------------------------------- #If the network varibale isnt defined then dont error out, set the network variable to an empty list - name: Setup a blank network variable set_fact: net_checked=[] when: item.value.networks is not defined tags: always - name: Copy network variables into config set_fact: net_checked="{{ item.value.networks }}" when: item.value.networks is defined tags: always #- name: Show IP # debug: msg="{{item.value.networks[0].ipv4_address | default(item.value.hostIP)}}" #----------------------------------/Check NETWORK---------------------------------- #----------------------------------VOLUMES---------------------------------- #Do all of the defined mappings exist? #Create them if not - set_fact: volumes_Defined=0 tags: always - name: Check if volumes have been defined or not set_fact: volumes_Defined: 1 when: item.value.mappings.volumes is defined tags: always - name: "Volume mappings for {{ container_Name }}" include: dockerVolume.yml with_dict: "{{ item.value.mappings.volumes }}" when: volumes_Defined == 1 tags: always #Note, the volume gets added to the mapping list in the dockerVolume.yml file becuase in there it knows the actual name of the volume #----------------------------------/VOLUMES---------------------------------- #----------------------------------TEMPLATES---------------------------------- #Only copy template files if there are templates defined in the incoming defintion dict - set_fact: templates_Defined=0 tags: always - name: Check if templates have been defined or not set_fact: templates_Defined: 1 when: item.value.mappings.templates is defined tags: always #- debug: msg="Templates not defined" # when: templates_Defined is not defined # #- debug: msg="{{ item.value.mappings.templates }}" #Copy all of the defined templates to the container host into the {{ container_configDir }} ready for mapping to the container later - name: "Template mappings for {{ container_Name }}" #Files will be copied to the 'config' dir as defined by container_configDir, they will be stored using their template file name but with the '.j2' stripped #Need to ensure you dont have duplicate files names here template: src="{{ container_Name }}/{{ outer_item.value.src }}" dest="{{ container_configDir }}/{{ outer_item.value.src.split(".j2")[0] }}" mode=0644 with_dict: "{{ item.value.mappings.templates }}" loop_control: loop_var: outer_item when: templates_Defined ==1 and outer_item.value.generic is not defined register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always #Copy templates form a generic dir, allow ansible to search - name: "Generic template mappings for {{ container_Name }}" #Files will be copied to the 'config' dir as defined by container_configDir, they will be stored using their template file name but with the '.j2' stripped #Need to ensure you dont have duplicate files names here template: src="{{ outer_item.value.src }}" dest="{{ container_configDir }}/{{ outer_item.value.src.split(".j2")[0] }}" mode=0644 with_dict: "{{ item.value.mappings.templates }}" loop_control: loop_var: outer_item when: templates_Defined ==1 and outer_item.value.generic is defined register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always - name: Append templated files to the mapping list set_fact: #build a list to pass to docker containing the source of the file(As on disk on the host) and the destination mount within the container #Also allows the passing of 'params' which is rw or ro, defaults to rw #mappings: "{{ mappings + ['type=\"bind\", source=\"' + container_configDir + item.value.src.split('.j2')[0] + '\",target=\"' + item.value.dest + '\",readonly=\"' + item.value.readonly | default('false') +'\"'] }}" mappings: "{{ mappings + [ container_configDir + outer_item.value.src.split('.j2')[0] + ':' + outer_item.value.dest + ':' + outer_item.value.params | default('rw') ] }}" with_dict: "{{ item.value.mappings.templates }}" loop_control: loop_var: outer_item when: templates_Defined ==1 tags: always #type = "bind",target = "/usr/share/nginx/html",source = "/home/bfnadmin/www",readonly = false #----------------------------------/TEMPLATES---------------------------------- #----------------------------------FILES---------------------------------- - set_fact: files_Defined=0 tags: always #Only copy files if there are templates defined in the incoming defintion dict - name: Check if Files have been defined or not set_fact: files_Defined: 1 when: item.value.mappings.files is defined tags: always #Copy all of the defined files to the container host into the {{ container_configDir }} ready for mapping to the container later - name: "File mappings for {{ container_Name }}" #Files will be copied to the 'config' dir as defined by container_configDir, they will be stored using their file name #Need to ensure you dont have duplicate files names here copy: src="{{ container_Name }}/{{ outer_item.value.src }}" dest="{{ container_configDir }}/{{ outer_item.key }}" mode=0644 with_dict: "{{ item.value.mappings.files }}" loop_control: loop_var: outer_item when: files_Defined == 1 and outer_item.value.generic is not defined and outer_item.value.src_text is not defined register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always #Copy files from a generic dir, allow ansible to search - name: "Generic File mappings for {{ container_Name }}" #Files will be copied to the 'config' dir as defined by container_configDir, they will be stored using their file name #Need to ensure you dont have duplicate files names here copy: src="{{ outer_item.value.src }}" dest="{{ container_configDir }}/{{ outer_item.key }}" mode=0644 with_dict: "{{ item.value.mappings.files }}" loop_control: loop_var: outer_item when: files_Defined == 1 and outer_item.value.generic is defined and outer_item.value.src_text is not defined register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always #Create files based on the suplied src_text param - name: "Text based file creation for {{ container_Name }}" #Files will be copied to the 'config' dir as defined by container_configDir, they will be stored using their file name #Need to ensure you dont have duplicate files names here copy: content="{{ outer_item.value.src_text }}" dest="{{ container_configDir }}/{{ outer_item.key }}" mode=0644 with_dict: "{{ item.value.mappings.files }}" loop_control: loop_var: outer_item when: files_Defined == 1 and outer_item.value.src_text is defined register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always - name: Append static remote files to the mapping list set_fact: #build a list to pass to docker containing the source of the file(As on disk on the host) and the destination mount within the container #Also allows the passing of 'params' which is rw or ro, defaults to rw mappings: "{{ mappings + [ container_configDir + outer_item.key + ':' + outer_item.value.dest + ':' + outer_item.value.params | default('rw') ] }}" with_dict: "{{ item.value.mappings.files }}" loop_control: loop_var: outer_item when: files_Defined == 1 tags: always #----------------------------------/FILES---------------------------------- #----------------------------------LOCAL---------------------------------- #Local files alreeady exist on the host, commonly local time and or netns for namespace, could also be locl disk drives? #Nothing gets copied for local mappings, just defintiions added to the mapping list #Only copy files if there are local files defined in the incoming defintion dict - set_fact: local_Defined=0 tags: always - name: Check if Local files have been defined or not set_fact: local_Defined: 1 when: item.value.mappings.local is defined tags: always #- debug: msg="local not defined" # when: local_Defined is not defined - name: Append static local files to the mapping list set_fact: #build a list to pass to docker containing the source of the file(As on disk on the host) and the destination mount within the container #Also allows the passing of 'params' which is rw or ro, defaults to rw #mappings: "{{ mappings + ['type=\"bind\", source=\"' + item.value.src + '\",target=\"' + item.value.dest + '\",readonly=\"' + item.value.readonly | default('false') +'\"'] }}" mappings: "{{ mappings + [ outer_item.value.src + ':' + outer_item.value.dest + ':' + outer_item.value.params | default('rw') ] }}" with_dict: "{{ item.value.mappings.local }}" loop_control: loop_var: outer_item when: local_Defined == 1 register: fileChanged tags: always - name: Set the flag to restart the container if file was changed set_fact: containerRestart='yes' when: fileChanged is defined and fileChanged.changed tags: always #----------------------------------/LOCAL---------------------------------- #----------------------------------Check ENV---------------------------------- #If the env varibale isnt defined then dont error out, set the network variable to an empty list - name: Setup a blank env variable set_fact: env_checked={} when: item.value.env is not defined tags: always - name: Copy env variables into config set_fact: env_checked="{{ item.value.env }}" when: item.value.env is defined tags: always #----------------------------------/Check ENV---------------------------------- - name: Restart the container if fileChanged is defined set_fact: containerRestart1='yes' when: (containerRestart is defined and containerRestart=='yes') or (item.value.restart is defined and item.value.restart =='yes') - name: "Container {{ container_Name }}" become: yes docker_container: name: "{{ container_Name }}" hostname: "{{ item.value.hostname | default(container_Name) }}" command: "{{ item.value.command | default('') }}" pull: "{{ item.value.pull | default('false') }}" recreate: "{{ item.value.recreate | default('false') }}" image: "{{ item.value.image }}" state: "{{ item.value.start | default ('started') }}" restart: "{{ containerRestart1 | default ('no') }}" restart_policy: "{{ item.value.restart_policy | default ('always') }}" purge_networks: "{{ item.value.purge_networks | default ('yes') }}" networks: "{{ net_checked }}" volumes: "{{ mappings }}" env: "{{ env_checked }}" privileged: "{{ item.value.privileged | default ('no') }}" network_mode: "{{ item.value.network_mode | default ('default') }}" shm_size: "{{ item.value.shm_size | default ('64M') }}" ports: "{{ item.value.ports | default ([]) }}" #log_driver: fluentd #"{{item.value.ports | default ([json-file])}}" #log_options: # fluentd-sub-second-precision: true # tag: myservice tags: always