Tasks

main.yml

Synopsis: Main task.

Import tasks if enabled.

[tasks/main.yml]

 1---
 2# tasks for config_light
 3
 4- name: Setup
 5  when: cl_setup | bool
 6  delegate_to: localhost
 7  run_once: true
 8  tags: cl_setup
 9  ansible.builtin.import_tasks: setup.yml
10
11- name: Vars
12  tags: [cl_vars, always]
13  ansible.builtin.import_tasks: vars.yml
14
15- name: Sanity
16  when: cl_sanity | bool
17  delegate_to: localhost
18  run_once: true
19  tags: cl_sanity
20  ansible.builtin.import_tasks: sanity.yml
21
22- name: Debug
23  when: cl_debug | bool
24  tags: cl_debug
25  ansible.builtin.import_tasks: debug.yml
26
27- name: Packages
28  when: cl_install | bool
29  tags: cl_packages
30  ansible.builtin.import_tasks: packages.yml
31
32- name: States
33  tags: cl_states
34  ansible.builtin.import_tasks: states.yml
35
36- name: Files
37  tags: cl_files
38  ansible.builtin.import_tasks: files.yml
39
40- name: Services
41  tags: cl_services
42  ansible.builtin.import_tasks: services.yml
43
44# EOF

setup.yml

Synopsis: Configure setup

Description of the task.

[tasks/setup.yml]

  1---
  2- name: "Setup: Debug cl_debug={{ cl_debug }}"
  3  when: cl_debug | bool
  4  vars:
  5    msg: |-
  6      cl_dird: {{ cl_dird }}
  7      cl_dird_owner: {{ cl_dird_owner | d('UNDEFINED') }}
  8      cl_dird_group: {{ cl_dird_group | d('UNDEFINED') }}
  9      cl_dird_dmode: {{ cl_dird_dmode }}
 10
 11      cl_handlersd_dir: {{ cl_handlersd_dir }}
 12      cl_packagesd_dir: {{ cl_packagesd_dir }}
 13      cl_servicesd_dir: {{ cl_servicesd_dir }}
 14      cl_filesd_dir: {{ cl_filesd_dir }}
 15      cl_statesd_dir: {{ cl_statesd_dir }}
 16
 17      cl_dira: {{ cl_dira }}
 18      cl_dira_owner: {{ cl_dira_owner | d('UNDEFINED') }}
 19      cl_dira_group: {{ cl_dira_group | d('UNDEFINED') }}
 20      cl_dira_dmode: {{ cl_dira_dmode }}
 21      cl_dira_fmode: {{ cl_dira_fmode }}
 22      cl_assemble_regexp: {{ cl_assemble_regexp }}
 23
 24      cl_handlersd: {{ cl_handlersd }}
 25      cl_packagesd: {{ cl_packagesd }}
 26      cl_servicesd: {{ cl_servicesd }}
 27      cl_filesd: {{ cl_filesd }}
 28      cl_statesd: {{ cl_statesd }}
 29
 30      cl_handlers_delete_all: {{ cl_handlers_delete_all }}
 31      cl_handlers_delete: {{ cl_handlers_delete }}
 32      cl_handlers_create: {{ cl_handlers_create }}
 33      cl_handlers_dir_become: {{ cl_handlers_dir_become }}
 34      cl_handlers_dir_owner: {{ cl_handlers_dir_owner | d('UNDEFINED') }}
 35      cl_handlers_dir_group: {{ cl_handlers_dir_group | d('UNDEFINED') }}
 36      cl_handlers_dir_dmode: {{ cl_handlers_dir_dmode | d('UNDEFINED') }}
 37      cl_handlers_main_mode: {{ cl_handlers_main_mode | d('UNDEFINED') }}
 38
 39      cl_all_delete: {{ cl_all_delete }}
 40      cl_packagesd_delete: {{ cl_packagesd_delete }}
 41      cl_servicesd_delete: {{ cl_servicesd_delete }}
 42      cl_filesd_delete: {{ cl_filesd_delete }}
 43      cl_statesd_delete: {{ cl_statesd_delete }}
 44  ansible.builtin.debug:
 45    msg: "{{ '{}'.format(msg) }}"
 46
 47  # directories
 48- name: "Setup: Create directories in {{ cl_dird }}"
 49  ansible.builtin.file:
 50    state: directory
 51    path: "{{ item }}"
 52    owner: "{{ cl_dird_owner | d(omit) }}"
 53    group: "{{ cl_dird_group | d(omit) }}"
 54    mode: "{{ cl_dird_dmode }}"
 55  loop:
 56    - "{{ cl_dird }}"
 57    - "{{ cl_handlersd_dir }}"
 58    - "{{ cl_packagesd_dir }}"
 59    - "{{ cl_servicesd_dir }}"
 60    - "{{ cl_filesd_dir }}"
 61    - "{{ cl_statesd_dir }}"
 62
 63- name: "Setup: Create directory {{ cl_dira }}"
 64  ansible.builtin.file:
 65    state: directory
 66    path: "{{ cl_dira }}"
 67    owner: "{{ cl_dira_owner | d(omit) }}"
 68    group: "{{ cl_dira_group | d(omit) }}"
 69    mode: "{{ cl_dira_dmode }}"
 70
 71  # handlers
 72- name: "Setup: Create directory {{ role_path ~ '/handlers' }}"
 73  become: "{{ cl_handlers_dir_become }}"
 74  ansible.builtin.file:
 75    state: directory
 76    path: "{{ role_path }}/handlers"
 77    owner: "{{ cl_handlers_dir_owner | d(omit) }}"
 78    group: "{{ cl_handlers_dir_group | d(omit) }}"
 79    mode: "{{ cl_handlers_dir_dmode | d(omit) }}"
 80
 81- name: "Setup: Create handlers/main.yml"
 82  ansible.builtin.lineinfile:
 83    path: "{{ role_path }}/handlers/main.yml"
 84    insertbefore: BOF
 85    line: "---"
 86    validate: "{{ cl_handlers_validate | d(omit) }}"
 87    backup: "{{ cl_backup }}"
 88    create: true
 89    mode: "{{ cl_handlers_main_mode | d(omit) }}"
 90
 91- name: "Setup: Assemble handlers."
 92  ansible.builtin.import_tasks: vars-handlers.yml
 93
 94- name: "Setup: Delete all handlers."
 95  when: cl_handlers_delete_all | bool
 96  block:
 97
 98    - name: "Setup: Find all handlers."
 99      register: result
100      ansible.builtin.find:
101        path: "{{ role_path }}/handlers"
102        patterns: handlers-auto-*.yml
103
104    - name: "Setup: Debug result cl_debug={{ cl_debug }}"
105      when: cl_debug | bool
106      ansible.builtin.debug:
107        var: result
108
109    - name: "Setup: Delete all handlers."
110      ansible.builtin.file:
111        state: absent
112        path: "{{ item.path }}"
113      loop: "{{ result.files }}"
114      loop_control:
115        label: "{{ item.path | basename }}"
116
117    - name: "Setup: Exclude all found handlers from handlers/main.yml"
118      ansible.builtin.lineinfile:
119        state: absent
120        path: "{{ role_path }}/handlers/main.yml"
121        search_string: "{{ item.path | basename }}"
122        backup: "{{ cl_backup }}"
123      loop: "{{ result.files }}"
124      loop_control:
125        label: "{{ item.path | basename }}"
126
127- name: "Setup: Delete handlers listed in cl_handlers"
128  when: cl_handlers_delete | bool
129  vars:
130    handler_file: "handlers-auto-{{ item.key }}.yml"
131    handler_path: "{{ role_path }}/handlers/{{ handler_file }}"
132  block:
133
134    - name: "Setup: Delete handlers listed in cl_handlers"
135      ansible.builtin.file:
136        state: absent
137        path: "{{ handler_path }}"
138      loop: "{{ cl_handlers | dict2items }}"
139      loop_control:
140        label: "{{ handler_file }}"
141
142    - name: "Setup: Exclude handlers from handlers/main.yml"
143      ansible.builtin.lineinfile:
144        state: absent
145        path: "{{ role_path }}/handlers/main.yml"
146        search_string: "{{ handler_file }}"
147        backup: "{{ cl_backup }}"
148      loop: "{{ cl_handlers | dict2items }}"
149      loop_control:
150        label: "{{ handler_file }}"
151
152- name: "Setup: Create handlers listed in cl_handlers."
153  when: cl_handlers_create | bool
154  vars:
155    handler_file: "handlers-auto-{{ item.key }}.yml"
156    handler_path: "{{ role_path }}/handlers/{{ handler_file }}"
157  block:
158
159    - name: "Setup: Create handlers listed in cl_handlers."
160      ansible.builtin.template:
161        dest: "{{ handler_path }}"
162        src: "{{ item.value.template }}"
163        mode: "{{ item.value.mode | d(omit) }}"
164        validate: "{{ cl_handlers_validate | d(omit) }}"
165        backup: "{{ cl_backup }}"
166      loop: "{{ cl_handlers | dict2items }}"
167      loop_control:
168        label: "{{ handler_file }}"
169
170    - name: "Setup: Include handlers in handlers/main.yml"
171      ansible.builtin.lineinfile:
172        path: "{{ role_path }}/handlers/main.yml"
173        line: "- ansible.builtin.import_tasks: {{ handler_file }} # noqa: name[missing]"
174        validate: "{{ cl_handlers_validate | d(omit) }}"
175        backup: "{{ cl_backup }}"
176      loop: "{{ cl_handlers | dict2items }}"
177      loop_control:
178        label: "{{ handler_file }}"
179
180# EOF

vars-handlers.yml

Synopsis: Configure vars-handlers

Description of the task.

[tasks/vars-handlers.yml]

 1---
 2- name: Assemble handlers.
 3  block:
 4
 5    - name: "Vars-handlers: Assemble handlers to {{ cl_handlersd }}"
 6      ansible.builtin.assemble:
 7        regexp: "{{ cl_assemble_regexp }}"
 8        src: "{{ cl_handlersd_dir }}"
 9        dest: "{{ cl_handlersd }}"
10        owner: "{{ cl_dira_owner | d(omit) }}"
11        group: "{{ cl_dira_group | d(omit) }}"
12        mode: "{{ cl_dira_fmode }}"
13        validate: "{{ cl_assemble_validate | d(omit, true) }}"
14
15  rescue:
16
17    - name: "Vars-handlers: Failed assemble handlers to {{ cl_handlersd }}"
18      ansible.builtin.debug:
19        msg: |-
20          [ERR] Can not assemble handlers. End of play.
21          {{ ansible_failed_result }}
22
23    - name: "Vars-handlers: End of play."
24      ansible.builtin.meta: end_play
25
26- name: "Vars-handlers: Include files from {{ cl_handlersd ~ ' to cl_handlersd_items' }}"
27  ansible.builtin.include_vars:
28    file: "{{ cl_handlersd }}"
29    name: cl_handlersd_items
30
31- name: "Vars-handlers: Combine cl_handlers with cl_handlersd_items."
32  ansible.builtin.set_fact:
33    cl_handlers: "{{ cl_handlers | combine(cl_handlersd_items | d({})) }}"
34
35- name: "Vars-handlers: Debug cl_debug={{ cl_debug }}"
36  when: cl_debug | bool
37  ansible.builtin.debug:
38    var: cl_handlers
39
40# EOF

vars.yml

Synopsis: Configure vars

Description of the task.

[tasks/vars.yml]

 1---
 2- name: "Vars: Debug cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  vars:
 5    msg: |-
 6      cl_packagesd_dir: {{ cl_packagesd_dir }}
 7      cl_statesd_dir: {{ cl_statesd_dir }}
 8      cl_servicesd_dir: {{ cl_servicesd_dir }}
 9      cl_filesd_dir: {{ cl_filesd_dir }}
10
11      cl_dira: {{ cl_dira }}
12      cl_packagesd: {{ cl_packagesd }}
13      cl_statesd: {{ cl_statesd }}
14      cl_servicesd: {{ cl_servicesd }}
15      cl_filesd: {{ cl_filesd }}
16
17      cl_all_delete: {{ cl_all_delete }}
18      cl_packagesd_delete: {{ cl_packagesd_delete }}
19      cl_servicesd_delete: {{ cl_servicesd_delete }}
20      cl_filesd_delete: {{ cl_filesd_delete }}
21      cl_statesd_delete: {{ cl_statesd_delete }}
22
23      cl_assemble_validate: {{ cl_assemble_validate | d(omit, true) }}
24  ansible.builtin.debug:
25    msg: "{{ '{}'.format(msg) }}"
26
27- name: "Vars: Packages."
28  ansible.builtin.import_tasks: vars-packages.yml
29
30- name: "Vars: States."
31  ansible.builtin.import_tasks: vars-states.yml
32
33- name: "Vars: Services."
34  ansible.builtin.import_tasks: vars-services.yml
35
36- name: "Vars: Files."
37  ansible.builtin.import_tasks: vars-files.yml
38
39# EOF

vars-packages.yml

Synopsis: Configure vars-packages

Description of the task.

[tasks/vars-packages.yml]

 1---
 2- name: Assemble packages.
 3  delegate_to: localhost
 4
 5  block:
 6    - name: "Vars-packages: Delete {{ cl_packagesd }}"
 7      when: cl_all_delete | bool or cl_packagesd_delete | bool
 8      ansible.builtin.file:
 9        state: absent
10        path: "{{ cl_packagesd }}"
11
12    - name: "Vars-packages: Assemble packages to {{ cl_packagesd }}"
13      ansible.builtin.assemble:
14        regexp: "{{ cl_assemble_regexp }}"
15        src: "{{ cl_packagesd_dir }}"
16        dest: "{{ cl_packagesd }}"
17        owner: "{{ cl_dira_owner | d(omit) }}"
18        group: "{{ cl_dira_group | d(omit) }}"
19        mode: "{{ cl_dira_fmode }}"
20        validate: "{{ cl_assemble_validate | d(omit, true) }}"
21
22  rescue:
23
24    - name: "Vars-packages: Failed assemble packages to {{ cl_packagesd }}"
25      ansible.builtin.debug:
26        msg: |-
27          [ERR] Can not assemble packages. End of play.
28          {{ ansible_failed_result }}
29
30    - name: "Vars-packages: End of play."
31      ansible.builtin.meta: end_play
32
33- name: "Vars-packages: Include files from {{ cl_packagesd ~ ' to cl_packagesd_items' }}"
34  ansible.builtin.include_vars:
35    file: "{{ cl_packagesd }}"
36    name: cl_packagesd_items
37
38- name: "Vars-packages: Combine cl_packages with cl_packagesd_items."
39  ansible.builtin.set_fact:
40    cl_packages: "{{ cl_packages | combine(cl_packagesd_items | d({})) }}"
41
42- name: "Vars-packages: Debug cl_debug={{ cl_debug }}"
43  when: cl_debug | bool
44  ansible.builtin.debug:
45    var: cl_packages
46
47# TODO: sort|unique list of packages/ports
48
49# EOF

vars-states.yml

Synopsis: Configure vars-states

Description of the task.

[tasks/vars-states.yml]

 1---
 2- name: Assemble states.
 3  delegate_to: localhost
 4
 5  block:
 6    - name: "Vars-states: Delete {{ cl_statesd }}"
 7      when: cl_all_delete | bool or cl_statesd_delete | bool
 8      ansible.builtin.file:
 9        state: absent
10        path: "{{ cl_statesd }}"
11
12    - name: "Vars-states: Assemble states to {{ cl_statesd }}"
13      ansible.builtin.assemble:
14        regexp: "{{ cl_assemble_regexp }}"
15        src: "{{ cl_statesd_dir }}"
16        dest: "{{ cl_statesd }}"
17        owner: "{{ cl_dira_owner | d(omit) }}"
18        group: "{{ cl_dira_group | d(omit) }}"
19        mode: "{{ cl_dira_fmode }}"
20        validate: "{{ cl_assemble_validate | d(omit, true) }}"
21
22  rescue:
23
24    - name: "Vars-states: Failed assemble states to {{ cl_states }}"
25      ansible.builtin.debug:
26        msg: |-
27          [ERR] Can not assemble states. End of play.
28          {{ ansible_failed_result }}
29
30    - name: "Vars-states: End of play."
31      ansible.builtin.meta: end_play
32
33- name: "Vars-states: Include files from {{ cl_statesd ~ ' to cl_statesd_items' }}"
34  ansible.builtin.include_vars:
35    file: "{{ cl_statesd }}"
36    name: cl_statesd_items
37
38- name: "Vars-states: Combine cl_statess with cl_statesd_items."
39  ansible.builtin.set_fact:
40    cl_states: "{{ cl_states | combine(cl_statesd_items | d({})) }}"
41
42- name: "Vars-states: Debug cl_debug={{ cl_debug }}"
43  when: cl_debug | bool
44  ansible.builtin.debug:
45    var: cl_states
46
47# EOF

vars-services.yml

Synopsis: Configure vars-services

Description of the task.

[tasks/vars-services.yml]

 1---
 2- name: Assemble services.
 3  delegate_to: localhost
 4  block:
 5
 6    - name: "Vars-services: Delete {{ cl_servicesd }}"
 7      when: cl_all_delete | bool or cl_servicesd_delete | bool
 8      ansible.builtin.file:
 9        state: absent
10        path: "{{ cl_servicesd }}"
11
12    - name: "Vars-services: Assemble services to {{ cl_servicesd }}"
13      ansible.builtin.assemble:
14        regexp: "{{ cl_assemble_regexp }}"
15        src: "{{ cl_servicesd_dir }}"
16        dest: "{{ cl_servicesd }}"
17        owner: "{{ cl_dira_owner | d(omit) }}"
18        group: "{{ cl_dira_group | d(omit) }}"
19        mode: "{{ cl_dira_fmode }}"
20        validate: "{{ cl_assemble_validate | d(omit, true) }}"
21
22  rescue:
23
24    - name: "Vars-services: Failed assemble services to {{ cl_servicesd }}"
25      ansible.builtin.debug:
26        msg: |-
27          [ERR] Can not assemble services. End of play.
28          {{ ansible_failed_result }}
29
30    - name: "Vars-services: End of play."
31      ansible.builtin.meta: end_play
32
33- name: "Vars-services: Include files from {{ cl_servicesd ~ ' to cl_cervicesd_items' }}"
34  ansible.builtin.include_vars:
35    file: "{{ cl_servicesd }}"
36    name: cl_servicesd_items
37
38- name: "Vars-services: Combine cl_services with cl_servicesd_items."
39  ansible.builtin.set_fact:
40    cl_services: "{{ cl_services | combine(cl_servicesd_items | d({})) }}"
41
42- name: "Vars-services: Debug cl_debug={{ cl_debug }}"
43  when: cl_debug | bool
44  ansible.builtin.debug:
45    var: cl_services
46
47# EOF

vars-files.yml

Synopsis: Configure vars-files

Description of the task.

[tasks/vars-files.yml]

 1---
 2- name: Assemble files.
 3  delegate_to: localhost
 4  block:
 5
 6    - name: "Vars-files: Delete {{ cl_filesd }}"
 7      when: cl_all_delete | bool or cl_filesd_delete | bool
 8      ansible.builtin.file:
 9        state: absent
10        path: "{{ cl_filesd }}"
11
12    - name: "Vars-files: Assemble files to {{ cl_filesd }}"
13      ansible.builtin.assemble:
14        regexp: "{{ cl_assemble_regexp }}"
15        src: "{{ cl_filesd_dir }}"
16        dest: "{{ cl_filesd }}"
17        owner: "{{ cl_dira_owner | d(omit) }}"
18        group: "{{ cl_dira_group | d(omit) }}"
19        mode: "{{ cl_dira_fmode }}"
20        validate: "{{ cl_assemble_validate | d(omit, true) }}"
21
22  rescue:
23
24    - name: "Vars-files: Failed assemble files to {{ cl_filesd }}"
25      ansible.builtin.debug:
26        msg: |-
27          [ERR] Can not assemble files. End of play.
28          {{ ansible_failed_result }}
29
30    - name: "Vars-files: End of play."
31      ansible.builtin.meta: end_play
32
33- name: "Vars-files: Include files from {{ cl_filesd ~ ' to cl_filesd_items' }}"
34  ansible.builtin.include_vars:
35    file: "{{ cl_filesd }}"
36    name: cl_filesd_items
37
38- name: "Vars-files: Combine cl_files with cl_filesd_items."
39  ansible.builtin.set_fact:
40    cl_files: "{{ cl_files | combine(cl_filesd_items | d({})) }}"
41
42- name: "Vars-files: Debug cl_debug={{ cl_debug }}"
43  when: cl_debug | bool
44  ansible.builtin.debug:
45    var: cl_files
46
47# EOF

sanity.yml

Synopsis: Configure sanity

Description of the task.

[tasks/sanity.yml]

 1---
 2- name: Collections installed.
 3  when: cl_sanity_collections | bool
 4  block:
 5
 6    # TODO: Find installed collections and compare the list with cl_collections
 7
 8    - name: "Sanity: Collections must be installed."
 9      ansible.builtin.debug:
10        msg: |-
11          [ERR] Collections are not installed. End of play.
12          Hint: Check the required collections are installed.
13          {{ cl_collections }}
14
15    - name: "Sanity: End of play"
16      ansible.builtin.meta: end_play
17
18- name: "Sanity: Data directories must exist."
19  ansible.builtin.assert:
20    quiet: "{{ cl_sanity_quiet }}"
21    that:
22      - cl_handlersd_dir is exists
23      - cl_packagesd_dir is exists
24      - cl_statesd_dir is exists
25      - cl_servicesd_dir is exists
26      - cl_filesd_dir is exists
27    fail_msg: |-
28      [ERR] Data directories do not exist.
29      Hint: Check the existence of directories
30      {{ cl_handlersd_dir }}
31      {{ cl_packagesd_dir }}
32      {{ cl_statesd_dir }}
33      {{ cl_servicesd_dir }}
34      {{ cl_filesd_dir }}
35
36- name: "Sanity: Assembled data must exist in ansible_check_mode."
37  when: ansible_check_mode
38  ansible.builtin.assert:
39    quiet: "{{ cl_sanity_quiet }}"
40    that:
41      - cl_packagesd is exists
42      - cl_statesd is exists
43      - cl_servicesd is exists
44      - cl_filesd is exists
45    fail_msg: |-
46      [ERR] Assembled data do not exist in ansible_check_mode.
47      Hint: Assemble variables first.
48      Run: ansible-playbook playbook.yml -t cl_vars
49
50- name: "Sanity: Supported modules for packages."
51  when: cl_sanity_modules_pkg | bool
52  vars:
53    unsupported: "{{ cl_packages.values() | list |
54                     json_query('[].module') | unique |
55                     difference(cl_supported_modules_pkg) }}"
56  ansible.builtin.assert:
57    quiet: "{{ cl_sanity_quiet }}"
58    that: unsupported | length == 0
59    fail_msg: |-
60      [ERR] Unsupported module(s) {{ unsupported }} in assembled packages.
61
62- name: "Sanity: yamllint must be installed."
63  when: cl_sanity_yamllint | bool
64  vars:
65    regex: ^yamllint \d+\.\d+\.\d+$
66    out: "{{ lookup('pipe', cl_yamllint ~ ' --version') }}"
67  ansible.builtin.assert:
68    quiet: "{{ cl_sanity_quiet }}"
69    that: out is match(regex)
70    fail_msg: |-
71      [ERR] yamllint not installed on controller.
72    success_msg: |-
73      [OK]  yamllint found on controller.
74
75# EOF

debug.yml

Synopsis: Configure debug

Description of the task.

[tasks/debug.yml]

 1---
 2- name: "Debug: Config Light."
 3  vars:
 4    msg: |-
 5      cl_role_version: {{ cl_role_version }}
 6      ansible_facts.os_family: {{ ansible_facts.os_family }}
 7      ansible_facts.distribution: {{ ansible_facts.distribution }}
 8      ansible_facts.distribution_major_version: {{ ansible_facts.distribution_major_version }}
 9      ansible_facts.distribution_version: {{ ansible_facts.distribution_version }}
10      ansible_facts.distribution_release: {{ ansible_facts.distribution_release }}
11      ansible_facts.python_version: {{ ansible_facts.python_version }}
12
13      cl_supported_linux_family: {{ cl_supported_linux_family }}
14      cl_supported_modules_pkg: {{ cl_supported_modules_pkg }}
15      cl_collections:
16        {{ cl_collections | to_nice_yaml(indent=2) | indent(2) }}
17
18      cl_sanity: {{ cl_sanity }}
19      cl_sanity_quiet: {{ cl_sanity_quiet }}
20      cl_sanity_collections: {{ cl_sanity_collections }}
21      cl_sanity_modules_pkg: {{ cl_sanity_modules_pkg }}
22      cl_sanity_yamllint: {{ cl_sanity_yamllint }}
23
24      cl_setup: {{ cl_setup }}
25      cl_install: {{ cl_install }}
26      cl_backup: {{ cl_backup }}
27      cl_copyfile_delete: {{ cl_copyfile_delete }}
28      cl_template_delete: {{ cl_template_delete }}
29
30      cl_handlers:
31        {{ cl_handlers | to_nice_yaml(indent=2) | indent(2) }}
32      cl_packages:
33        {{ cl_packages | to_nice_yaml(indent=2) | indent(2) }}
34      cl_services:
35        {{ cl_services | to_nice_yaml(indent=2) | indent(2) }}
36      cl_files:
37        {{ cl_files | to_nice_yaml(indent=2) | indent(2) }}
38      cl_states:
39        {{ cl_states | to_nice_yaml(indent=2) | indent(2) }}
40
41      cl_dird: {{ cl_dird }}
42      cl_dird_owner: {{ cl_dira_owner | default('UNDEFINED') }}
43      cl_dird_group: {{ cl_dira_group | default('UNDEFINED') }}
44      cl_dird_dmode: {{ cl_dira_dmode }}
45
46      cl_handlersd_dir: {{ cl_handlersd_dir }}
47      cl_packagesd_dir: {{ cl_packagesd_dir }}
48      cl_servicesd_dir: {{ cl_servicesd_dir }}
49      cl_filesd_dir: {{ cl_filesd_dir }}
50      cl_statesd_dir: {{ cl_statesd_dir }}
51
52      cl_dira: {{ cl_dira }}
53      cl_dira_owner: {{ cl_dira_owner | default('UNDEFINED') }}
54      cl_dira_group: {{ cl_dira_group | default('UNDEFINED') }}
55      cl_dira_dmode: {{ cl_dira_dmode }}
56      cl_dira_fmode: {{ cl_dira_fmode }}
57      cl_assemble_regexp: {{ cl_assemble_regexp }}
58
59      cl_handlersd: {{ cl_handlersd }}
60      cl_handlers_delete_all: {{ cl_handlers_delete_all }}
61      cl_handlers_delete: {{ cl_handlers_delete }}
62      cl_handlers_create: {{ cl_handlers_create }}
63
64      cl_packagesd: {{ cl_packagesd }}
65      cl_servicesd: {{ cl_servicesd }}
66      cl_filesd: {{ cl_filesd }}
67      cl_statesd: {{ cl_statesd }}
68      cl_all_delete: {{ cl_all_delete }}
69      cl_packagesd_delete: {{ cl_packagesd_delete }}
70      cl_servicesd_delete: {{ cl_servicesd_delete }}
71      cl_filesd_delete: {{ cl_filesd_delete }}
72      cl_statesd_delete: {{ cl_statesd_delete }}
73
74      cl_yamllint: {{ cl_yamllint }}
75      cl_assemble_validate: {{ cl_assemble_validate | default('UNDEFINED') }}
76      cl_handlers_validate: {{ cl_handlers_validate | default('UNDEFINED') }}
77
78      cl_files_order:
79        {{ cl_files_order | to_nice_yaml(indent=2) | indent(2) }}
80
81      install_retries: {{ install_retries }}
82      install_delay: {{ install_delay }}
83
84      freebsd_install_method: {{ freebsd_install_method }}
85      freebsd_use_packages: {{ freebsd_use_packages }}
86      cl_rcconfd: {{ cl_rcconfd }}
87      cl_rcconfd_dir: {{ cl_rcconfd_dir }}
88  ansible.builtin.debug:
89    msg: "{{ '{}'.format(msg) }}"
90
91# EOF

packages.yml

Synopsis: Configure packages

Description of the task.

[tasks/packages.yml]

  1---
  2- name: "Packages: Select lists."
  3  ansible.builtin.set_fact:
  4    my_packages_apt: "{{ cl_packages.values() | list | json_query('[?module == `apt`]') }}"
  5    my_packages_snap: "{{ cl_packages.values() | list | json_query('[?module == `snap`]') }}"
  6    my_packages_yum: "{{ cl_packages.values() | list | json_query('[?module == `yum`]') }}"
  7    my_packages_pkgng: "{{ cl_packages.values() | list | json_query('[?module == `pkgng`]') }}"
  8    my_packages_package: "{{ cl_packages.values() | list | json_query('[?module == `package`]') }}"
  9    my_packages_undef: "{{ cl_packages.values() | list | selectattr('module', 'undefined') | flatten }}"
 10
 11- name: "Packages: Create list defaulted to module package."
 12  ansible.builtin.set_fact:
 13    my_packages_default: "{{ my_packages_package + my_packages_undef }}"
 14
 15- name: "Packages: Debug cl_debug={{ cl_debug }}"
 16  when: cl_debug | bool
 17  ansible.builtin.debug:
 18    msg: |
 19      cl_packages:
 20        {{ cl_packages | to_nice_yaml(indent=2) | indent(2) }}
 21      my_packages_apt:
 22        {{ my_packages_apt | to_yaml(indent=2) | indent(2) }}
 23      my_packages_snap:
 24        {{ my_packages_snap | to_yaml(indent=2) | indent(2) }}
 25      my_packages_yum:
 26        {{ my_packages_yum | to_yaml(indent=2) | indent(2) }}
 27      my_packages_pkgng:
 28        {{ my_packages_pkgng | to_yaml(indent=2) | indent(2) }}
 29      my_packages_package:
 30        {{ my_packages_package | to_yaml(indent=2) | indent(2) }}
 31      my_packages_undef:
 32        {{ my_packages_undef | to_yaml(indent=2) | indent(2) }}
 33      my_packages_default:
 34        {{ my_packages_default | to_yaml(indent=2) | indent(2) }}
 35
 36- name: FreeBSD packages.
 37  when:
 38    - my_packages_pkgng | length > 0
 39    - ansible_facts.os_family == 'FreeBSD'
 40    - freebsd_install_method | lower == 'packages'
 41  block:
 42
 43    - name: "Packages: Manage FreeBSD packages."
 44      register: result
 45      until: result is succeeded
 46      retries: "{{ install_retries }}"
 47      delay: "{{ install_delay }}"
 48      delegate_to: "{{ freebsd_pkgng_delegate | d(omit) }}"
 49      community.general.pkgng:
 50        name: "{{ item.name }}" # list/elements=string required
 51        state: "{{ item.state | d(omit) }}"
 52        annotation: "{{ item.annotation | d(omit) }}"
 53        autoremove: "{{ freebsd_pkgng_autoremove | d(omit) }}"
 54        cached: "{{ freebsd_pkgng_cached | d(omit) }}"
 55        chroot: "{{ freebsd_pkgng_chroot | d(omit) }}"
 56        ignore_osver: "{{ freebsd_pkgng_ignore_osver | d(omit) }}"
 57        jail: "{{ freebsd_pkgng_jail | d(omit) }}"
 58        pkgsite: "{{ freebsd_pkgng_pkgsite | d(omit) }}"
 59        rootdir: "{{ freebsd_pkgng_rootdir | d(omit) }}"
 60        use_globs: "{{ freebsd_pkgng_use_globs | d(omit) }}"
 61      loop: "{{ my_packages_pkgng }}"
 62      loop_control:
 63        label: "{{ item.name }}"
 64
 65    - name: "Packages: Debug FreeBSD packages cl_debug={{ cl_debug }}"
 66      when: cl_debug | bool
 67      ansible.builtin.debug:
 68        var: result
 69
 70- name: FreeBSD ports.
 71  when:
 72    - my_packages_pkgng | length > 0
 73    - ansible_facts.os_family == 'FreeBSD'
 74    - freebsd_install_method | lower == 'ports'
 75  block:
 76
 77    - name: "Packages: Manage FreeBSD ports."
 78      register: result
 79      until: result is succeeded
 80      retries: "{{ install_retries }}"
 81      delay: "{{ install_delay }}"
 82      community.general.portinstall:
 83        name: "{{ item.1 }}" # string required
 84        state: "{{ item.0.state | d(omit) }}"
 85        use_packages: "{{ item.0.use_packages | d(freebsd_use_packages) }}"
 86      loop: "{{ my_packages_pkgng | d([]) | subelements('name') }}"
 87      loop_control:
 88        label: "{{ item.1 }}"
 89
 90    - name: "Packages: Debug FreeBSD ports cl_debug={{ cl_debug }}"
 91      when: cl_debug | bool
 92      ansible.builtin.debug:
 93        var: result
 94
 95- name: Linux snap.
 96  when:
 97    - my_packages_snap | length > 0
 98    - ansible_facts.os_family in cl_supported_linux_family
 99  block:
100
101    - name: "Packages: Find snap."
102      register: cl_find_snap
103      ansible.builtin.find:
104        paths: "{{ cl_snap_paths }}"
105        patterns: "{{ cl_snap_patterns }}"
106
107    - name: "Packages: Debug find snap cl_debug={{ cl_debug }}"
108      when: cl_debug | bool
109      ansible.builtin.debug:
110        var: cl_find_snap
111
112    - name: "Packages: Fail if snap is missing."
113      when: cl_find_snap.matched == 0
114      ansible.builtin.fail:
115        msg: "[ERR] snap is missing."
116
117      # TODO: Complete parameters of the modules
118    - name: "Packages: Manage Linux packages by snap module."
119      register: result
120      until: result is succeeded
121      retries: "{{ install_retries }}"
122      delay: "{{ install_delay }}"
123      community.general.snap:
124        name: "{{ item.name }}" # list/elements=string
125        state: "{{ item.state | d(omit) }}"
126      loop: "{{ my_packages_snap }}"
127      loop_control:
128        label: "{{ item.name }}"
129
130    - name: "Packages: Debug Linux snap cl_debug={{ cl_debug }}"
131      when: cl_debug | bool
132      ansible.builtin.debug:
133        var: result
134
135- name: Linux package.
136  when:
137    - my_packages_default | length > 0
138    - ansible_facts.os_family in cl_supported_linux_family
139  block:
140
141    - name: "Packages: Manage Linux packages by package module."
142      register: result
143      until: result is succeeded
144      retries: "{{ install_retries }}"
145      delay: "{{ install_delay }}"
146      ansible.builtin.package:
147        name: "{{ item.1 }}" # string / required
148        state: "{{ item.0.state | d('present') }}"
149        use: "{{ item.0.use | d('auto') }}"
150      loop: "{{ my_packages_default | d([]) | subelements('name') }}"
151      loop_control:
152        label: "{{ item.1 }}"
153
154    - name: "Packages: Debug Linux package cl_debug={{ cl_debug }}"
155      when: cl_debug | bool
156      ansible.builtin.debug:
157        var: result
158
159- name: Linux yum/dnf.
160  when:
161    - my_packages_yum | length > 0
162    - ansible_facts.os_family == 'RedHat'
163  block:
164
165      # TODO: Complete parameters of the modules
166    - name: "Packages: Manage Linux packages by dnf module."
167      register: result
168      until: result is succeeded
169      retries: "{{ install_retries }}"
170      delay: "{{ install_delay }}"
171      ansible.builtin.dnf:
172        name: "{{ item.name }}" # list/elements=string
173        state: "{{ item.state | d(omit) }}"
174        use_backend: "{{ item.use | d(omit) }}"
175      loop: "{{ my_packages_yum }}"
176      loop_control:
177        label: "{{ item.name }}"
178
179    - name: "Packages: Debug Linux yum cl_debug={{ cl_debug }}"
180      when: cl_debug | bool
181      ansible.builtin.debug:
182        var: result
183
184- name: Linux apt.
185  when:
186    - my_packages_apt | length > 0
187    - ansible_facts.os_family == 'Debian'
188  block:
189
190      # TODO: Complete parameters of the modules
191    - name: "Packages: Manage Linux packages by apt module."
192      register: result
193      until: result is succeeded
194      retries: "{{ install_retries }}"
195      delay: "{{ install_delay }}"
196      ansible.builtin.apt:
197        name: "{{ item.name }}" # list/elements=string
198        state: "{{ item.state | d(omit) }}"
199        purge: "{{ item.purge | d(omit) }}"
200      loop: "{{ my_packages_apt }}"
201      loop_control:
202        label: "{{ item.name }}"
203
204    - name: "Packages: Debug Linux apt cl_debug={{ cl_debug }}"
205      when: cl_debug | bool
206      ansible.builtin.debug:
207        var: result
208
209# EOF

states.yml

Synopsis: Configure states

Description of the task.

[tasks/states.yml]

 1---
 2- name: "States: Debug cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_states }}"
 6
 7- name: "States: Apply unmount states."
 8  when: item.value.state | d('absent') in cl_states_unmount
 9  ansible.posix.mount:
10    path: "{{ item.value.path }}"
11    state: "{{ item.value.state | d('absent') }}"
12    backup: "{{ item.value.backup | d(omit) }}"
13    boot: "{{ item.value.boot | d(omit) }}"
14    dump: "{{ item.value.dump | d(omit) }}"
15    fstab: "{{ item.value.fstab | d(omit) }}"
16    opts: "{{ item.value.opts | d(omit) }}"
17    passno: "{{ item.value.passno | d(omit) }}"
18    src: "{{ item.value.src | d(omit) }}"
19  loop: "{{ cl_states | dict2items }}"
20  loop_control:
21    label: "{{ item.value.path }}"
22
23- name: "States: Apply file states."
24  when: item.value.state | d('file') in cl_states_file
25  ansible.builtin.file:
26    path: "{{ item.value.path }}"
27    state: "{{ item.value.state | d(omit) }}"
28    src: "{{ item.value.src | d(omit) }}"
29    owner: "{{ item.value.owner | d(omit) }}"
30    group: "{{ item.value.group | d(omit) }}"
31    mode: "{{ item.value.mode | d(omit) }}"
32    attributes: "{{ item.value.attributes | d(omit) }}"
33    recurse: "{{ item.value.recurse | d(omit) }}"
34    force: "{{ item.value.force | d(omit) }}"
35    follow: "{{ item.value.follow | d(omit) }}"
36    access_time: "{{ item.value.access_time | d(omit) }}"
37    access_time_format: "{{ item.value.access_time_format | d(omit) }}"
38    modification_time: "{{ item.value.modification_time | d(omit) }}"
39    modification_time_format: "{{ item.value.modification_time_format | d(omit) }}"
40    unsafe_writes: "{{ item.value.unsafe_writes | d(omit) }}"
41  loop: "{{ cl_states | dict2items }}"
42  loop_control:
43    label: "{{ item.value.path }}"
44
45- name: "States: Apply mount states."
46  when: item.value.state | d('absent') in cl_states_mount
47  ansible.posix.mount:
48    path: "{{ item.value.path }}"
49    state: "{{ item.value.state }}"
50    backup: "{{ item.value.backup | d(omit) }}"
51    boot: "{{ item.value.boot | d(omit) }}"
52    dump: "{{ item.value.dump | d(omit) }}"
53    fstab: "{{ item.value.fstab | d(omit) }}"
54    opts: "{{ item.value.opts | d(omit) }}"
55    passno: "{{ item.value.passno | d(omit) }}"
56    src: "{{ item.value.src | d(omit) }}"
57  loop: "{{ cl_states | dict2items }}"
58  loop_control:
59    label: "{{ item.value.path }}"
60
61# EOF

files.yml

Synopsis: Manage files.

Iterate cl_files_order (6) and include tasks with particular modules.

[tasks/files.yml]

1---
2- name: "Files: Manage files."
3  ansible.builtin.include_tasks:
4    file: files-{{ fitem }}.yml
5  loop: "{{ cl_files_order }}"
6  loop_control:
7    loop_var: fitem
8
9# EOF

See also

  • See Files Order of options

Hint

  • Customize the list cl_files_order and fit the order of the options to your needs.

files-blockinfile.yml

Synopsis: Configure files-blockinfile

Description of the task.

[tasks/files-blockinfile.yml]

 1---
 2- name: "Files-blockinfile: Debug blocks in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('blocks', 'defined') | list }}"
 6
 7- name: "Files-blockinfile: Blockinfile."
 8  register: cl_results_blocks
 9  notify: "{{ item.0.handlers | d(omit) }}"
10  ansible.builtin.blockinfile:
11    path: "{{ item.0.path }}"
12    marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.1.marker }}"
13    block: "{{ item.1.block }}"
14    state: "{{ item.1.state|d(omit) }}"
15    insertafter: "{{ item.1.insertafter | d(omit) }}"
16    insertbefore: "{{ item.1.insertbefore | d(omit) }}"
17    marker_begin: "{{ item.1.marker_begin | d(omit) }}"
18    marker_end: "{{ item.1.marker_end | d(omit) }}"
19    owner: "{{ item.0.owner | d(omit) }}"
20    group: "{{ item.0.group | d(omit) }}"
21    mode: "{{ item.0.mode | d(omit) }}"
22    attributes: "{{ item.0.attributes | d(omit) }}"
23    create: "{{ item.0.create | d(omit) }}"
24    validate: "{{ item.0.validate | d(omit) }}"
25    # backup: "{{ cl_backup }}"
26  loop: "{{ cl_files.values() | list | subelements('blocks', skip_missing=true) }}"
27  loop_control:
28    label: "{{ item.0.path }} {{ item.1.marker }}"
29
30- name: Debug
31  when: cl_debug | bool
32  block:
33
34    - name: "Files-blockinfile: Debug cl_results_blocks."
35      ansible.builtin.debug:
36        var: cl_results_blocks
37
38    - name: "Files-blockinfile: Debug changed blocks paths."
39      ansible.builtin.debug:
40        msg: "{{ cl_results_blocks.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
41
42# EOF

files-copy.yml

Synopsis: Configure files-copy

Description of the task.

[tasks/files-copy.yml]

 1---
 2- name: "Files-copy: Debug copyfile in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('copyfile', 'defined') | list }}"
 6
 7- name: "Files-copy: Delete copyfile in cl_files.values()"
 8  when: cl_copyfile_delete | bool
 9  ansible.builtin.file:
10    state: absent
11    path: "{{ item.path }}"
12  loop: "{{ cl_files.values() | selectattr('copyfile', 'defined') | list }}"
13  loop_control:
14    label: "{{ item.path }}"
15
16- name: "Files-copy: Copy copyfile in cl_files.values()"
17  register: cl_results_copy
18  notify: "{{ item.handlers | d(omit) }}"
19  ansible.builtin.copy:
20    dest: "{{ item.path }}"
21    src: "{{ item.copyfile.path }}"
22    checksum: "{{ item.copyfile.checksum | d(omit) }}"
23    content: "{{ item.copyfile.content | d(omit) }}"
24    decrypt: "{{ item.copyfile.decrypt | d(omit) }}"
25    directory_mode: "{{ item.copyfile.directory_mode | d(omit) }}"
26    follow: "{{ item.copyfile.follow | d(omit) }}"
27    force: "{{ item.copyfile.force | d(omit) }}"
28    local_follow: "{{ item.copyfile.local_follow | d(omit) }}"
29    remote_src: "{{ item.copyfile.remote_src | d(omit) }}"
30    owner: "{{ item.owner | d(omit) }}"
31    group: "{{ item.group | d(omit) }}"
32    mode: "{{ item.mode | d(omit) }}"
33    attributes: "{{ item.attributes | d(omit) }}"
34    validate: "{{ item.validate | d(omit) }}"
35    # backup: "{{ cl_backup }}"
36  loop: "{{ cl_files.values() | selectattr('copyfile', 'defined') | list }}"
37  loop_control:
38    label: "{{ item.path }}"
39
40- name: Debug
41  when: cl_debug | bool
42  block:
43
44    - name: "Files-copy: Debug cl_results_copy cl_debug={{ cl_debug }}"
45      ansible.builtin.debug:
46        var: cl_results_copy
47
48    - name: "Files-copy: Debug changed copy path cl_debug={{ cl_debug }}"
49      ansible.builtin.debug:
50        msg: "{{ cl_results_copy | d([]) | json_query('[?changed].invocation.module_args.path') }}"
51
52# EOF

files-create-backup.yml

Synopsis: Configure files-create-backup

Description of the task.

[tasks/files-create-backup.yml]

 1---
 2- name: "File-create-backup: Create time-stamp."
 3  ansible.builtin.set_fact:
 4    cl_timestamp: "{{ '%Y-%m-%d_%H_%M_%S' | strftime }}"
 5
 6- name: "File-create-backup: Stat cl_files."
 7  register: result
 8  ansible.builtin.stat:
 9    path: "{{ item }}"
10  loop: "{{ cl_files.values() | map(attribute='path') | list | unique }}"
11  loop_control:
12    label: "{{ item }}"
13
14- name: "File-create-backup: Debug result cl_debug={{ cl_debug }}"
15  when: cl_debug | bool
16  ansible.builtin.debug:
17    var: result
18
19- name: "File-create-backup: Create backup files."
20  when: item.stat.exists
21  changed_when: false
22  ansible.builtin.copy:
23    remote_src: true
24    src: "{{ item.item }}"
25    dest: "{{ item.item }}_{{ cl_timestamp }}.bak"
26    mode: preserve
27  loop: "{{ result.results }}"
28  loop_control:
29
30    label: "{{ item.item }}"
31
32# EOF

files-delete-backup.yml

Synopsis: Configure files-delete-backup

Description of the task.

[tasks/files-delete-backup.yml]

 1---
 2- name: "Files-delete-backup: Delete backup files that did not change."
 3  when:
 4    - cl_backup | bool
 5    - not ansible_check_mode
 6  changed_when: false
 7  ansible.builtin.file:
 8    state: absent
 9    path: "{{ item }}_{{ cl_timestamp }}.bak"
10  loop: "{{ cl_files.values() | list |
11            json_query('[].path') |
12            difference(cl_results_copy.results | d([]) |
13            json_query('[?changed].invocation.module_args.path')) | unique |
14            difference(cl_results_template.results | d([]) |
15            json_query('[?changed].invocation.module_args.path')) | unique |
16            difference(cl_results_lines.results | d([]) |
17            json_query('[?changed].invocation.module_args.path')) | unique |
18            difference(cl_results_blocks.results | d([]) |
19            json_query('[?changed].invocation.module_args.path')) | unique |
20            difference(cl_results_inifile.results | d([]) |
21            json_query('[?changed].invocation.module_args.path')) | unique |
22            difference(cl_results_ucl.results | d([]) |
23            json_query('[?changed].invocation.module_args.path')) | unique |
24            difference(cl_results_patch.results | d([]) |
25            json_query('[?changed].invocation.module_args.path')) | unique }}"
26
27# EOF

files-inifile.yml

Synopsis: Configure files-inifile

Description of the task.

[tasks/files-inifile.yml]

 1---
 2- name: "Files-inifile: Debug ini in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('ini', 'defined') | list }}"
 6
 7- name: "Files-inifile: INI files."
 8  register: cl_results_ini
 9  notify: "{{ item.0.handlers | d(omit) }}"
10  community.general.ini_file:
11    path: "{{ item.0.path }}"
12    section: "{{ item.1.section }}"
13    option: "{{ item.1.option | d(omit) }}"
14    value: "{{ item.1.value | d(omit) }}"
15    state: "{{ item.1.state | d(omit) }}"
16    allow_no_value: "{{ item.1.allow_no_value | d(omit) }}"
17    no_extra_spaces: "{{ item.1.no_extra_spaces | d(omit) }}"
18    owner: "{{ item.0.owner | d(omit) }}"
19    group: "{{ item.0.group | d(omit) }}"
20    mode: "{{ item.0.mode | d(omit) }}"
21    attributes: "{{ item.0.attributes | d(omit) }}"
22    create: "{{ item.0.create | d(omit) }}"
23    # backup: "{{ cl_backup }}"
24  loop: "{{ cl_files.values() | list | subelements('ini', {'skip_missing': True}) }}"
25  loop_control:
26    label: "{{ item.0.path }} {{ item.1.section }} {{ item.1.option | d('UNDEFINED') }}"
27
28- name: Debug
29  when: cl_debug | bool
30  block:
31
32    - name: "Files-inifile: Debug cl_results_ini cl_debug={{ cl_debug }}"
33      ansible.builtin.debug:
34        var: cl_results_ini
35
36    - name: "Files-inifile: Debug changed ini paths cl_debug={{ cl_debug }}"
37      ansible.builtin.debug:
38        msg: "{{ cl_results_ini.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
39
40# EOF

files-lineinfile.yml

Synopsis: Configure files-lineinfile

Description of the task.

[tasks/files-lineinfile.yml]

 1---
 2  # lines
 3- name: "Files-lineinfile: Debug lines in cl_files.values() cl_debug={{ cl_debug }}"
 4  when: cl_debug | bool
 5  ansible.builtin.debug:
 6    msg: "{{ cl_files.values() | selectattr('lines', 'defined') | list }}"
 7
 8- name: "Files-lineinfile: Lineinfile lines."
 9  register: cl_results_lines
10  notify: "{{ item.0.handlers | d(omit) }}"
11  ansible.builtin.lineinfile:
12    path: "{{ item.0.path }}"
13    regexp: "{{ item.1.regexp | d(omit) }}"
14    line: "{{ item.1.line | d(omit) }}"
15    backrefs: "{{ item.1.backrefs | d(omit) }}"
16    state: "{{ item.1.state | d(omit) }}"
17    firstmatch: "{{ item.1.firstmatch | d(omit) }}"
18    insertafter: "{{ item.1.insertafter | d(omit) }}"
19    insertbefore: "{{ item.1.insertbefore | d(omit) }}"
20    owner: "{{ item.0.owner | d(omit) }}"
21    group: "{{ item.0.group | d(omit) }}"
22    mode: "{{ item.0.mode | d(omit) }}"
23    attributes: "{{ item.0.attributes | d(omit) }}"
24    others: "{{ item.0.others | d(omit) }}"
25    create: "{{ item.0.create | d(omit) }}"
26    validate: "{{ item.0.validate | d(omit) }}"
27    # backup: "{{ cl_backup }}"
28  loop: "{{ cl_files.values() | list | subelements('lines', skip_missing=true) }}"
29  loop_control:
30    label: "{{ item.0.path }} {{ item.1.line | d('UNDEFINED') }}"
31
32- name: Debug
33  when: cl_debug | bool
34  block:
35
36    - name: "Files-lineinfile: Debug cl_results_lines cl_debug={{ cl_debug }}"
37      ansible.builtin.debug:
38        var: cl_results_lines
39
40    - name: "Files-lineinfile: Debug changed lines paths cl_debug={{ cl_debug }}"
41      ansible.builtin.debug:
42        msg: "{{ cl_results_lines.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
43
44  # dict
45- name: "Files-lineinfile: Debug dict in cl_files.values() cl_debug={{ cl_debug }}"
46  when: cl_debug | bool
47  ansible.builtin.debug:
48    msg: "{{ cl_files.values() | selectattr('dict', 'defined') | list }}"
49
50- name: "Files-lineinfile: Lineinfile dict."
51  register: cl_results_dict
52  notify: "{{ item.0.handlers | d(omit) }}"
53  ansible.builtin.lineinfile:
54    path: "{{ item.0.path }}"
55    regexp: ^\s*[#;]*\s*{{ item.1.key }}\s*{{ item.0.assignment|d("=")|trim }}\s*(.*)$
56    line: "{{ item.1.key }}{{ item.0.assignment | d('=') }}{{ item.1.value }}"
57    backrefs: "{{ item.1.backrefs | d(omit) }}"
58    state: "{{ item.1.state | d(omit) }}"
59    firstmatch: "{{ item.1.firstmatch | d(omit) }}"
60    insertafter: "{{ item.1.insertafter | d(omit) }}"
61    insertbefore: "{{ item.1.insertbefore | d(omit) }}"
62    owner: "{{ item.0.owner | d(omit) }}"
63    group: "{{ item.0.group | d(omit) }}"
64    mode: "{{ item.0.mode | d(omit) }}"
65    attributes: "{{ item.0.attributes | d(omit) }}"
66    others: "{{ item.0.others | d(omit) }}"
67    create: "{{ item.0.create | d(omit) }}"
68    validate: "{{ item.0.validate | d(omit) }}"
69    # backup: "{{ cl_backup }}"
70  loop: "{{ cl_files.values() | list | subelements('dict', skip_missing=true) }}"
71  loop_control:
72    label: "{{ item.0.path }} {{ item.1.key }}"
73
74- name: Debug
75  when: cl_debug | bool
76  block:
77
78    - name: "Files-lineinfile: Debug cl_results_dict cl_debug={{ cl_debug }}"
79      ansible.builtin.debug:
80        var: cl_results_dict
81
82    - name: "Files-lineinfile: Debug changed dict paths cl_debug={{ cl_debug }}"
83      ansible.builtin.debug:
84        msg: "{{ cl_results_dict.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
85
86# EOF

files-markers.yml

Synopsis: Configure files-markers

Description of the task.

[tasks/files-markers.yml]

 1---
 2- name: "Files-markers: Debug markers in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('markers', 'defined') | list }}"
 6
 7- name: "Files-markers: Mark blocks."
 8  ansible.builtin.include_tasks: fn/mark-block.yml
 9  loop: "{{ cl_files.values() | list | subelements('markers', skip_missing=true) }}"
10  loop_control:
11    label: "{{ item.0.path }}"
12
13# EOF

mark-block.yml

Synopsis: Configure mark-block

Description of the task.

[tasks/fn/mark-block.yml]

 1---
 2- name: "Mark-block: Check begin marker {{ item.1.marker }}"
 3  register: checkmarker
 4  ignore_errors: true
 5  changed_when: false
 6  ansible.builtin.command:
 7    cmd: >
 8      grep -q '# BEGIN ANSIBLE MANAGED BLOCK {{ item.1.marker }}' {{ item.0.path }}
 9
10- name: Create markers.
11  when:
12    - not ansible_check_mode
13    - checkmarker.rc != 0
14  block:
15
16    - name: "Mark-block: Create begin marker {{ item.1.marker }}"
17      ansible.builtin.replace:
18        path: "{{ item.0.path }}"
19        regexp: "{{ item.1.regex1 }}"
20        replace: |-
21          {{ '#' }} BEGIN ANSIBLE MANAGED BLOCK {{ item.1.marker }}
22          {{ item.1.replace1 }}
23
24    - name: "Mark-block: Create end marker {{ item.1.marker }}"
25      ansible.builtin.replace:
26        path: "{{ item.0.path }}"
27        regexp: ({{ item.1.regex1 }}[\s\S]*?){{ item.1.regex2 }}
28        replace: |-
29          \g<1>
30          {{ item.1.replace2 }}
31          {{ '#' }} END ANSIBLE MANAGED BLOCK {{ item.1.marker }}
32
33# EOF

files-patch.yml

Synopsis: Configure files-patch

Description of the task.

[tasks/files-patch.yml]

 1---
 2- name: "Files-patch: Debug patch in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('patch', 'defined') | list }}"
 6
 7- name: "Files-patch: Patch."
 8  register: cl_results_patch
 9  notify: "{{ item.handlers | d(omit) }}"
10  ansible.posix.patch:
11    dest: "{{ item.path }}"
12    src: "{{ item.patch.src }}"
13    basedir: "{{ item.patch.basedir | d(omit) }}"
14    binary: "{{ item.patch.binary | d(omit) }}"
15    ignore_whitespace: "{{ item.patch.ignore_whitespace | d(omit) }}"
16    remote_src: "{{ item.patch.remote_src | d(omit) }}"
17    state: "{{ item.patch.state | d(omit) }}"
18    strip: "{{ item.patch.strip | d(omit) }}"
19    # backup: "{{ cl_backup }}"
20  loop: "{{ cl_files.values() | selectattr('patch', 'defined') | list }}"
21  loop_control:
22    label: "{{ item.path }}"
23
24- name: Debug
25  when: cl_debug | bool
26  block:
27
28    - name: "Files-patch: Debug cl_results_patch cl_debug={{ cl_debug }}"
29      ansible.builtin.debug:
30        var: cl_results_patch
31
32    - name: "Files-patch: Debug changed patch patch cl_debug={{ cl_debug }}"
33      ansible.builtin.debug:
34        msg: "{{ cl_results_patch | d([]) | json_query('[?changed].invocation.module_args.path') }}"
35
36# EOF

files-sysrc.yml

Synopsis: Configure files-sysrc

Description of the task.

[tasks/files-sysrc.yml]

 1---
 2- name: "Files-sysrc: Debug sysrc in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('sysrc', 'defined') | list }}"
 6
 7- name: "Files-sysrc: rc.conf"
 8  register: cl_results_sysrc
 9  notify: "{{ item.0.handlers | d(omit) }}"
10  community.general.sysrc:
11    path: "{{ item.0.path }}"
12    jail: "{{ item.0.jail | d(omit) }}"
13    delim: "{{ item.0.delim | d(omit) }}"
14    name: "{{ item.1.key }}"
15    value: "{{ item.1.value | d(omit) }}"
16    state: "{{ item.1.state | d(omit) }}"
17    # backup: "{{ cl_backup }}"
18  loop: "{{ cl_files.values() | list | subelements('sysrc', {'skip_missing': true}) }}"
19  loop_control:
20    label: "{{ item.0.path }} {{ item.1.key }}"
21
22- name: Debug
23  when: cl_debug | bool
24  block:
25
26    - name: "Files-sysrc: Debug cl_results_sysrc cl_debug={{ cl_debug }}"
27      ansible.builtin.debug:
28        var: cl_results_sysrc
29
30    - name: "Files-sysrc: Debug changed sysrc paths cl_debug={{ cl_debug }}"
31      ansible.builtin.debug:
32        msg: "{{ cl_results_sysrc.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
33
34# EOF

files-template.yml

Synopsis: Configure files-template

Description of the task.

[tasks/files-template.yml]

 1---
 2- name: "Files-template: Debug template in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('template', 'defined') | list }}"
 6
 7- name: "Files-template: Delete template in cl_files.values()"
 8  when: cl_template_delete | bool
 9  ansible.builtin.file:
10    state: absent
11    path: "{{ item.path }}"
12  loop: "{{ cl_files.values() | selectattr('template', 'defined') | list }}"
13  loop_control:
14    label: "{{ item.path }}"
15
16- name: "Files-template: Template."
17  register: cl_results_template
18  notify: "{{ item.handlers | d(omit) }}"
19  ansible.builtin.template:
20    dest: "{{ item.path }}"
21    src: "{{ item.template.path }}"
22    follow: "{{ item.template.follow | d(omit) }}"
23    force: "{{ item.template.force | d(omit) }}"
24    block_start_string: "{{ item.template.block_start_string | d(omit) }}"
25    block_end_string: "{{ item.template.block_end_string | d(omit) }}"
26    lstrip_blocks: "{{ item.template.lstrip_blocks | d(omit) }}"
27    newline_sequence: "{{ item.template.newline_sequence | d(omit) }}"
28    output_encoding: "{{ item.template.output_encoding | d(omit) }}"
29    trim_blocks: "{{ item.template.trim_blocks | d(omit) }}"
30    variable_end_string: "{{ item.template.variable_end_string | d(omit) }}"
31    variable_start_string: "{{ item.template.variable_start_string | d(omit) }}"
32    owner: "{{ item.owner | d(omit) }}"
33    group: "{{ item.group | d(omit) }}"
34    mode: "{{ item.mode | d(omit) }}"
35    attributes: "{{ item.attributes | d(omit) }}"
36    validate: "{{ item.validate | d(omit) }}"
37    # backup: "{{ cl_backup }}"
38  loop: "{{ cl_files.values() | selectattr('template', 'defined') | list }}"
39  loop_control:
40    label: "{{ item.path }}"
41
42- name: Debug
43  when: cl_debug | bool
44  block:
45
46    - name: "Files-template: Debug cl_results_template cl_debug={{ cl_debug }}"
47      ansible.builtin.debug:
48        var: cl_results_template
49
50    - name: "Files-template: Debug changed template path cl_debug={{ cl_debug }}"
51      ansible.builtin.debug:
52        msg: "{{ cl_results_template | d([]) | json_query('[?changed].invocation.module_args.path') }}"
53
54# EOF

files-ucl.yml

Synopsis: Configure files-ucl

Description of the task.

[tasks/files-ucl.yml]

 1---
 2- name: "Files-ucl: Debug ucl in cl_files.values() cl_debug={{ cl_debug }}"
 3  when: cl_debug|bool
 4  ansible.builtin.debug:
 5    msg: "{{ cl_files.values() | selectattr('ucl', 'defined') | list }}"
 6
 7- name: "Files-ucl: UCL files cl_files.values()"
 8  register: cl_results_ucl
 9  notify: "{{ item.0.handlers | d(omit) }}"
10  vbotka.freebsd.ucl:
11    path: "{{ item.0.path }}"
12    chdir: "{{ item.1.chdir | d(omit) }}"
13    upath: "{{ item.1.upath | d(omit) }}"
14    ipath: "{{ item.1.ipath | d(omit) }}"
15    icontent: "{{ item.1.icontent | d(omit) }}"
16    value: "{{ item.1.value | d(omit) }}"
17    vtype: "{{ item.1.vtype | d(omit) }}"
18    merge: "{{ item.1.merge | d(omit) }}"
19    state: "{{ item.1.state | d(omit) }}"
20    delimiter: "{{ item.1.delimiter | d(omit) }}"
21    lang: "{{ item.1.lang | d(omit) }}"
22    owner: "{{ item.0.owner | d(omit) }}"
23    group: "{{ item.0.group | d(omit) }}"
24    mode: "{{ item.0.mode | d(omit) }}"
25    attributes: "{{ item.0.attributes | d(omit) }}"
26    create: "{{ item.0.create | d(omit) }}"
27    validate: "{{ item.0.validate | d(omit) }}"
28    # backup: "{{ cl_backup }}"
29  loop: "{{ cl_files.values() | list | subelements('ucl', skip_missing=true) }}"
30  loop_control:
31    label: "{{ item.0.path }} {{ item.1.upath | d('UNDEFINED') }}"
32
33- name: Debug
34  when: cl_debug | bool
35  block:
36
37    - name: "Files-ucl: Debug cl_results_ucl cl_debug={{ cl_debug }}"
38      ansible.builtin.debug:
39        var: cl_results_ucl
40
41    - name: "Files-ucl: Debug changed ucl paths cl_debug={{ cl_debug }}"
42      ansible.builtin.debug:
43        msg: "{{ cl_results_ucl.results | d([]) | json_query('[?changed].invocation.module_args.path') }}"
44
45# EOF

services.yml

Synopsis: Configure services

Description of the task.

[tasks/services.yml]

 1---
 2- name: "Services: Debug cl_debug={{ cl_debug }}"
 3  when: cl_debug | bool
 4  vars:
 5    msg: |-
 6      cl_rcconfd: "{{ cl_rcconfd }}"
 7      cl_services:
 8        {{ cl_services | to_nice_yaml(indent=2) | indent(2) }}
 9  ansible.builtin.debug:
10    msg: "{{ '{}'.format(msg) }}"
11
12- name: FreeBSD services.
13  when: ansible_facts.os_family == 'FreeBSD'
14  vars:
15    _service: "{{ item.value.name }}"
16    _rcconfd_path: "{{ cl_rcconfd_path[_service] | d(cl_rcconfd_path.default) }}"
17    _path: "{{ cl_rcconfd | bool | ternary(_rcconfd_path, '/etc/rc.conf') }}"
18    _name: "{{ cl_rcconf_rcvar[_service] | d(cl_rcconf_rcvar.default) }}"
19  block:
20
21    - name: "Services: Enable FreeBSD services."
22      when: item.value.enabled | d(true) | bool
23      community.general.sysrc:
24        path: "{{ _path }}"
25        name: "{{ _name }}"
26        value: "YES"
27      loop: "{{ cl_services | dict2items }}"
28      loop_control:
29        label: "{{ item.key }}"
30
31    - name: "Services: Disable FreeBSD services."
32      when: not item.value.enabled | d(true) | bool
33      community.general.sysrc:
34        path: "{{ _path }}"
35        name: "{{ _name }}"
36        value: "NO"
37      loop: "{{ cl_services | dict2items }}"
38      loop_control:
39        label: "{{ item.key }}"
40
41    - name: "Services: Manage FreeBSD service."
42      vbotka.freebsd.service:
43        script: "{{ item.value.name }}"
44        command: "{{ item.value.state | d('start') }}"
45      loop: "{{ cl_services | dict2items }}"
46      loop_control:
47        label: "{{ item.key }}"
48
49- name: Linux services.
50  when: ansible_facts.os_family in cl_supported_linux_family
51  block:
52
53    - name: "Services: Manage services."
54      ansible.builtin.service:
55        name: "{{ item.value.name }}"
56        state: "{{ item.value.state | d('started') }}"
57        enabled: "{{ item.value.enabled | d(true) }}"
58      loop: "{{ cl_services | dict2items }}"
59      loop_control:
60        label: "{{ item.key }}"
61
62# EOF