Tasks
main.yml
Synopsis: Main task.
Import tasks if enabled.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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_orderand fit the order of the options to your needs.
files-blockinfile.yml
Synopsis: Configure files-blockinfile
Description of the task.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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