Tasks

main.yml

Synopsis: Main task.

Import tasks if enabled.

[tasks/main.yml]

  1---
  2# linux_postinstall tasks
  3
  4- name: Import vars.yml
  5  ansible.builtin.import_tasks: vars.yml
  6  tags: [lp_vars, always]
  7
  8- name: Import debug.yml
  9  ansible.builtin.import_tasks: debug.yml
 10  when: lp_debug|bool
 11  tags: [lp_debug, always]
 12
 13- name: Import swap.yml
 14  ansible.builtin.import_tasks: swap.yml
 15  when: ((ansible_os_family == 'RedHat') or
 16        (ansible_os_family == 'Debian')) and lp_swap|bool
 17  tags: lp_swap
 18
 19- name: Import modules.yml
 20  ansible.builtin.import_tasks: modules.yml
 21  when: (ansible_os_family == 'RedHat') or
 22        (ansible_os_family == 'Debian')
 23  tags: lp_modules
 24
 25- name: Import udev.yml
 26  ansible.builtin.import_tasks: udev.yml
 27  when: ((ansible_os_family == 'RedHat') or
 28        (ansible_os_family == 'Debian')) and lp_udev|bool
 29  tags: lp_udev
 30
 31- name: Import fstab.yml
 32  ansible.builtin.import_tasks: fstab.yml
 33  when: ((ansible_os_family == 'RedHat') or
 34        (ansible_os_family == 'Debian'))
 35  tags: lp_fstab
 36
 37- name: Import networkmanager.yml
 38  ansible.builtin.import_tasks: networkmanager.yml
 39  when: (ansible_os_family == 'Debian') and lp_nm|bool
 40  tags: lp_nm
 41
 42- name: Import netplan.yml
 43  ansible.builtin.import_tasks: netplan.yml
 44  when: (ansible_os_family == 'Debian') and lp_netplan|bool
 45  tags: lp_netplan
 46
 47- name: Import systemd.yml
 48  ansible.builtin.import_tasks: systemd.yml
 49  when: (ansible_os_family == 'Debian') and lp_systemd|bool
 50  tags: lp_systemd
 51
 52- name: Import networkd.yml
 53  ansible.builtin.import_tasks: networkd.yml
 54  when: (ansible_os_family == 'Debian') and lp_networkd|bool
 55  tags: lp_networkd
 56
 57- name: Import timezone.yml
 58  ansible.builtin.import_tasks: timezone.yml
 59  when: ((ansible_os_family == 'RedHat') or
 60        (ansible_os_family == 'Debian')) and lp_timezone|bool
 61  tags: lp_timezone
 62
 63- name: Import timesyncd.yml
 64  ansible.builtin.import_tasks: timesyncd.yml
 65  when: (ansible_os_family == 'Debian') and lp_timesyncd|bool
 66  tags: lp_timesyncd
 67
 68- name: Import chrony.yml
 69  ansible.builtin.import_tasks: chrony.yml
 70  when: ((ansible_os_family == 'RedHat') or
 71        (ansible_os_family == 'Debian')) and lp_chrony|bool
 72  tags: lp_chrony
 73
 74- name: Import apt.yml
 75  ansible.builtin.import_tasks: apt.yml
 76  when: ansible_os_family == 'Debian' and lp_apt|bool
 77  tags: lp_apt
 78
 79- name: Import snap.yml
 80  ansible.builtin.import_tasks: snap.yml
 81  when: ansible_os_family == 'Debian' and lp_snap|bool
 82  tags: lp_snap
 83
 84- name: Import repos.yml
 85  ansible.builtin.import_tasks: repos.yml
 86  when: ansible_os_family == 'Debian'
 87  tags: lp_repos
 88
 89- name: Import packages.yml
 90  ansible.builtin.import_tasks: packages.yml
 91  when: (ansible_os_family == 'RedHat') or
 92        (ansible_os_family == 'Debian')
 93  tags: lp_packages
 94
 95- name: Import upgrades.yml
 96  ansible.builtin.import_tasks: auto_upgrades.yml
 97  when: (ansible_os_family == 'Debian') and lp_auto_upgrades|bool
 98  tags: lp_auto_upgrades
 99
100- name: Import sysctl.yml
101  ansible.builtin.import_tasks: sysctl.yml
102  when: (ansible_os_family == 'RedHat') or
103        (ansible_os_family == 'Debian')
104  tags: lp_sysctl
105
106- name: Import zfs.yml
107  ansible.builtin.import_tasks: zfs.yml
108  when: (ansible_os_family == 'Debian') and lp_zfs|bool
109  tags: lp_zfs
110
111- name: Import hostname.yml
112  ansible.builtin.import_tasks: hostname.yml
113  when: (ansible_os_family == 'RedHat') or
114        (ansible_os_family == 'Debian')
115  tags: lp_hostname
116
117- name: Import hosts.yml
118  ansible.builtin.import_tasks: hosts.yml
119  when: (ansible_os_family == 'RedHat') or
120        (ansible_os_family == 'Debian')
121  tags: lp_hosts
122
123- name: Import iptables.yml
124  ansible.builtin.import_tasks: iptables.yml
125  when: (ansible_os_family == 'Debian') and lp_iptables|bool
126  tags: lp_iptables
127
128- name: Import grub.yml
129  ansible.builtin.import_tasks: grub.yml
130  when: (ansible_os_family == 'Debian') and lp_grub|bool
131  tags: lp_grub
132  # https://unix.stackexchange.com/questions/152222/
133  # equivalent-of-update-grub-for-rhel-fedora-centos-systems
134
135- name: Import groups.yml
136  ansible.builtin.import_tasks: groups.yml
137  when: (ansible_os_family == 'RedHat') or
138        (ansible_os_family == 'Debian')
139  tags: lp_groups
140
141- name: Import users.yml
142  ansible.builtin.import_tasks: users.yml
143  when: (ansible_os_family == 'RedHat') or
144        (ansible_os_family == 'Debian')
145  tags: lp_users
146
147- name: Import gpg.yml
148  ansible.builtin.import_tasks: gpg.yml
149  when: (ansible_os_family == 'Debian') and lp_gpg|bool
150  tags: lp_gpg
151
152- name: Import passwords.yml
153  ansible.builtin.import_tasks: passwords.yml
154  when: (ansible_os_family == 'RedHat') or
155        (ansible_os_family == 'Debian') and lp_passwords|bool
156  tags: lp_passwords
157
158- name: Import sudoers.yml
159  ansible.builtin.import_tasks: sudoers.yml
160  when: (ansible_os_family == 'RedHat') or
161        (ansible_os_family == 'Debian')
162  tags: lp_sudoers
163
164- name: Import keys.yml
165  ansible.builtin.import_tasks: authorized_keys.yml
166  when: (ansible_os_family == 'RedHat') or
167        (ansible_os_family == 'Debian')
168  tags: lp_authorized_keys
169
170- name: Import aliases.yml
171  ansible.builtin.import_tasks: aliases.yml
172  when: ((ansible_os_family == 'RedHat') or
173        (ansible_os_family == 'Debian')) and lp_aliases|bool
174  tags: lp_aliases
175
176- name: Import utils.yml
177  ansible.builtin.import_tasks: pm_utils.yml
178  when: (ansible_os_family == 'Debian') and lp_pm|bool
179  tags: lp_pm
180
181- name: Import ssh.yml
182  ansible.builtin.import_tasks: ssh.yml
183  when: ((ansible_os_family == 'RedHat') or
184        (ansible_os_family == 'Debian')) and lp_ssh|bool
185  tags: lp_ssh
186
187- name: Import sshd.yml
188  ansible.builtin.import_tasks: sshd.yml
189  when: ((ansible_os_family == 'RedHat') or
190        (ansible_os_family == 'Debian')) and lp_sshd|bool
191  tags: lp_sshd
192
193- name: Import bluetooth.yml
194  ansible.builtin.import_tasks: bluetooth.yml
195  when: (ansible_os_family == 'Debian') and lp_bluetooth|bool
196  tags: lp_bluetooth
197
198- name: Import xorg.yml
199  ansible.builtin.import_tasks: xorg.yml
200  when: (ansible_os_family == 'Debian') and lp_xorg|bool
201  tags: lp_xorg
202
203- name: Import cron.yml
204  ansible.builtin.import_tasks: cron.yml
205  when: (ansible_os_family == 'RedHat') or
206        (ansible_os_family == 'Debian')
207  tags: lp_cron
208
209- name: Import modemmanager.yml
210  ansible.builtin.import_tasks: modemmanager.yml
211  when: (ansible_os_family == 'Debian') and lp_modemmanager|bool
212  tags: lp_modemmanager
213
214- name: Import gpsd.yml
215  ansible.builtin.import_tasks: gpsd.yml
216  when: (ansible_os_family == 'Debian') and lp_gpsd|bool
217  tags: lp_gpsd
218
219- name: Import postfix.yml
220  ansible.builtin.import_tasks: postfix.yml
221  when: ((ansible_os_family == 'RedHat') or
222        (ansible_os_family == 'Debian')) and lp_postfix|bool
223  tags: lp_postfix
224
225- name: Import smart.yml
226  ansible.builtin.import_tasks: smart.yml
227  when: (ansible_os_family == 'Debian') and lp_smart|bool
228  tags: lp_smart
229
230- name: Import apparmor.yml
231  ansible.builtin.import_tasks: apparmor.yml
232  when: (ansible_os_family == 'Debian') and lp_apparmor|bool
233  tags: lp_apparmor
234
235- name: Flush handlers
236  ansible.builtin.meta: flush_handlers
237
238- name: Import zeitgeist.yml
239  ansible.builtin.import_tasks: zeitgeist.yml
240  when: (ansible_os_family == 'Debian') and lp_zeitgeist|bool
241  tags: lp_zeitgeist
242
243- name: Import lid.yml
244  ansible.builtin.import_tasks: lid.yml
245  when: (ansible_os_family == 'Debian') and lp_lid|bool
246  tags: lp_lid
247
248- name: Import acpi.yml
249  ansible.builtin.import_tasks: acpi.yml
250  when: (ansible_os_family == 'Debian') and lp_acpi|bool
251  tags: lp_acpi
252
253- name: Import speechd.yml
254  ansible.builtin.import_tasks: speechd.yml
255  when: (ansible_os_family == 'Debian') and lp_speechd|bool
256  tags: lp_speechd
257
258- name: Import nfsd.yml
259  ansible.builtin.import_tasks: nfsd.yml
260  when: (ansible_os_family == 'Debian') and lp_nfsd|bool
261  tags: lp_nfsd
262
263- name: Flush handlers
264  meta: flush_handlers
265
266- name: Import latex.yml
267  ansible.builtin.import_tasks: latex.yml
268  when: (ansible_os_family == 'Debian') and lp_latex|bool
269  tags: lp_latex
270
271- name: Import kvm.yml
272  ansible.builtin.import_tasks: kvm.yml
273  when: (ansible_os_family == 'Debian') and lp_kvm|bool
274  tags: lp_kvm
275
276- name: Import xen.yml
277  ansible.builtin.import_tasks: xen.yml
278  when: (ansible_os_family == 'Debian') and lp_xen|bool
279  tags: lp_xen
280
281- name: Import virtualbox.yml
282  ansible.builtin.import_tasks: virtualbox.yml
283  when: (ansible_os_family == 'Debian') and lp_virtualbox|bool
284  tags: lp_virtualbox
285
286- name: Import wpagui.yml
287  ansible.builtin.import_tasks: wpagui.yml
288  when: (ansible_os_family == 'Debian') and lp_wpagui|bool
289  tags: lp_wpagui
290
291- name: Import wpasupplicant.yml
292  ansible.builtin.import_tasks: wpasupplicant.yml
293  when: ((ansible_os_family == 'RedHat') or
294        (ansible_os_family == 'Debian')) and lp_wpasupplicant|bool
295  tags: lp_wpasupplicant
296
297- name: Import logrotate.yml
298  ansible.builtin.import_tasks: logrotate.yml
299  when: ((ansible_os_family == 'RedHat') or
300        (ansible_os_family == 'Debian')) and lp_logrotate|bool
301  tags: lp_logrotate
302
303- name: Import tlp.yml
304  ansible.builtin.import_tasks: tlp.yml
305  when: (ansible_os_family == 'Debian') and lp_tlp|bool
306  tags: lp_tlp
307
308- name: Import autofs.yml
309  ansible.builtin.import_tasks: autofs.yml
310  when: (ansible_os_family == 'Debian') and lp_autofs|bool
311  tags: lp_autofs
312
313- name: Import libvirt.yml
314  ansible.builtin.import_tasks: libvirt.yml
315  when: (ansible_os_family == 'Debian') and lp_libvirt|bool
316  tags: lp_libvirt
317
318- name: Import ufw.yml
319  ansible.builtin.import_tasks: ufw.yml
320  when: (ansible_os_family == 'Debian') and lp_ufw|bool
321  tags: lp_ufw
322
323- name: Import debsums.yml
324  ansible.builtin.import_tasks: debsums.yml
325  when: (ansible_os_family == 'Debian') and lp_debsums|bool
326  tags: lp_debsums
327
328- name: Flush handlers
329  meta: flush_handlers
330
331- name: Import rc_local.yml
332  ansible.builtin.import_tasks: rc_local.yml
333  when: (ansible_os_family == 'Debian') and lp_rc_local|bool
334  tags: lp_rc_local
335
336- name: Import service.yml
337  ansible.builtin.import_tasks: service.yml
338  tags: lp_service
339
340- name: Import resolvconf.yml
341  ansible.builtin.import_tasks: resolvconf.yml
342  when: (ansible_os_family == 'Debian') and lp_resolvconf|bool
343  tags: lp_resolvconf
344
345- name: Import dnsmasq.yml
346  ansible.builtin.import_tasks: dnsmasq.yml
347  when: (ansible_os_family == 'Debian') and lp_dnsmasq|bool
348  tags: lp_dnsmasq
349
350- name: Import reboot.yml
351  ansible.builtin.import_tasks: reboot.yml
352  when: ((ansible_os_family == 'RedHat') or
353         (ansible_os_family == 'Debian')) and lp_reboot|bool
354  tags: lp_reboot
355
356# EOF
357...

acpi.yml

Synopsis: Configure acpi.

Description of the task.

[tasks/acpi.yml]

 1---
 2# linux_postinstall acpi
 3
 4- name: "acpi: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_acpi_install: {{ lp_acpi_install }}
 9      lp_acpi_enable: {{ lp_acpi_enable }}
10      lp_acpi_service: {{ lp_acpi_service }}
11      lp_acpi_dir: {{ lp_acpi_dir }}
12      lp_acpi_owner: {{ lp_acpi_owner }}
13      lp_acpi_group: {{ lp_acpi_group }}
14      lp_acpi_event_mode: {{ lp_acpi_event_mode }}
15      lp_acpi_action_mode: {{ lp_acpi_action_mode }}
16      lp_acpi_packages: {{ lp_acpi_packages }}
17
18      lp_acpi_events:
19        {{ lp_acpi_events|to_nice_yaml(indent=2)|indent(2) }}
20      lp_acpi_actions:
21        {{ lp_acpi_actions|to_nice_yaml(indent=2)|indent(2) }}
22  ansible.builtin.debug:
23    msg: "{{ '{}'.format(msg) }}"
24  when: lp_acpi_debug|bool
25  tags: lp_acpi_debug
26
27- name: "acpi: Install packages"
28  ansible.builtin.import_role:
29    name: vbotka.linux_lib
30    tasks_from: install_package.yml
31  when: lp_acpi_install|bool
32  vars:
33    ll_ipkg_list: "{{ lp_acpi_packages }}"
34    ll_ipkg_state: "{{ lp_package_state }}"
35    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
36    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
37    ll_debug: "{{ lp_acpi_debug|bool }}"
38  tags: lp_acpi_packages
39
40- name: "acpi: Configure {{ lp_acpi_dir }}/events"
41  ansible.builtin.template:
42    src: "{{ item.value.template }}"
43    dest: "{{ lp_acpi_dir }}/events/{{ item.value.file }}"
44    owner: "{{ lp_acpi_owner }}"
45    group: "{{ lp_acpi_group }}"
46    mode: "{{ lp_acpi_event_mode }}"
47    backup: "{{ lp_backup_conf }}"
48  loop: "{{ lp_acpi_events|dict2items }}"
49  loop_control:
50    label: "{{ item.key }}"
51  notify: reload acpid
52  tags: lp_acpi_events
53
54- name: "acpi: Create actions in {{ lp_acpi_dir }}"
55  ansible.builtin.template:
56    src: "{{ item.value.template }}"
57    dest: "{{ lp_acpi_dir }}/{{ item.value.file }}"
58    owner: "{{ lp_acpi_owner }}"
59    group: "{{ lp_acpi_group }}"
60    mode: "{{ lp_acpi_action_mode }}"
61    backup: "{{ lp_backup_conf }}"
62  loop: "{{ lp_acpi_actions|dict2items }}"
63  loop_control:
64    label: "{{ item.value.file }}"
65  notify: reload acpid
66  tags: lp_acpi_actions
67
68- name: "acpi: Service {{ state }} and {{ enable }}"
69  ansible.builtin.service:
70    name: "{{ lp_acpi_service }}"
71    state: "{{ state }}"
72    enabled: "{{ enabled }}"
73  register: result
74  vars:
75    enabled: "{{ lp_acpi_enable|bool|d(false) }}"
76    state: "{{ lp_acpi_state|d(default_state) }}"
77    default_state: "{{ enabled|ternary('started', 'stopped') }}"
78    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
79  tags: lp_acpi_service
80
81# EOF
82...

aliases.yml

Synopsis: Configure aliases.

Description of the task.

[tasks/aliases.yml]

 1---
 2# linux_postinstall aliases
 3
 4- name: "aliases: Configure /etc/aliases"
 5  ansible.builtin.template:
 6    src: aliases.j2
 7    dest: /etc/aliases
 8    owner: root
 9    group: root
10    mode: "0644"
11    backup: "{{ lp_backup_conf }}"
12  notify: newaliases
13
14# EOF
15...

See also

apt.yml

Synopsis: Configure apt.

Description of the task.

[tasks/apt.yml]

 1---
 2# linux_postinstall apt
 3
 4- name: "apt: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_apt_conf:
 9        {{ lp_apt_conf|to_nice_yaml(indent=2)|indent(2) }}
10      lp_backup_conf: {{ lp_backup_conf }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_apt_debug|bool
14  tags: lp_apt_debug
15
16- name: "apt: Configure /etc/apt/apt.conf.d"
17  ansible.builtin.template:
18    src: "{{ item.template|default('apt-confd.j2') }}"
19    dest: "/etc/apt/apt.conf.d/{{ item.file }}"
20    owner: "{{ item.owner|default('root') }}"
21    group: "{{ item.group|default('root') }}"
22    mode: "{{ item.mode|default('0644') }}"
23    backup: "{{ lp_backup_conf }}"
24  loop: "{{ lp_apt_conf }}"
25  loop_control:
26    label: "{{ item.file }}"
27  notify: "{{ item.notify|default(omit) }}"
28  tags: lp_apt_conf
29
30# EOF
31...

See also

apparmor.yml

Synopsis: Configure apparmor.

Description of the task.

[tasks/apparmor.yml]

  1---
  2# linux_postinstall apparmor
  3
  4- name: "apparmor: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_apparmor_install: {{ lp_apparmor_install }}
  9      lp_apparmor_packages:
 10        {{ lp_apparmor_packages|to_nice_yaml(indent=2)|indent(2) }}
 11      lp_backup_conf: {{ lp_backup_conf }}
 12  ansible.builtin.debug:
 13    msg: "{{ '{}'.format(msg) }}"
 14  when: lp_apparmor_debug|bool
 15  tags: lp_apparmor_debug
 16
 17- name: "apparmor: Install packages"
 18  ansible.builtin.import_role:
 19    name: vbotka.linux_lib
 20    tasks_from: install_package.yml
 21  when: lp_apparmor_install|bool
 22  vars:
 23    ll_ipkg_list: "{{ lp_apparmor_packages }}"
 24    ll_ipkg_state: "{{ lp_package_state }}"
 25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 27    ll_debug: "{{ lp_apparmor_debug|bool }}"
 28  tags: lp_apparmor_packages
 29
 30- name: "apparmor: Create list of profiles"
 31  block:
 32
 33    - name: "apparmor: List profiles"
 34      ansible.builtin.shell:
 35        cmd: >
 36          aa-status --json | jq .profiles | jq to_entries
 37      register: result
 38      changed_when: false
 39
 40    - name: "apparmor: Debug: List of profiles"
 41      ansible.builtin.debug:
 42        var: result
 43      when: lp_apparmor_debug|bool
 44
 45    - name: "apparmor: Instantiate profiles"
 46      ansible.builtin.set_fact:
 47        lp_apparmor_profiles_enforce: "{{ lp_apparmor_profiles_enforce }}"
 48        lp_apparmor_profiles_complain: "{{ lp_apparmor_profiles_complain }}"
 49
 50    - name: "apparmor: Debug profiles"
 51      ansible.builtin.debug:
 52        msg: |
 53          lp_apparmor_profiles_enforce:
 54            {{ lp_apparmor_profiles_enforce|to_nice_yaml(indent=2)|indent(2) }}
 55          lp_apparmor_profiles_complain:
 56            {{ lp_apparmor_profiles_complain|to_nice_yaml(indent=2)|indent(2) }}
 57      when: lp_apparmor_debug|bool
 58
 59  tags: lp_apparmor_profiles
 60
 61- name: "apparmor: Disable profiles"
 62  ansible.builtin.command:
 63    cmd: >
 64      aa-disable {{ item }}
 65  loop: "{{ lp_apparmor_disable }}"
 66  when: item in lp_apparmor_profiles_enforce or
 67        item in lp_apparmor_profiles_complain
 68  tags: lp_apparmor_disable
 69
 70- name: "apparmor: Enforce profiles"
 71  ansible.builtin.command:
 72    cmd: >
 73      aa-enforce {{ item }}
 74  loop: "{{ lp_apparmor_enforce }}"
 75  when: item not in lp_apparmor_profiles_enforce
 76  tags: lp_apparmor_enforce
 77
 78- name: "apparmor: Complain profiles"
 79  ansible.builtin.command:
 80    cmd: >
 81      aa-complain {{ item }}
 82  loop: "{{ lp_apparmor_complain }}"
 83  when: item not in lp_apparmor_profiles_complain
 84  tags: lp_apparmor_enforce
 85
 86- name: "apparmor: Service {{ state }} and {{ enable }}"
 87  ansible.builtin.service:
 88    name: "{{ lp_apparmor_service }}"
 89    state: "{{ state }}"
 90    enabled: "{{ enabled }}"
 91  register: result
 92  vars:
 93    enabled: "{{ lp_apparmor_enable|bool|d(false) }}"
 94    state: "{{ lp_apparmor_state|d(default_state) }}"
 95    default_state: "{{ enabled|ternary('started', 'stopped') }}"
 96    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
 97  tags: lp_apparmor_service
 98
 99- name: "apparmor: Debug service"
100  ansible.builtin.debug:
101    var: result
102  when: lp_apparmor_debug|bool
103  tags: lp_apparmor_service
104
105# EOF
106...

authorized_keys.yml

Synopsis: Configure authorized_keys.

Description of the task.

[tasks/authorized_keys.yml]

 1---
 2# linux_postinstall authorized_keys
 3
 4- name: "authorized_key: Configure authorized_keys"
 5  ansible.builtin.authorized_key:
 6    user: "{{ item.user }}"
 7    key: "{{ item.key }}"
 8    manage_dir: true
 9  loop: "{{ lp_authorized_keys }}"
10  loop_control:
11    label: "{{ item.user }} {{ arr.0 }} {{ arr.2 }}"
12  vars:
13    arr: "{{ item.key|split }}"
14
15# EOF
16...

autofs.yml

Synopsis: Configure autofs.

Description of the task.

[tasks/autofs.yml]

  1---
  2# linux_postinstall autofs
  3
  4- name: "autofs: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_autofs_install: {{ lp_autofs_install }}
  9      lp_autofs_enable: {{ lp_autofs_enable }}
 10      lp_autofs_flush_handlers: {{ lp_swap_flush_handlers }}
 11      lp_autofs_rescue_end_host: {{ lp_swap_rescue_end_host }}
 12      lp_autofs_service: {{ lp_autofs_service }}
 13      lp_autofs_conf_file: {{ lp_autofs_conf_file }}
 14      lp_autofs_conf:
 15        {{ lp_autofs_conf|to_nice_yaml(indent=2)|indent(2) }}
 16      lp_autofs_master_conf_file: {{ lp_autofs_master_conf_file }}
 17      lp_autofs_master_conf:
 18        {{ lp_autofs_master_conf|to_nice_yaml(indent=2)|indent(2) }}
 19      lp_autofs_misc_conf_file: {{ lp_autofs_misc_conf_file }}
 20      lp_autofs_misc_conf:
 21        {{ lp_autofs_misc_conf|to_nice_yaml(indent=2)|indent(2) }}
 22      lp_autofs_packages:
 23        {{ lp_autofs_packages|to_nice_yaml(indent=2)|indent(2) }}
 24      lp_backup_conf: {{ lp_backup_conf }}
 25  ansible.builtin.debug:
 26    msg: "{{ '{}'.format(msg) }}"
 27  when: lp_autofs_debug|bool
 28  tags: lp_autofs_debug
 29
 30- name: "autofs: Install packages"
 31  ansible.builtin.import_role:
 32    name: vbotka.linux_lib
 33    tasks_from: install_package.yml
 34  when: lp_autofs_install|bool
 35  vars:
 36    ll_ipkg_list: "{{ lp_autofs_packages }}"
 37    ll_ipkg_state: "{{ lp_package_state }}"
 38    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 39    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 40    ll_debug: "{{ lp_autofs_debug|bool }}"
 41  tags: lp_autofs_packages
 42
 43- name: "autofs: Configure, enable, start, or disable autofs"
 44  block:
 45
 46    - name: "autofs: Configure {{ lp_autofs_conf_file }}"
 47      ansible.builtin.lineinfile:
 48        dest: "{{ lp_autofs_conf_file }}"
 49        regexp: '^\s*{{ item.key }}\s*=\s*(.*)$'
 50        line: "{{ item.key }} = {{ item.value }}"
 51        backup: "{{ lp_backup_conf }}"
 52      loop: "{{ lp_autofs_conf }}"
 53      notify: reload autofs
 54      tags: lp_autofs_conf
 55
 56    - name: "autofs: Configure {{ lp_autofs_master_conf_file }}"
 57      ansible.builtin.lineinfile:
 58        dest: "{{ lp_autofs_master_conf_file }}"
 59        regexp: '^\s*{{ item.key }}\s*(.*)$'
 60        line: "{{ item.key }} {{ item.value }}"
 61        backup: "{{ lp_backup_conf }}"
 62      loop: "{{ lp_autofs_master_conf }}"
 63      notify: reload autofs
 64      tags: lp_autofs_master_conf
 65
 66    - name: "autofs: Configure {{ lp_autofs_misc_conf_file }}"
 67      ansible.builtin.lineinfile:
 68        dest: "{{ lp_autofs_misc_conf_file }}"
 69        regexp: '^\s*{{ item.key }}\s*(.*)$'
 70        line: "{{ item.key }} {{ item.value }}"
 71        backup: "{{ lp_backup_conf }}"
 72      loop: "{{ lp_autofs_misc_conf }}"
 73      notify: reload autofs
 74      tags: lp_autofs_miscr_conf
 75
 76    - name: "autofs: Service {{ state }} and {{ enable }}"
 77      ansible.builtin.service:
 78        name: "{{ lp_autofs_service }}"
 79        state: "{{ state }}"
 80        enabled: "{{ enabled }}"
 81      register: result
 82      vars:
 83        enabled: "{{ lp_autofs_enable|bool }}"
 84        state: "{{ lp_sutofs_state|d(default_state) }}"
 85        default_state: "{{ enabled|ternary('started', 'stopped') }}"
 86        enable: "{{ enabled|ternary('enabled', 'disabled') }}"
 87      tags: lp_autofs_service
 88
 89    - name: "autofs: Debug service"
 90      ansible.builtin.debug:
 91        var: result
 92      when: lp_autofs_debug|bool
 93      tags: lp_autofs_service
 94
 95  rescue:
 96
 97    - name: "autofs: Print errors"
 98      ansible.builtin.debug:
 99        msg: |
100          [ERR] task {{ ansible_failed_task.name }} failed. End host.
101          ansible_failed_task:
102            {{ ansible_failed_task|to_yaml(indent=2)|indent(2) }}
103          ansible_failed_result:
104            {{ ansible_failed_result|to_yaml(indent=2)|indent(2) }}
105
106    - name: "autofs: End host"
107      ansible.builtin.meta: end_host
108      when:
109        - lp_autofs_rescue_end_host|bool
110        - not ansible_check_mode
111
112    - name: "autofs: Clear host errors"
113      ansible.builtin.meta: clear_host_errors
114
115- name: "autofs: Flush handlers"
116  ansible.builtin.meta: flush_handlers
117  when: lp_autofs_flush_handlers|bool
118
119# EOF
120...

See also

auto_upgrades.yml

Synopsis: Configure auto_upgrades.

Description of the task.

[tasks/auto_upgrades.yml]

 1---
 2# linux_postinstall auto_upgrades
 3
 4- name: "auto_upgrades: Configure /etc/apt/apt.conf.d/20auto-upgrades"
 5  ansible.builtin.template:
 6    src: auto-upgrades.j2
 7    dest: /etc/apt/apt.conf.d/20auto-upgrades
 8    owner: root
 9    group: root
10    mode: '0644'
11    backup: "{{ lp_backup_conf }}"
12
13- name: "auto_upgrades: Service {{ state }} and {{ enable }}"
14  ansible.builtin.service:
15    name: "{{ lp_auto_upgrades_service }}"
16    state: "{{ state }}"
17    enabled: "{{ enabled }}"
18  register: result
19  vars:
20    enabled: "{{ lp_auto_upgrades_enable|bool }}"
21    state: "{{ lp_auto_upgrades_state|d(default_state) }}"
22    default_state: "{{ enabled|ternary('started', 'stopped') }}"
23    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
24  tags: lp_auto_upgrades_service
25
26- name: "auto_upgrades: Debug service"
27  ansible.builtin.debug:
28    var: result
29  when: lp_auto_upgrades_debug|bool
30
31# EOF
32...

bluetooth.yml

Synopsis: Configure bluetooth.

Description of the task.

[tasks/bluetooth.yml]

 1---
 2# linux_postinstall bluetooth
 3
 4- name: "bluetooth: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_bluetooth_enable: {{ lp_bluetooth_enable }}
 9      lp_bluetooth_main_conf:
10        {{ lp_bluetooth_main_conf|to_yaml(indent=2)|indent(2) }}
11      lp_bluetooth_ini:
12        {{ lp_bluetooth_ini|to_yaml(indent=2)|indent(2) }}
13      lp_backup_conf: {{ lp_backup_conf }}
14  ansible.builtin.debug:
15    msg: "{{ '{}'.format(msg) }}"
16  when: lp_bluetooth_debug|bool
17  tags: lp_bluetooth_debug
18
19- name: "bluetooth: Configure /etc/bluetooth/main.conf"
20  ansible.builtin.lineinfile:
21    dest: /etc/bluetooth/main.conf
22    regexp: '^\s*{{ item.key }}\s*=\s*(.*)$'
23    insertbefore: '^[\s#]*{{ item.key }}(.*)$'
24    line: "{{ item.key }} = {{ item.value }}"
25    backup: "{{ lp_backup_conf }}"
26  loop: "{{ lp_bluetooth_main_conf }}"
27  loop_control:
28    label: "{{ item.key }} {{ item.value }}"
29  notify: restart bluetooth
30  tags: lp_bluetooth_conf
31
32- name: "bluetooth: Configure bluetooth"
33  community.general.ini_file:
34    path: "{{ item.0.path }}"
35    mode: "{{ item.0.mode }}"
36    section: "{{ item.1.section }}"
37    option: "{{ item.1.option|default(omit) }}"
38    value: "{{ item.1.value }}"
39    backup: "{{ lp_backup_conf }}"
40  loop: "{{ lp_bluetooth_ini|subelements('conf') }}"
41  loop_control:
42    label: "{{ item.1.option }}: {{ item.1.value }}"
43  notify: restart bluetooth
44  tags: lp_bluetooth_ini
45
46- name: "bluetooth: Service {{ state }} and {{ enable }}"
47  ansible.builtin.service:
48    name: "{{ lp_bluetooth_service }}"
49    state: "{{ state }}"
50    enabled: "{{ enabled }}"
51  register: result
52  vars:
53    enabled: "{{ lp_bluetooth_enable|bool|d(false) }}"
54    state: "{{ lp_bluetooth_state|d(default_state) }}"
55    default_state: "{{ enabled|ternary('started', 'stopped') }}"
56    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
57  tags: lp_bluetooth_service
58
59- name: "bluetooth: Debug service"
60  ansible.builtin.debug:
61    var: result
62  when: lp_bluetooth_debug|bool
63
64# EOF
65...

See also

chrony.yml

Synopsis: Configure chrony.

Description of the task.

[tasks/chrony.yml]

  1---
  2# linux_postinstall chrony
  3
  4- name: "chrony: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_chrony_install: {{ lp_chrony_install }}
  9      lp_chrony_enable: {{ lp_chrony_enable }}
 10      lp_chrony_sanity: {{ lp_chrony_sanity }}
 11      lp_chrony_flush_handlers: {{ lp_swap_flush_handlers }}
 12      lp_chrony_rescue_end_host: {{ lp_swap_rescue_end_host }}
 13      lp_chrony_service: {{ lp_chrony_service }}
 14      lp_chrony_conf_file: {{ lp_chrony_conf_file }}
 15      lp_chrony_conf:
 16        {{ lp_chrony_conf|to_nice_yaml(indent=2)|indent(2) }}
 17      lp_chrony_packages:
 18        {{ lp_chrony_packages|to_nice_yaml(indent=2)|indent(2) }}
 19      lp_backup_conf: {{ lp_backup_conf }}
 20      lp_timesyncd_enable: {{ lp_timesyncd_enable }}
 21  ansible.builtin.debug:
 22    msg: "{{ '{}'.format(msg) }}"
 23  when: lp_chrony_debug|bool
 24  tags: lp_chrony_debug
 25
 26- name: "chrony: sanity"
 27  block:
 28    - name: "chrony: sanity: Disabled timesyncd"
 29      ansible.builtin.assert:
 30        that: not lp_timesyncd_enable|bool
 31        fail_msg: "[ERR] Service {{ lp_timesyncd_service }} must be disabled."
 32  when: lp_chrony_sanity|bool
 33  tags: lp_chrony_sanity
 34
 35- name: "chrony: Install packages"
 36  ansible.builtin.import_role:
 37    name: vbotka.linux_lib
 38    tasks_from: install_package.yml
 39  when: lp_chrony_install|bool
 40  vars:
 41    ll_ipkg_list: "{{ lp_chrony_packages }}"
 42    ll_ipkg_state: "{{ lp_package_state }}"
 43    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 44    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 45    ll_debug: "{{ lp_chrony_debug|bool }}"
 46  tags: lp_chrony_packages
 47
 48- name: "chrony: Configure, enable, start, or disable chrony"
 49  block:
 50
 51    - name: "chrony: Configure {{ lp_chrony_conf_file }}"
 52      ansible.builtin.template:
 53        src: chrony.conf.j2
 54        dest: "{{ lp_chrony_conf_file }}"
 55        owner: root
 56        group: root
 57        mode: "0644"
 58        backup: "{{ lp_backup_conf }}"
 59      notify: restart chrony
 60      tags: lp_chrony_conf
 61
 62    - name: "chrony: Service {{ state }} and {{ enable }}"
 63      ansible.builtin.service:
 64        name: "{{ lp_chrony_service }}"
 65        state: "{{ state }}"
 66        enabled: "{{ enabled }}"
 67      register: result
 68      vars:
 69        enabled: "{{ lp_chrony_enable|bool|d(false) }}"
 70        state: "{{ lp_chrony_state|d(default_state) }}"
 71        default_state: "{{ enabled|ternary('started', 'stopped') }}"
 72        enable: "{{ enabled|ternary('enabled', 'disabled') }}"
 73      tags: lp_chrony_service
 74
 75    - name: "chrony: Debug service"
 76      ansible.builtin.debug:
 77        var: result
 78      when: lp_chrony_debug|bool
 79      tags: lp_chrony_service
 80
 81  rescue:
 82
 83    - name: "chrony: Print errors"
 84      ansible.builtin.debug:
 85        msg: |
 86          [ERR] task {{ ansible_failed_task.name }} failed. End host.
 87          ansible_failed_task:
 88            {{ ansible_failed_task|to_yaml(indent=2)|indent(2) }}
 89          ansible_failed_result:
 90            {{ ansible_failed_result|to_yaml(indent=2)|indent(2) }}
 91
 92    - name: "chrony: End host"
 93      ansible.builtin.meta: end_host
 94      when:
 95        - lp_chrony_rescue_end_host|bool
 96        - not ansible_check_mode
 97
 98    - name: "chrony: Clear host errors"
 99      ansible.builtin.meta: clear_host_errors
100
101- name: "chrony: Flush handlers"
102  ansible.builtin.meta: flush_handlers
103  when: lp_chrony_flush_handlers|bool
104
105# EOF
106...

cron.yml

Synopsis: Configure cron.

Description of the task.

[tasks/cron.yml]

 1---
 2# linux_postinstall cron
 3
 4- name: "cron: Configure cron variables"
 5  community.general.cronvar:
 6    name: "{{ item.name }}"
 7    value: "{{ item.value }}"
 8    user: "{{ item.user }}"
 9  loop: "{{ lp_cron_var }}"
10  tags: lp_cron_var
11
12- name: "cron: Configure cron"
13  ansible.builtin.cron:
14    state: "{{ item.state }}"
15    user: "{{ item.user }}"
16    name: "{{ item.name }}"
17    minute: "{{ item.minute }}"
18    hour: "{{ item.hour }}"
19    day: "{{ item.day }}"
20    month: "{{ item.month }}"
21    weekday: "{{ item.weekday }}"
22    job: "{{ item.command }}"
23  loop: "{{ lp_cron_tab }}"
24  loop_control:
25    label: "{{ item.name }}"
26  tags: lp_cron_tab
27
28# EOF
29...

debsums.yml

Synopsis: Configure debsums.

Description of the task.

[tasks/debsums.yml]

 1---
 2# linux_postinstall debsums
 3
 4- name: "debsums: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_debsums_install: {{ lp_debsums_install }}
 9      lp_debsums_default_file: {{ lp_debsums_default_file }}
10      lp_debsums_default_conf:
11        {{ lp_debsums_default_conf|to_yaml(indent=2)|indent(2) }}
12      lp_debsums_ignore_file: {{ lp_debsums_ignore_file }}
13      lp_debsums_ignore_conf:
14        {{ lp_debsums_ignore_conf|to_nice_yaml(indent=2)|indent(2) }}
15      lp_debsums_packages:
16        {{ lp_debsums_packages|to_nice_yaml(indent=2)|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_debsums_debug|bool
21  tags: lp_debsums_debug
22
23- name: "debsums: Install packages"
24  ansible.builtin.import_role:
25    name: vbotka.linux_lib
26    tasks_from: install_package.yml
27  when: lp_debsums_install|bool
28  vars:
29    ll_ipkg_list: "{{ lp_debsums_packages }}"
30    ll_ipkg_state: "{{ lp_package_state }}"
31    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
32    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
33    ll_debug: "{{ lp_debsums_debug|bool }}"
34  tags: lp_debsums_packages
35
36- name: "debsums: Configure {{ lp_debsums_default_file }}"
37  ansible.builtin.lineinfile:
38    dest: "{{ lp_debsums_default_file }}"
39    state: "{{ item.state|default(omit) }}"
40    regexp: '^\s*{{ item.key }}\s*=(.*)$'
41    line: "{{ item.key }}={{ item.value }}"
42    backup: "{{ lp_backup_conf }}"
43    create: true
44    mode: "0644"
45  loop: "{{ lp_debsums_default_conf }}"
46  tags: lp_debsums_default_conf
47
48- name: "debsums: Configure {{ lp_debsums_ignore_file }}"
49  ansible.builtin.lineinfile:
50    dest: "{{ lp_debsums_ignore_file }}"
51    state: "{{ item.state|default(omit) }}"
52    line: "{{ item }}"
53    backup: "{{ lp_backup_conf }}"
54    create: true
55    mode: "0644"
56  loop: "{{ lp_debsums_ignore_conf }}"
57  tags: lp_debsums_ignore_conf
58
59# EOF
60...

debug.yml

Synopsis: Configure debug.

Description of the task.

[tasks/debug.yml]

 1---
 2# Hint: Get readable output with stdout_callback = yaml
 3
 4- name: "Debug"
 5  vars:
 6    msg: |-
 7      ansible_architecture: {{ ansible_architecture }}
 8      ansible_os_family: {{ ansible_os_family }}
 9      ansible_distribution: {{ ansible_distribution }}
10      ansible_distribution_major_version: {{ ansible_distribution_major_version }}
11      ansible_distribution_version: {{ ansible_distribution_version }}
12      ansible_distribution_release: {{ ansible_distribution_release }}
13      ansible_python_version: {{ ansible_python_version }}
14
15      lp_vars_distro: {{ lp_vars_distro }}
16      lp_vars_distro_firstfound_skip: {{ lp_vars_distro_firstfound_skip }}
17      lp_vars_flavors: {{ lp_vars_flavors }}
18      lp_flavors_enable: {{ lp_flavors_enable }}
19      my_release:
20        {{ my_release|default([])|to_nice_yaml|indent(2) }}
21      lp_package_state: {{ lp_package_state }}
22      lp_package_state_remove: {{ lp_package_state_remove }}
23      lp_backup_conf: {{ lp_backup_conf }}
24      lp_service:
25        {{ lp_service|to_yaml|indent(2) }}
26      lp_tasks_enabled: {{ lp_tasks_enabled_print|ternary(lp_tasks_enabled, 'Disabled') }}
27      lp_tasks_disabled: {{ lp_tasks_disabled_print|ternary(lp_tasks_disabled, 'Disabled') }}
28
29      lp_acpi: {{ lp_acpi }} lp_acpi_install: {{ lp_acpi_install }} lp_acpi_enable: {{ lp_acpi_enable }} lp_acpi_service: {{ lp_acpi_service }}
30      lp_aliases: {{ lp_aliases }}
31      lp_apt: {{ lp_apt }}
32      lp_debsums: {{ lp_debsums }} lp_debsums_install: {{ lp_debsums_install }}
33      lp_gpg: {{ lp_gpg }} lp_gpg_install: {{ lp_gpg_install }}
34      lp_grub: {{ lp_grub }}
35      lp_iptables: {{ lp_iptables }}
36      lp_kvm: {{ lp_kvm }} lp_kvm_install: {{ lp_kvm_install }}
37      lp_latex: {{ lp_latex }} lp_latex_install: {{ lp_latex_install }}
38      lp_lid: {{ lp_lid }}
39      lp_logrotate: {{ lp_logrotate }} lp_logrotate_install: {{ lp_logrotate_install }}
40      lp_netplan: {{ lp_netplan }}
41      lp_packages_autoremove: {{ lp_packages_autoremove }}
42      lp_passwords: {{ lp_passwords }}
43      lp_pm: {{ lp_pm }}
44      lp_rc_local: {{ lp_rc_local }}
45      lp_reboot: {{ lp_reboot }}
46      lp_ssh: {{ lp_ssh }}
47      lp_swap: {{ lp_swap }} lp_swap_enable: {{ lp_swap_enable }}
48      lp_systemd: {{ lp_systemd }} lp_systemd_install: {{ lp_systemd_install }}
49      lp_timezone: {{ lp_timezone }}
50      lp_wpagui: {{ lp_wpagui }} lp_wpagui_install: {{ lp_wpagui_install }}
51
52      {% for service in lp_service_all %}
53      lp_{{ service }}: {{ lookup('vars', 'lp_' ~ service) }}, {% for suffix in ['_install', '_enable', '_service'] -%}
54      lp_{{ service }}{{ suffix }}: {{ lookup('vars', 'lp_' ~ service ~ suffix, default='UNDEFINED') }}, {% endfor %}
55
56      {% endfor %}
57
58      {% for group in lp_services_all %}
59      lp_{{ group }}: {{ lookup('vars', 'lp_' ~ group) }}, {% for suffix in ['_install', '_enable'] -%}
60      lp_{{ group }}{{ suffix }}: {{ lookup('vars', 'lp_' ~ group ~ suffix, default='UNDEFINED') }}, {% endfor %}
61
62      services:
63      {% for service in lookup('vars', 'lp_' ~ group ~ '_services') %}
64      - {{ service }}
65      {% endfor %}
66      {% endfor %}
67
68      lp_wpasupplicant: {{ lp_wpasupplicant }} lp_wpasupplicant_install: {{ lp_wpasupplicant_install }}
69      lp_xen: {{ lp_xen }} lp_xen_install: {{ lp_xen_install }}
70      lp_zeitgeist: {{ lp_zeitgeist }} lp_zeitgeist_install: {{ lp_zeitgeist_install }}
71      lp_zfs: {{ lp_zfs }} lp_zfs_install: {{ lp_zfs_install }}
72      [WIP] lp_snap: {{ lp_snap }} lp_snap_install: {{ lp_snap_install }} lp_snap_enable: {{ lp_snap_enable }}
73
74  ansible.builtin.debug:
75    msg: "{{ '{}'.format(msg) }}"
76
77# EOF
78...

dnsmasq.yml

Synopsis: Configure dnsmasq.

Description of the task.

[tasks/dnsmasq.yml]

 1---
 2# linux_postinstall dnsmasq
 3
 4- name: "dnsmasq: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_dnsmasq_install: {{ lp_dnsmasq_install }}
 9      lp_dnsmasq_enable: {{ lp_dnsmasq_enable }}
10      lp_dnsmasq_service: {{ lp_dnsmasq_service }}
11      lp_dnsmasq_packages:
12        {{ lp_dnsmasq_packages|to_nice_yaml(indent=2)|indent(2) }}
13      lp_dnsmasq_config:
14        {{ lp_dnsmasq_config|to_nice_yaml(indent=2)|indent(2) }}
15      lp_dnsmasq_hosts:
16        {{ lp_dnsmasq_hosts|to_yaml(indent=2)|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_dnsmasq_debug|bool
21  tags: lp_dnsmasq_debug
22
23- name: "dnsmasq: Install packages"
24  ansible.builtin.import_role:
25    name: vbotka.linux_lib
26    tasks_from: install_package.yml
27  when: lp_dnsmasq_install|bool
28  vars:
29    ll_ipkg_list: "{{ lp_dnsmasq_packages }}"
30    ll_ipkg_state: "{{ lp_package_state }}"
31    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
32    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
33    ll_debug: "{{ lp_dnsmasq_debug|bool }}"
34  tags: lp_dnsmasq_packages
35
36- name: "dnsmasq: Create directories"
37  ansible.builtin.file:
38    state: directory
39    path: "{{ item.dest|dirname }}"
40    owner: "{{ item.downer|d('root') }}"
41    group: "{{ item.dgroup|d('root') }}"
42    mode: "{{ item.dmode|d('0755') }}"
43  loop: "{{ lp_dnsmasq_config }}"
44  loop_control:
45    label: "{{ item.dest|dirname }}"
46  tags: lp_dnsmasq_directories
47
48- name: "dnsmasq: Configure"
49  ansible.builtin.template:
50    src: "{{ item.src }}"
51    dest: "{{ item.dest }}"
52    owner: "{{ item.owner|d('root') }}"
53    group: "{{ item.group|d('root') }}"
54    mode: "{{ item.mode|d('0600') }}"
55    backup: "{{ lp_backup_conf }}"
56  loop: "{{ lp_dnsmasq_config }}"
57  loop_control:
58    label: "{{ item.dest }}"
59  notify: restart dnsmasq
60  tags: lp_dnsmasq_config
61
62- name: "dnsmasq: Service {{ state }} and {{ enable }}"
63  ansible.builtin.service:
64    name: "{{ lp_dnsmasq_service }}"
65    state: "{{ state }}"
66    enabled: "{{ enabled }}"
67  register: result
68  vars:
69    enabled: "{{ lp_dnsmasq_enable|bool|d(false) }}"
70    state: "{{ lp_dnsmasq_state|d(default_state) }}"
71    default_state: "{{ enabled|ternary('started', 'stopped') }}"
72    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
73  tags: lp_dnsmasq_service
74
75- name: "dnsmasq: Debug service"
76  ansible.builtin.debug:
77    var: result
78  when: lp_dnsmasq_debug|bool
79  tags: lp_dnsmasq_service
80
81# EOF
82...

fstab.yml

Synopsis: Configure fstab.

Description of the task.

[tasks/fstab.yml]

 1---
 2# linux_postinstall fstab
 3
 4- name: "fstab: Configure fstab entries"
 5  ansible.posix.mount:
 6    name: "{{ item.name }}"
 7    state: "{{ item.state|default('mounted') }}"
 8    src: "{{ item.src|default(omit) }}"
 9    fstype: "{{ item.fstype|default(omit) }}"
10    opts: "{{ item.opts|default(omit) }}"
11    dump: "{{ item.dump|default(omit) }}"
12    passno: "{{ item.passno|default(omit) }}"
13    backup: "{{ lp_backup_conf }}"
14  loop: "{{ lp_fstab_entries }}"
15
16# EOF
17...

gpg.yml

Synopsis: Configure gpg.

Description of the task.

[tasks/gpg.yml]

 1---
 2# linux_postinstall gpg
 3
 4- name: "gpg: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      ansible_python_version: {{ ansible_python_version }}
 9      lp_gpg_install: {{ lp_gpg_install }}
10      lp_gpg_packages:
11        {{ lp_gpg_packages|to_nice_yaml(indent=2)|indent(2) }}
12      lp_gpg_packages_extra:
13        {{ lp_gpg_packages_extra|to_nice_yaml(indent=2)|indent(2) }}
14      lp_gpg_conf_template: {{ lp_gpg_conf_template }}
15      lp_gpg_conf:
16        {{ lp_gpg_conf|to_yaml(indent=2)|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_gpg_debug|bool
21  tags: lp_gpg_debug
22
23- name: "gpg: Install packages"
24  ansible.builtin.import_role:
25    name: vbotka.linux_lib
26    tasks_from: install_package.yml
27  vars:
28    ll_ipkg_list: "{{ lp_gpg_packages + lp_gpg_packages_extra }}"
29    ll_ipkg_state: "{{ lp_package_state }}"
30    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
31    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
32    ll_debug: "{{ lp_gpg_debug|bool }}"
33  when: lp_gpg_install|bool
34  tags: lp_gpg_packages
35
36- name: "gpg: Create directories .gnupg"
37  ansible.builtin.file:
38    state: directory
39    dest: "/home/{{ item }}/.gnupg"
40    owner: "{{ item }}"
41    group: "{{ item }}"
42    mode: '0700'
43  loop: "{{ lp_gpg_conf|map(attribute='owner')|unique|sort }}"
44  tags: lp_gpg_dir
45
46- name: "gpg: Configure gnupg"
47  ansible.builtin.template:
48    src: "{{ lp_gpg_conf_template }}"
49    dest: "{{ '/home/' ~ item.owner ~ '/.gnupg/' ~ item.component ~ '.conf' }}"
50    owner: "{{ item.owner }}"
51    group: "{{ item.owner }}"
52    mode: '0600'
53    backup: "{{ lp_backup_conf }}"
54  register: lp_gpg_conf_reg
55  loop: "{{ lp_gpg_conf }}"
56  loop_control:
57    label: "{{ item.owner }} {{ item.component }}"
58  notify: gpgconf reload
59  tags: lp_gpg_conf
60
61# TODO: import keys, template blocks
62
63# EOF
64...

See also

gpsd.yml

Synopsis: Configure gpsd.

Description of the task.

[tasks/gpsd.yml]

 1---
 2# linux_postinstall gpsd
 3
 4- name: "gpsd: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_gpsd_install: {{ lp_gpsd_install }}
 9      lp_gpsd_packages:
10        {{ lp_gpsd_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_backup_conf: {{ lp_backup_conf }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_gpsd_debug|bool
15  tags: lp_gpsd_debug
16
17- name: "gpsd: Install packages for gpsd"
18  ansible.builtin.import_role:
19    name: vbotka.linux_lib
20    tasks_from: install_package.yml
21  when: lp_gpsd_install|bool
22  vars:
23    ll_ipkg_list: "{{ lp_gpsd_packages }}"
24    ll_ipkg_state: "{{ lp_package_state }}"
25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
27    ll_debug: "{{ lp_gpsd_debug|bool }}"
28  tags: lp_gpsd_packages
29
30- name: "gpsd: Add user gpsd to group dialout"
31  ansible.builtin.user:
32    name: gpsd
33    groups: dialout
34    append: true
35  tags: lp_gpsd_group
36
37- name: "gpsd: Configure /etc/bluetooth/rfcomm.conf"
38  ansible.builtin.blockinfile:
39    dest: /etc/bluetooth/rfcomm.conf
40    create: true
41    marker: "# {mark} ANSIBLE MANAGED BLOCK rfcomm{{ item.rfcomm }}"
42    insertafter: EOF
43    owner: root
44    group: root
45    mode: '0644'
46    backup: "{{ lp_backup_conf }}"
47    block: |
48      rfcomm{{ item.rfcomm }} {
49        bind {{ item.bind }}
50        device {{ item.device }}
51        channel {{ item.channel }}
52        comment "{{ item.comment }}"
53        }
54  loop: "{{ lp_gpsd_bt_rfcomm }}"
55  notify: restart bluetooth
56  tags: lp_gpsd_bt_rfcom
57
58- name: "gpsd: Configure /etc/default/gpsd"
59  ansible.builtin.template:
60    src: gpsd.j2
61    dest: /etc/default/gpsd
62    owner: root
63    group: root
64    mode: '0644'
65    backup: "{{ lp_backup_conf }}"
66  notify: restart gpsd
67  tags: lp_gpsd_config
68
69- name: "gpsd: Service {{ state }} and {{ enable }}"
70  ansible.builtin.service:
71    name: "{{ lp_gpsd_service }}"
72    state: "{{ state }}"
73    enabled: "{{ enabled }}"
74  register: result
75  vars:
76    enabled: "{{ lp_gpsd_enable|bool|d(false) }}"
77    state: "{{ lp_gpsd_state|d(default_state) }}"
78    default_state: "{{ enabled|ternary('started', 'stopped') }}"
79    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
80  tags: lp_gpsd_service
81
82- name: "gpsd: Debug service"
83  ansible.builtin.debug:
84    var: result
85  when: lp_gpsd_debug|bool
86  tags: lp_gpsd_service
87
88# EOF
89...

See also

groups.yml

Synopsis: Configure groups.

Description of the task.

[tasks/groups.yml]

 1---
 2# linux_postinstall groups
 3
 4- name: "groups: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_groups:
 9        {{ lp_groups|to_nice_yaml(indent=2)|indent(2) }}
10      lp_backup_conf: {{ lp_backup_conf }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_groups_debug|bool
14  tags: lp_groups_debug
15
16- name: "groups: Manage groups"
17  ansible.builtin.group:
18    name: "{{ item.name }}"
19    gid: "{{ item.gid|default(omit) }}"
20    state: "{{ item.state|default(omit) }}"
21    system: "{{ item.system|default(omit) }}"
22  loop: "{{ lp_groups }}"
23
24# EOF
25...

grub.yml

Synopsis: Configure grub.

Description of the task.

[tasks/grub.yml]

 1---
 2# linux_postinstall grub
 3
 4- name: "grub: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_grub_default:
 9        {{ lp_grub_default|to_yaml(indent=2)|indent(2) }}
10      lp_backup_conf: {{ lp_backup_conf }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_grub_debug|bool
14  tags: lp_grub_debug
15
16- name: "grub: Configure /etc/default/grub"
17  ansible.builtin.lineinfile:
18    dest: /etc/default/grub
19    regexp: '^\s*{{ item.var }}\s*=(.*)$'
20    line: "{{ item.var }}={{ item.value }}"
21    backup: "{{ lp_backup_conf }}"
22  loop: "{{ lp_grub_default }}"
23  loop_control:
24    label: "{{ item.var }}: {{ item.value }}"
25  notify: update grub
26  tags: lp_grub_conf
27
28# EOF
29...

See also

hostname.yml

Synopsis: Configure hostname.

Description of the task.

[tasks/hostname.yml]

 1---
 2# linux_postinstall hostname
 3
 4# TODO:
 5# 1) SET/DONT_SET hostname via DHCP
 6# /etc/dhcp/dhclient.conf
 7# #send host-name = gethostname();
 8# request host-name = "myhostname";
 9# https://askubuntu.com/questions/104918/how-to-get-the-hostname-from-a-dhcp-server
10# http://blog.schlomo.schapiro.org/2013/11/setting-hostname-from-dhcp-in-debian.html
11# https://askubuntu.com/questions/757423/how-to-force-dhcp-client-to-allow-a-self-defined-domain-name
12
13- name: "hostname: Configure hostname in /etc/hostname"
14  ansible.builtin.template:
15    src: hostname.j2
16    dest: /etc/hostname
17    owner: root
18    group: root
19    mode: '0644'
20    backup: "{{ lp_backup_conf }}"
21  when:
22    - lp_hostname|length > 0
23    - ansible_os_family == 'Debian'
24#  notify: set hostname
25
26- name: "hostname: Configure hostname"
27  ansible.builtin.hostname:
28    name: "{{ lp_hostname }}"
29  when: lp_hostname|length > 0
30
31# EOF
32...

hosts.yml

Synopsis: Configure hosts.

Description of the task.

[tasks/hosts.yml]

 1---
 2# linux_postinstall hosts
 3
 4- name: "hosts: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_hosts_sanity: {{ lp_hosts_sanity }}
 9      lp_hosts_default_override:
10        {{ lp_hosts_default_override|to_yaml(indent=2)|indent(2) }}
11      lp_hosts_default:
12        {{ lp_hosts_default|to_yaml(indent=2)|indent(2) }}
13      lp_hosts_template: {{ lp_hosts_template }}
14      lp_hosts:
15        {{ lp_hosts|to_yaml(indent=2)|indent(2) }}
16      lp_backup_conf: {{ lp_backup_conf }}
17  ansible.builtin.debug:
18    msg: "{{ '{}'.format(msg) }}"
19  when: lp_hosts_debug|bool
20  tags: lp_hosts_debug
21
22- name: "hosts: Sanity"
23  block:
24
25    - name: "hosts: Sanity valid IP"
26      ansible.builtin.fail:
27        msg: '[ERR] Invalid IP address'
28      when: (lp_hosts|map(attribute='ip')|map('ipaddr')) is not all
29
30    - name: "hosts: Sanity unique FQDN"
31      ansible.builtin.fail:
32        msg: '[ERR] FQDN not unique'
33      vars:
34        no_records: "{{ lp_hosts|length }}"
35        no_hosts: "{{ lp_hosts|map(attribute='fqdn')|list|unique|length }}"
36      when: no_records != no_hosts
37
38  when: lp_hosts_sanity|bool
39  tags: lp_hosts_sanity
40
41- name: "hosts: Configure hosts in /etc/hosts"
42  ansible.builtin.template:
43    src: "{{ lp_hosts_template }}"
44    dest: /etc/hosts
45    owner: root
46    group: root
47    mode: '0644'
48    backup: "{{ lp_backup_conf }}"
49  tags: lp_hosts_conf
50
51# EOF
52...

See also

iptables.yml

Synopsis: Configure iptables.

Description of the task.

[tasks/iptables.yml]

 1---
 2# linux_postinstall iptables
 3
 4- name: "iptables: Create /etc/network/if-pre-up.d/iptables"
 5  ansible.builtin.template:
 6    src: iptables-restore.j2
 7    dest: /etc/network/if-pre-up.d/iptables
 8    owner: root
 9    group: root
10    mode: '0755'
11
12- name: "iptables: Create /etc/network/iptables
13                   using {{ lp_iptables_type }}-iptables.j2"
14  ansible.builtin.template:
15    src: "{{ lp_iptables_type }}-iptables.j2"
16    dest: /etc/network/iptables
17    owner: root
18    group: root
19    mode: '0644'
20  notify: reload iptables
21
22# EOF
23...

See also

kvm.yml

Synopsis: Configure kvm.

Description of the task.

[tasks/kvm.yml]

 1---
 2# linux_postinstall kvm
 3
 4- name: "kvm: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_kvm_packages:
 9        {{ lp_kvm_packages|to_nice_yaml(indent=2)|indent(2) }}
10  ansible.builtin.debug:
11    msg: "{{ '{}'.format(msg) }}"
12  when: lp_kvm_debug|bool
13  tags: lp_kvm_debug
14
15- name: "kvm: Install packages"
16  ansible.builtin.import_role:
17    name: vbotka.linux_lib
18    tasks_from: install_package.yml
19  when: lp_kvm_install|bool
20  vars:
21    ll_ipkg_list: "{{ lp_kvm_packages }}"
22    ll_ipkg_state: "{{ lp_package_state }}"
23    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
24    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
25    ll_debug: "{{ lp_kvm_debug|bool }}"
26  tags: lp_kvm_packages
27
28# EOF
29...

latex.yml

Synopsis: Configure latex.

Description of the task.

[tasks/latex.yml]

 1---
 2# linux_postinstall LaTeX
 3
 4- name: "latex: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_latex_install: {{ lp_latex_install }}
 9      lp_latex_packages:
10        {{ lp_latex_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_backup_conf: {{ lp_backup_conf }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_latex_debug|bool
15  tags: lp_latex_debug
16
17- name: "latex: Install packages"
18  ansible.builtin.import_role:
19    name: vbotka.linux_lib
20    tasks_from: install_package.yml
21  when: lp_latex_install|bool
22  vars:
23    ll_ipkg_list: "{{ lp_latex_packages }}"
24    ll_ipkg_state: "{{ lp_package_state }}"
25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
27    ll_debug: "{{ lp_latex_debug|bool }}"
28  tags: lp_latex_packages
29
30- name: "latex: Create directory /usr/share/texmf/tex/latex"
31  ansible.builtin.file:
32    state: directory
33    path: /usr/share/texmf/tex/latex
34    mode: '0755'
35  tags: lp_latex_dir
36
37- name: "latex: Create directories for macros"
38  ansible.builtin.file:
39    state: directory
40    path: "{{ item }}"
41    mode: '0755'
42  loop: "{{ lp_latex_macros|map(attribute='dest')|unique }}"
43  tags: lp_latex_macros
44
45- name: "latex: Download macros"
46  ansible.builtin.get_url:
47    url: "{{ item.url }}"
48    dest: "{{ item.dest }}"
49    timeout: "{{ lp_latex_download_timeout }}"
50  loop: "{{ lp_latex_macros }}"
51  loop_control:
52    label: "{{ item.url }}"
53  ignore_errors: "{{ lp_latex_get_url_ignore_errors }}"  # noqa ignore-errors
54  changed_when: false
55  tags: lp_latex_labels
56
57# Note
58# get_url: check mode reports changes with force enabled
59# https://github.com/ansible/ansible/issues/25418#issuecomment-307208773
60# https://github.com/ansible/ansible/issues/25418
61
62# [TODO]
63# 1) Compile and register labels.sty
64# cd /usr/share/texmf/tex/latex/labels/
65# latex labels.ins
66# texhash /usr/share/texmf
67
68# EOF
69...

libvirt.yml

Synopsis: Configure libvirt.

Description of the task.

[tasks/libvirt.yml]

 1---
 2# linux_postinstall libvirt
 3
 4- name: "libvirt Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_libvirt_guests_enable: {{ lp_libvirt_guests_enable }}
 9      lp_libvirt_libvirtd_enable: {{ lp_libvirt_libvirtd_enable }}
10      lp_libvirt_conf_owner: {{ lp_libvirt_conf_owner }}
11      lp_libvirt_conf_group: {{ lp_libvirt_conf_group }}
12      lp_libvirt_conf_mode: {{ lp_libvirt_conf_mode }}
13      lp_libvirt_conf_dir: {{ lp_libvirt_conf_dir }}
14      lp_libvirt_packages:
15        {{ lp_libvirt_packages|to_nice_yaml|indent(2) }}
16      lp_libvirt_conf:
17        {{ lp_libvirt_conf|to_nice_yaml|indent(2) }}
18      lp_backup_conf: {{ lp_backup_conf }}
19  ansible.builtin.debug:
20    msg: "{{ '{}'.format(msg) }}"
21  when: lp_libvirt_debug|bool
22  tags: lp_libvirt_debug
23
24- name: "libvirt: Install packages"
25  ansible.builtin.import_role:
26    name: vbotka.linux_lib
27    tasks_from: install_package.yml
28  when: lp_libvirt_packages|bool
29  vars:
30    ll_ipkg_list: "{{ lp_libvirt_packages }}"
31    ll_ipkg_state: "{{ lp_package_state }}"
32    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
33    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
34    ll_debug: "{{ lp_libvirt_debug|bool }}"
35  tags: lp_libvirt_packages
36
37- name: "libvirt: Configure {{ lp_libvirt_conf_dir }}"
38  ansible.builtin.lineinfile:
39    dest: "{{ lp_libvirt_conf_dir }}/{{ item.0.key }}"
40    regexp: '^\s*{{ item.1.0 }}(\s|=)(.*)$'
41    line: "{{ item.1.0 }} = {{ item.1.1 }}"
42    state: "{{ item.1.2|default('present') }}"
43    backup: "{{ lp_backup_conf }}"
44    create: true
45    owner: "{{ item.0.owner|default('root') }}"
46    group: "{{ item.0.group|default('root') }}"
47    mode: "{{ item.0.mode|default('0644') }}"
48  loop: "{{ query('subelements',
49                  lp_libvirt_conf|dict2items,
50                  'value.conf',
51                  {'skip_missing': True}) }}"
52  loop_control:
53    label: "{{ item.0.key }}
54            {{ item.1.0 }}: {{ item.1.1 }}
55            {{ item.1.2|default('present') }}"
56  notify:
57    - reload libvirtd
58    - reload libvirt_guests
59  tags: lp_libvirt_conf
60
61- name: "libvirt: Service {{ lp_libvirt_libvirtd_service }} {{ state }} and {{ enable }}"
62  ansible.builtin.service:
63    name: "{{ lp_libvirt_libvirtd_service }}"
64    state: "{{ state }}"
65    enabled: "{{ enabled }}"
66  register: result
67  vars:
68    enabled: "{{ lp_libvirt_libvirtd_enable|bool|d(false) }}"
69    state: "{{ lp_libvirt_libvirtd_state|d(default_state) }}"
70    default_state: "{{ enabled|ternary('started', 'stopped') }}"
71    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
72  tags: lp_libvirt_libvirtd_service
73
74- name: "libvirt: Service {{ lp_libvirt_guests_service }} {{ state }} and {{ enable }}"
75  ansible.builtin.service:
76    name: "{{ lp_libvirt_guests_service }}"
77    state: "{{ state }}"
78    enabled: "{{ enabled }}"
79  register: result
80  vars:
81    enabled: "{{ lp_libvirt_guests_enable|bool|d(false) }}"
82    state: "{{ lp_libvirt_guests_state|d(default_state) }}"
83    default_state: "{{ enabled|ternary('started', 'stopped') }}"
84    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
85  tags: lp_libvirt_guests_service
86
87# EOF
88...

lid.yml

Synopsis: Configure lid.

Description of the task.

[tasks/lid.yml]

 1---
 2# linux_postinstall lid
 3
 4- name: "lid: Configure {{ lp_lid_logind_conf }}"
 5  ansible.builtin.lineinfile:
 6    dest: "{{ lp_lid_logind_conf }}"
 7    regexp: '^\s*{{ item.var }}\s*=\s*(.*)$'
 8    line: "{{ item.var }}={{ item.value }}"
 9    backup: "{{ lp_backup_conf }}"
10  loop: "{{ lp_lid_logind_conf_vars }}"
11  loop_control:
12    label: "{{ item.var }}: {{ item.value }}"
13  notify: logind message reboot
14
15- name: "lid: Configure {{ lp_lid_upower_conf }}"
16  ansible.builtin.lineinfile:
17    dest: "{{ lp_lid_upower_conf }}"
18    regexp: '^\s*{{ item.var }}\s*=\s*(.*)$'
19    line: "{{ item.var }}={{ item.value }}"
20    backup: "{{ lp_backup_conf }}"
21  loop: "{{ lp_lid_upower_conf_vars }}"
22  loop_control:
23    label: "{{ item.var }}: {{ item.value }}"
24
25# EOF
26...

See also

logrotate.yml

Synopsis: Configure logrotate.

Description of the task.

[tasks/logrotate.yml]

 1---
 2# linux_postinstall logrotate
 3
 4- name: "logrotate: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_logrotate_install: {{ lp_logrotate_install }}
 9      lp_logrotate_packages:
10        {{ lp_logrotate_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_backup_conf: {{ lp_backup_conf }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_logrotate_debug|bool
15  tags: lp_logrotate_debug
16
17- name: "logrotate: Install packages for logrotate"
18  ansible.builtin.import_role:
19    name: vbotka.linux_lib
20    tasks_from: install_package.yml
21  when: lp_logrotate_install|bool
22  vars:
23    ll_ipkg_list: "{{ lp_logrotate_packages }}"
24    ll_ipkg_state: "{{ lp_package_state }}"
25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
27    ll_debug: "{{ lp_logrotate_debug|bool }}"
28  tags: lp_logrotate_packages
29
30- name: "logrotate: Configure blocks in {{ lp_logrotate_conf_file }}"
31  ansible.builtin.blockinfile:
32    path: "{{ lp_logrotate_conf_file }}"
33    mark: "{{ item.mark }}"
34    block: "{{ item.block }}"
35    state: "{{ item.state }}"
36    backup: "{{ lp_backup_conf }}"
37  loop: "{{ lp_logrotate_conf_blocks }}"
38  tags: lp_logrotate_conf_blocks
39
40- name: "logrotate: Configure lines in {{ lp_logrotate_conf_file }}"
41  ansible.builtin.lineinfile:
42    path: "{{ lp_logrotate_conf_file }}"
43    line: "{{ item.line }}"
44    state: "{{ item.state }}"
45    backup: "{{ lp_backup_conf }}"
46  loop: "{{ lp_logrotate_conf_lines }}"
47  tags: lp_logrotate_conf_lines
48
49- name: "logrotate: Configure {{ lp_logrotate_conf_dir }}"
50  ansible.builtin.blockinfile:
51    path: "{{ lp_logrotate_conf_dir }}/{{ item.path }}"
52    block: "{{ item.conf }}"
53    backup: "{{ lp_backup_conf }}"
54    create: true
55    owner: "{{ item.owner|default('root') }}"
56    group: "{{ item.group|default('root') }}"
57    mode: "{{ item.mode|default('0644') }}"
58  loop: "{{ lp_logrotate_confd }}"
59  loop_control:
60    label: "{{ item.path }}"
61  tags: lp_logrotate_confd
62
63# EOF
64...

modemmanager.yml

Synopsis: Configure modemmanager.

Description of the task.

[tasks/modemmanager.yml]

 1---
 2# linux_postinstall ModemManager
 3
 4- name: "modemmanager: Configure /etc/init/modemmanager.override"
 5  ansible.builtin.template:
 6    src: modem-manager-override.j2
 7    dest: /etc/init/modemmanager.override
 8    owner: root
 9    group: root
10    mode: '0644'
11
12- name: "modemmanager: Service {{ state }} and {{ enable }}"
13  ansible.builtin.service:
14    name: "{{ lp_modemmanager_service }}"
15    state: "{{ state }}"
16    enabled: "{{ enabled }}"
17  register: result
18  vars:
19    enabled: "{{ lp_modemmanager_enable|bool|d(false) }}"
20    state: "{{ lp_modemmanager_state|d(default_state) }}"
21    default_state: "{{ enabled|ternary('started', 'stopped') }}"
22    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
23  tags: lp_modemmanager_service
24
25- name: "modemmanager: Debug service"
26  ansible.builtin.debug:
27    var: result
28  when: lp_modemmanager_debug|bool
29  tags: lp_modemmanager_service
30
31# EOF
32...

modules.yml

Synopsis: Configure modules.

Description of the task.

[tasks/modules.yml]

 1---
 2# linux_postinstall modules
 3
 4- name: "modules: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_modules_conf: {{ lp_modules_conf }}
 9      lp_modules:
10        {{ lp_modules|to_yaml(indent=2)|indent(2) }}
11      lp_modules_options_path:  {{ lp_modules_options_path }}
12      lp_modules_options:
13        {{ lp_modules_options|to_nice_yaml(indent=2)|indent(2) }}
14      lp_modules_blacklist_path: {{ lp_modules_blacklist_path }}
15      lp_modules_blacklist:
16        {{ lp_modules_blacklist|to_nice_yaml(indent=2)|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_modules_debug|bool
21  tags: lp_modules_debug
22
23- name: "modules: modprobe modules"
24  community.general.modprobe:
25    name: "{{ item.name }}"
26    params: "{{ item.params }}"
27    state: "{{ item.state|default('present') }}"
28  loop: "{{ lp_modules }}"
29
30# Debian
31- name: "modules: Configure {{ lp_modules_conf }} in Debian"
32  ansible.builtin.lineinfile:
33    dest: "{{ lp_modules_conf }}"
34    regexp: '^\s*{{ item.name }}\s*(.*)$'
35    line: "{{ item.name }} {{ item.params }}"
36    backup: "{{ lp_backup_conf }}"
37  loop: "{{ lp_modules }}"
38  when:
39    - ansible_os_family == 'Debian'
40    - item.state|default('present') == 'present'
41
42# RedHat
43- name: "modules: Configure {{ lp_modules_conf }} in RedHat"
44  ansible.builtin.lineinfile:
45    dest: "{{ lp_modules_conf }}"
46    regexp: '^\s*modprobe\s+{{ item.name }}\s*(.*)$'
47    line: "modprobe {{ item.name }} {{ item.params }}"
48    backup: "{{ lp_backup_conf }}"
49  loop: "{{ lp_modules }}"
50  when:
51    - ansible_os_family == 'RedHat'
52    - item.state|default('present') == 'present'
53
54- name: "modules: Blacklist modules in {{ lp_modules_blacklist_path }}"
55  ansible.builtin.template:
56    src: blacklist-module.j2
57    dest: "{{ lp_modules_blacklist_path }}/blacklist-{{ item }}.conf"
58    backup: "{{ lp_backup_conf }}"
59    mode: '0644'
60  loop: "{{ lp_modules_blacklist }}"
61  notify: update initramfs
62
63- name: "modules: Set modules options in {{ lp_modules_options_path }}"
64  ansible.builtin.template:
65    src: options-module.j2
66    dest: "{{ lp_modules_options_path }}/{{ item.module }}.conf"
67    backup: "{{ lp_backup_conf }}"
68    mode: '0644'
69  loop: "{{ lp_modules_options }}"
70  loop_control:
71    label: "{{ item.module }}: {{ item.options }}"
72  notify: update initramfs
73
74# EOF
75...

netplan.yml

Synopsis: Configure netplan.

Description of the task.

[tasks/netplan.yml]

 1---
 2# linux_postinstall netplan
 3
 4# Configure 01-network-manager-all.yaml only if it already exists
 5- name: "netplan: Stat {{ lp_netplan_default }}"
 6  ansible.builtin.stat:
 7    path: "{{ lp_netplan_root }}/{{ lp_netplan_default }}"
 8  register: result
 9
10- name: "netplan: Configure {{ lp_netplan_root }}/{{ lp_netplan_default }}"
11  ansible.builtin.template:
12    src: netplan-default.j2
13    dest: "{{ lp_netplan_root }}/{{ lp_netplan_default }}"
14    owner: "{{ lp_netplan_owner }}"
15    group: "{{ lp_netplan_group }}"
16    mode: "{{ lp_netplan_mode }}"
17    backup: "{{ lp_backup_conf }}"
18  notify: netplan apply
19  when: result.stat.exists|default(false)
20
21- name: "netplan: Configure files in {{ lp_netplan_root }}"
22  ansible.builtin.template:
23    src: netplan-conf.j2
24    dest: "{{ lp_netplan_root }}/{{ item.file }}"
25    owner: "{{ item.owner | default(lp_netplan_owner) }}"
26    group: "{{ item.group | default(lp_netplan_group) }}"
27    mode: "{{ item.mode | default(lp_netplan_mode) }}"
28    backup: "{{ lp_backup_conf }}"
29  loop: "{{ lp_netplan_conf }}"
30  loop_control:
31    label: "{{ item.file }}"
32  notify: netplan apply
33
34# EOF
35...

See also

networkd.yml

Synopsis: Configure networkd.

Description of the task.

[tasks/networkd.yml]

 1---
 2# linux_postinstall networkd
 3
 4- name: "networkd: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_networkd_install: {{ lp_networkd_install }}
 9      lp_networkd_packages:
10        {{ lp_networkd_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_networkd_enable: {{ lp_networkd_enable }}
12      lp_networkd_service: {{ lp_networkd_service }}
13      lp_networkd_conf:
14        {{ lp_networkd_conf|to_yaml(indent=2)|indent(2) }}
15      lp_systemd_owner: {{ lp_systemd_owner }}
16      lp_systemd_group: {{ lp_systemd_group }}
17      lp_systemd_mode: {{ lp_systemd_mode }}
18      lp_backup_conf: {{ lp_backup_conf }}
19  ansible.builtin.debug:
20    msg: "{{ '{}'.format(msg) }}"
21  when: lp_networkd_debug|bool
22  tags: lp_networkd_debug
23
24# Packages
25- name: "networkd: Install packages"
26  ansible.builtin.import_role:
27    name: vbotka.linux_lib
28    tasks_from: install_package.yml
29  when: lp_networkd_install|bool
30  vars:
31    ll_ipkg_list: "{{ lp_networkd_packages }}"
32    ll_ipkg_state: "{{ lp_package_state }}"
33    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
34    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
35    ll_debug: "{{ lp_networkd_debug|bool }}"
36  tags: lp_networkd_packages
37
38# Conf
39- name: "networkd: Configure networkd"
40  ansible.builtin.template:
41    src: "{{ item.src }}"
42    dest: "{{ item.dest }}"
43    owner: "{{ item.owner|default(lp_systemd_owner) }}"
44    group: "{{ item.group|default(lp_systemd_group) }}"
45    mode: "{{ item.mode|default(lp_systemd_mode) }}"
46    backup: "{{ lp_backup_conf }}"
47  loop: "{{ lp_networkd_conf }}"
48  loop_control:
49    label: "{{ item.dest }}"
50  notify: restart networkd
51  tags: lp_networkd_conf
52
53# Service
54- name: "networkd: Service {{ state }} and {{ enable }}"
55  ansible.builtin.service:
56    name: "{{ lp_networkd_service }}"
57    state: "{{ state }}"
58    enabled: "{{ enabled }}"
59  register: result
60  vars:
61    enabled: "{{ lp_networkd_enable|bool|d(false) }}"
62    state: "{{ lp_networkd_state|d(default_state) }}"
63    default_state: "{{ enabled|ternary('started', 'stopped') }}"
64    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
65  tags: lp_networkd_service
66
67- name: "networkd: Debug service"
68  ansible.builtin.debug:
69    var: result
70  when: lp_networkd_debug|bool
71
72# EOF
73...

networkmanager.yml

Synopsis: Configure networkmanager.

Description of the task.

[tasks/networkmanager.yml]

  1---
  2# linux_postinstall networkmanager
  3
  4- name: "nm: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_nm_install: {{ lp_nm_install }}
  9      lp_nm_packages:
 10        {{ lp_nm_packages|to_nice_yaml(indent=2)|indent(2) }}
 11      lp_nm_enable: {{ lp_nm_enable }}
 12      lp_nm_override: {{ lp_nm_override }}
 13      lp_nm_conf_path: {{ lp_nm_conf_path }}
 14      lp_nm_conf_no_extra_spaces: {{ lp_nm_conf_no_extra_spaces }}
 15      lp_nm_conf:
 16        {{ lp_nm_conf|to_yaml(indent=2)|indent(2) }}
 17      lp_nm_services:
 18        {{ lp_nm_services|to_nice_yaml(indent=2)|indent(2) }}
 19      lp_nm_mask: {{ lp_nm_mask }}
 20      lp_nm_service_mask:
 21        {{ lp_nm_services_mask|to_nice_yaml(indent=2)|indent(2) }}
 22      lp_backup_conf: {{ lp_backup_conf }}
 23  ansible.builtin.debug:
 24    msg: "{{ '{}'.format(msg) }}"
 25  when: lp_nm_debug|bool
 26  tags: lp_nm_debug
 27
 28# Packages
 29- name: "nm: Install packages"
 30  ansible.builtin.import_role:
 31    name: vbotka.linux_lib
 32    tasks_from: install_package.yml
 33  when: lp_nm_install|bool
 34  vars:
 35    ll_ipkg_list: "{{ lp_nm_packages }}"
 36    ll_ipkg_state: "{{ lp_package_state }}"
 37    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 38    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 39    ll_debug: "{{ lp_nm_debug|bool }}"
 40  tags: lp_nm_packages
 41
 42# Override
 43- name: "nm: Create /etc/init/network-manager.override"
 44  ansible.builtin.template:
 45    src: network-manager-override.j2
 46    dest: /etc/init/network-manager.override
 47    owner: root
 48    group: root
 49    mode: '0644'
 50  when: not lp_nm_enable|bool
 51  tags: lp_nm_override
 52
 53- name: "nm: Remove /etc/init/network-manager.override"
 54  ansible.builtin.file:
 55    state: absent
 56    dest: /etc/init/network-manager.override
 57  when: lp_nm_enable|bool
 58  tags: lp_nm_override
 59
 60# Conf
 61- name: "nm: Configure {{ lp_nm_conf_path }}"
 62  community.general.ini_file:
 63    path: "{{ lp_nm_conf_path }}"
 64    section: "{{ item.section }}"
 65    option: "{{ item.key }}"
 66    value: "{{ item.val }}"
 67    no_extra_spaces: "{{ lp_nm_conf_no_extra_spaces }}"
 68    backup: "{{ lp_backup_conf }}"
 69    mode: '0644'
 70  loop: "{{ lp_nm_conf }}"
 71  tags: lp_nm_conf
 72
 73# Service
 74
 75- name: "nm: Services start/stop and enable/disable"
 76  ansible.builtin.service:
 77    name: "{{ srv_name }}"
 78    state: "{{ srv_stat }}"
 79    enabled: "{{ srv_enbl }}"
 80  loop: "{{ lp_nm_services }}"
 81  loop_control:
 82    label: "{{ srv_name }} state: {{ srv_stat }} enabled: {{ srv_enbl }}"
 83  vars:
 84    srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
 85    srv_enbl: "{{ lookup('vars', 'lp_' ~ item ~ '_enable', default=false) }}"
 86    srv_stat: "{{ lookup('vars', 'lp_' ~ item ~ '_state', default=default_stat) }}"
 87    default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
 88  tags: lp_nm_service
 89
 90# Mask service
 91- name: "nm: Services mask/unmask"
 92  ansible.builtin.command:
 93    cmd: "systemctl {{ srv_mask }} {{ srv_name }}"
 94  loop: "{{ lp_nm_services_mask }}"
 95  loop_control:
 96    label: "{{ srv_name }} {{ srv_mask }}"
 97  vars:
 98    srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
 99    srv_mask: "{{ lp_nm_mask|bool|ternary('mask', 'unmask') }}"
100  changed_when: false
101  tags: lp_nm_mask
102
103# EOF
104...

nfsd.yml

Synopsis: Configure nfsd.

Description of the task.

[tasks/nfsd.yml]

 1---
 2# linux_postinstall nfsd
 3
 4- name: "nfsd: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_nfsd_install: {{ lp_nfsd_install }}
 9      lp_nfsd_packages:
10        {{ lp_nfsd_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_backup_conf: {{ lp_backup_conf }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_nfsd_debug|bool
15  tags: lp_nfsd_debug
16
17- name: "nfsd: Install packages"
18  ansible.builtin.import_role:
19    name: vbotka.linux_lib
20    tasks_from: install_package.yml
21  when: lp_nfsd_install|bool
22  vars:
23    ll_ipkg_list: "{{ lp_nfsd_packages }}"
24    ll_ipkg_state: "{{ lp_package_state }}"
25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
27    ll_debug: "{{ lp_nfsd_debug|bool }}"
28  tags: lp_nfsd_packages
29
30- name: "nfsd: Configure exports"
31  ansible.builtin.template:
32    src: exports.j2
33    dest: /etc/exports
34    owner: root
35    group: root
36    mode: '0644'
37  notify: reload nfsd
38  tags: lp_nfsd_exports
39
40- name: "nfsd: Services start/stop and enable/disable"
41  ansible.builtin.service:
42    name: "{{ srv_name }}"
43    state: "{{ srv_stat }}"
44    enabled: "{{ srv_enbl }}"
45  loop: "{{ lp_nfsd_services }}"
46  loop_control:
47    label: "{{ srv_name }} state: {{ srv_stat }} enabled: {{ srv_enbl }}"
48  register: result
49  vars:
50    srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
51    srv_enbl: "{{ lookup('vars', 'lp_' ~ item ~ '_enable', default=false) }}"
52    srv_stat: "{{ lookup('vars', 'lp_' ~ item ~ '_state', default=default_stat) }}"
53    default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
54  tags: lp_nfsd_service
55
56- name: "nfsd: Debug service"
57  ansible.builtin.debug:
58    var: result
59  when: lp_nfsd_debug|bool
60  tags: lp_nfsd_service
61
62- name: "nfsd: Enable and start nfsd services"
63  ansible.builtin.service:
64    name: "{{ item }}"
65    enabled: true
66    state: started
67  loop: "{{ lp_nfsd_services }}"
68  when:
69    - lp_nfsd_enable|bool
70    - lp_nfsd_services|length > 0
71  tags: lp_nfsd_service
72
73- name: "nfsd: Stop and disable nfsd services"
74  ansible.builtin.service:
75    name: "{{ item }}"
76    enabled: false
77    state: stopped
78  loop: "{{ lp_nfsd_services }}"
79  when:
80    - not lp_nfsd_enable|bool
81    - lp_nfsd_services|length > 0
82  tags: lp_nfsd_service
83
84# EOF
85...

packages.yml

Synopsis: Manage packages.

Dynamic variables (4)

TBD

Debug (13)

TBD

Install packages automatically (41)

If enabled (52) and not empty (53) import install_package.yml (44) from the role vbotka.linux_lib (43). Flatten and filter unique items in the lists my_packages_auto (46). Set it to the mandatory variable ll_ipkg_list. Optionally, set other variables (47-50).

Install packages (56)

If not empty (66) TBD

Remove packages (69)

TBD

[tasks/packages.yml]

 1---
 2# linux_postinstall packages
 3
 4- name: "packages: Instantiate dynamic variables"
 5  set_fact:
 6    my_packages_install: "{{ my_packages_install }}"
 7    my_packages_lists: "{{ my_packages_lists }}"
 8    my_packages_auto: "{{ my_packages_auto }}"
 9  tags:
10    - lp_packages_debug
11    - lp_packages_auto
12
13- name: "packages: Debug (lp_packages_debug={{ lp_packages_debug }})"
14  vars:
15    msg: |-
16      ansible_os_family: {{ ansible_os_family }}
17      lp_packages_auto: {{ lp_packages_auto }}
18      lp_package_state: {{ lp_package_state }}
19      lp_packages_autoremove: {{ lp_packages_autoremove|bool }}
20      lp_packages_rescue_end_host: {{ lp_packages_rescue_end_host|bool }}
21
22      lp_packages_selections_preinstall:
23        {{ lp_packages_selections_preinstall|to_yaml(indent=2)|indent(2) }}
24      lp_packages_install:
25        {{ lp_packages_install|to_nice_yaml(indent=2)|indent(2) }}
26      lp_packages_remove:
27        {{ lp_packages_remove|to_nice_yaml(indent=2)|indent(2) }}
28      lp_packages_selections_postinstall:
29        {{ lp_packages_selections_postinstall|to_nice_yaml(indent=2)|indent(2) }}
30      my_packages_install:
31        {{ my_packages_install|to_yaml(indent=2)|indent(2) }}
32      my_packages_lists:
33        {{ my_packages_lists|to_yaml(indent=2)|indent(2) }}
34      my_packages_auto:
35        {{ my_packages_auto|to_yaml(indent=2)|indent(2) }}
36  ansible.builtin.debug:
37    msg: "{{ '{}'.format(msg) }}"
38  when: lp_packages_debug|bool
39  tags: lp_packages_debug
40
41- name: "packages: Auto install"
42  ansible.builtin.import_role:
43    name: vbotka.linux_lib
44    tasks_from: install_package.yml
45  vars:
46    ll_ipkg_list: "{{ my_packages_auto|flatten|unique }}"
47    ll_ipkg_state: "{{ lp_package_state }}"
48    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
49    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
50    ll_debug: "{{ lp_packages_debug|bool }}"
51  when:
52    - lp_packages_auto|bool
53    - my_packages_auto|flatten|length > 0
54  tags: lp_packages_auto
55
56- name: "packages: Install"
57  ansible.builtin.import_role:
58    name: vbotka.linux_lib
59    tasks_from: install_package.yml
60  vars:
61    ll_ipkg_list: "{{ lp_packages_install }}"
62    ll_ipkg_state: "{{ lp_package_state }}"
63    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
64    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
65    ll_debug: "{{ lp_packages_debug|bool }}"
66  when: lp_packages_install|length > 0
67  tags: lp_packages_install
68
69- name: "packages: Remove"
70  ansible.builtin.package:
71    name: "{{ item }}"
72    state: "{{ lp_package_state_remove }}"
73  loop: "{{ lp_packages_remove }}"
74  register: result
75  retries: "{{ lp_install_retries }}"
76  delay: "{{ lp_install_delay }}"
77  until: result is succeeded
78  tags: lp_packages_remove
79
80- name: "packages: Debug result"
81  ansible.builtin.debug:
82    var: result
83  when: lp_packages_debug|bool
84  tags: lp_packages_remove
85
86# EOF
87...

passwords.yml

Synopsis: Configure passwords.

Description of the task.

[tasks/passwords.yml]

  1---
  2# linux_postinstall passwords
  3
  4- name: "passwords: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_passwords_fail_gracefully: {{ lp_passwords_fail_gracefully }}
  9      lp_passwords_update_password: {{ lp_passwords_update_password }}
 10      lp_users:
 11      {% if lp_passwords_debug_classified|bool %}
 12        {{ lp_users|default([])|to_nice_yaml(indent=2)|indent(2) }}
 13      {% else %}
 14      {% for user in lp_users|default([]) %}
 15        - userpass: ************
 16      {% for k,v in user.items() %}
 17      {% if k not in ['userpass'] %}
 18          {{ k }}: {{ v }}
 19      {% endif %}
 20      {% endfor %}
 21      {% endfor %}
 22      {% endif %}
 23
 24      lp_passwordstore: {{ lp_passwordstore }}
 25      lp_passwordstore_install: {{ lp_passwordstore_install }}
 26      lp_passwordstore_debug: {{ lp_passwordstore_debug }}
 27      lp_passwordstore_backup: {{ lp_passwordstore_backup }}
 28      lp_passwordstore_create: {{ lp_passwordstore_create }}
 29      lp_passwordstore_length: {{ lp_passwordstore_length }}
 30      lp_passwordstore_nosymbols: {{ lp_passwordstore_nosymbols }}
 31      lp_passwordstore_overwrite: {{ lp_passwordstore_overwrite }}
 32      lp_passwordstore_passwordstore: {{ lp_passwordstore_passwordstore }}
 33      lp_passwordstore_returnall : {{ lp_passwordstore_returnall }}
 34      lp_passwordstore_subkey: {{ lp_passwordstore_subkey }}
 35      lp_passwordstore_idempotent_password_hash: {{ lp_passwordstore_idempotent_password_hash }}
 36      lp_passwordstore_packages:
 37        {{ lp_passwordstore_packages|to_nice_yaml(indent=2)|indent(2) }}
 38  ansible.builtin.debug:
 39    msg: "{{ '{}'.format(msg) }}"
 40  when: lp_passwords_debug|bool
 41  tags: lp_passwords_debug
 42
 43- name: "passwords: Passwordstore"
 44  block:
 45
 46    - name: "passwords: Passwordstore: Install packages"
 47      ansible.builtin.package:
 48        name: "{{ item }}"
 49      loop: "{{ lp_passwordstore_packages + lp_gpg_packages + lp_gpg_packages_extra }}"
 50      delegate_to: localhost
 51      run_once: true
 52      when: lp_passwordstore_install|bool
 53
 54    - name: "passwords: Passwordstore: Retrieve, create, or update userpass"
 55      ansible.builtin.include_role:
 56        name: vbotka.ansible_lib
 57        tasks_from: al_pws_user_host.yml
 58      vars:
 59        al_pws_debug: "{{ lp_passwordstore_debug }}"
 60        al_pws_backup: "{{ lp_passwordstore_backup }}"
 61        al_pws_create: "{{ lp_passwordstore_create }}"
 62        al_pws_length: "{{ lp_passwordstore_length }}"
 63        al_pws_nosymbols: "{{ lp_passwordstore_nosymbols }}"
 64        al_pws_overwrite: "{{ lp_passwordstore_overwrite }}"
 65        al_pws_passwordstore: "{{ lp_passwordstore_passwordstore }}"
 66        al_pws_returnall: "{{ lp_passwordstore_returnall }}"
 67        al_pws_subkey: "{{ lp_passwordstore_subkey }}"
 68        al_pws_idempotent_password_hash: "{{ lp_passwordstore_idempotent_password_hash }}"
 69        al_pws_query: "{{ lp_users }}"
 70      register: result
 71
 72    - name: "passwords: Passwordstore: Create empty list my_passwords"
 73      ansible.builtin.set_fact:
 74        my_passwords: []
 75      no_log: true  # no-log-password password should not be logged.
 76
 77    - name: "passwords: Passwordstore: Create my_passwords"
 78      ansible.builtin.set_fact:
 79        my_passwords: "{{ my_passwords +
 80                          [item|dict2items|
 81                          rejectattr('key', 'equalto', 'userpass')|
 82                          list|items2dict|
 83                          combine({'update_password': lp_passwords_update_password})] }}"
 84      loop: "{{ al_pws_query_result }}"
 85      loop_control:
 86        label: "{{ item.name }}"
 87      no_log: true  # no-log-password password should not be logged.
 88
 89    - name: "passwords: Passwordstore: Debug my_passwords"
 90      ansible.builtin.debug:
 91        var: my_passwords
 92      when: lp_passwords_debug|bool
 93
 94    - name: "passwords:  Passwordstore: Include users"
 95      ansible.builtin.include_tasks:
 96        file: users.yml
 97        apply:
 98          tags: lp_passwords_passwordstore
 99      vars:
100        lp_users: "{{ my_passwords }}"
101
102  rescue:
103
104    - name: "passwords: Passwordstore: Debug fail"
105      ansible.builtin.debug:
106        var: result
107      when: lp_passwords_debug_classified|bool
108
109    - name: "passwords: Passwordstore: Fail"
110      ansible.builtin.fail:
111        msg: '[ERR] Passwordstore failed.'
112      when: not lp_passwords_fail_gracefully|bool
113
114  when: lp_passwordstore|bool
115  tags: lp_passwords_passwordstore
116
117#  EOF
118...

pm_utils.yml

Synopsis: Configure pm_utils.

Description of the task.

[tasks/pm_utils.yml]

 1---
 2# linux_postinstall pm_utils
 3
 4# TODO:
 5# 1) add variables: lp_pm_powerd, lp_pm_configd
 6# 2) add templates: pm-powerd.j2, pm-configd.j2
 7# 3) add cases: resume, thaw, suspend, hibernate
 8# 4) install pm_utils
 9
10- name: "pm_utils: Configure /etc/pm/sleep.d"
11  ansible.builtin.template:
12    src: pm-sleepd.j2
13    dest: "/etc/pm/sleep.d/{{ item.value.file }}"
14    owner: root
15    group: root
16    mode: '0755'
17    backup: "{{ lp_backup_conf }}"
18  with_dict: "{{ lp_pm_sleepd|default({}) }}"
19  when: item.value.file|length > 0
20
21# EOF
22...

postfix.yml

Synopsis: Configure postfix.

Description of the task.

[tasks/postfix.yml]

 1---
 2# linux_postinstall postfix
 3
 4- name: "postfix: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_postfix_install: {{ lp_postfix_install }}
 9      lp_postfix_enable: {{ lp_postfix_enable }}
10      lp_postfix_flush_handlers: {{ lp_postfix_flush_handlers }}
11      lp_postfix_rescue_end_host: {{ lp_postfix_rescue_end_host }}
12      lp_postfix_service: {{ lp_postfix_service }}
13      lp_postfix_main_conf:
14        {{ lp_postfix_main_conf|to_yaml(indent=2)|indent(2) }}
15      lp_postfix_packages:
16        {{ lp_postfix_packages|to_nice_yaml(indent=2)|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_postfix_debug|bool
21  tags: lp_postfix_debug
22
23- name: "postfix: Install packages"
24  ansible.builtin.import_role:
25    name: vbotka.linux_lib
26    tasks_from: install_package.yml
27  when: lp_postfix_install|bool
28  vars:
29    ll_ipkg_list: "{{ lp_postfix_packages }}"
30    ll_ipkg_state: "{{ lp_package_state }}"
31    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
32    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
33    ll_debug: "{{ lp_postfix_debug|bool }}"
34  tags: lp_postfix_packages
35
36- name: "chrony: Configure, enable, start, or disable postfix"
37  block:
38
39    - name: "postfix: Configure /etc/postfix/main.cf"
40      ansible.builtin.lineinfile:
41        dest: /etc/postfix/main.cf
42        regexp: '^\s*{{ item.key }}\s*=\s*(.*)$'
43        line: "{{ item.key }} = {{ item.value }}"
44        backup: "{{ lp_backup_conf }}"
45        create: true
46        mode: '0644'
47      loop: "{{ lp_postfix_main_conf }}"
48      loop_control:
49        label: "{{ item.key }}: {{ item.value }}"
50      notify: reload postfix
51      tags: lp_postfix_conf
52
53    - name: "postfix: Service {{ state }} and {{ enable }}"
54      ansible.builtin.service:
55        name: "{{ lp_postfix_service }}"
56        state: "{{ state }}"
57        enabled: "{{ enabled }}"
58      register: result
59      vars:
60        enabled: "{{ lp_postfix_enable|bool|d(false) }}"
61        state: "{{ lp_postfix_state|d(default_state) }}"
62        default_state: "{{ enabled|ternary('started', 'stopped') }}"
63        enable: "{{ enabled|ternary('enabled', 'disabled') }}"
64      tags: lp_postfix_service
65
66    - name: "postfix: Debug service"
67      ansible.builtin.debug:
68        var: result
69      when: lp_postfix_debug|bool
70
71  rescue:
72
73    - name: "postfix: Print errors"
74      ansible.builtin.debug:
75        msg: |
76          [ERR] task {{ ansible_failed_task.name }} failed. End host.
77          ansible_failed_task:
78            {{ ansible_failed_task|to_yaml(indent=2)|indent(2) }}
79          ansible_failed_result:
80            {{ ansible_failed_result|to_yaml(indent=2)|indent(2) }}
81
82    - name: "postfix: End host"
83      ansible.builtin.meta: end_host
84      when:
85        - lp_postfix_rescue_end_host|bool
86        - not ansible_check_mode
87
88    - name: "postfix: Clear host errors"
89      ansible.builtin.meta: clear_host_errors
90
91- name: "postfix: Flush handlers"
92  ansible.builtin.meta: flush_handlers
93  when: lp_postfix_flush_handlers|bool
94
95# EOF
96...

rc_local.yml

Synopsis: Configure rc_local.

Description of the task.

[tasks/rc_local.yml]

 1---
 2# linux_postinstall rc_local
 3
 4- name: "rc_local: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_rc_local_service: {{ lp_rc_local_service }}
 9      lp_rc_local_state: {{ lp_rc_local_state }}
10      lp_rc_local_template: {{ lp_rc_local_template }}
11      lp_rc_local_file: {{ lp_rc_local_file }}
12      lp_rc_local_owner: {{ lp_rc_local_owner }}
13      lp_rc_local_group: {{ lp_rc_local_group }}
14      lp_rc_local_mode: {{ lp_rc_local_mode }}
15      lp_rc_local_content:
16        {{ lp_rc_local_content|indent(2) }}
17      lp_backup_conf: {{ lp_backup_conf }}
18  ansible.builtin.debug:
19    msg: "{{ '{}'.format(msg) }}"
20  when: lp_rc_local_debug|bool
21  tags: lp_rc_local_debug
22
23- name: "rc_local: Manage service {{ lp_rc_local_service }}.service"
24  ansible.builtin.service:
25    name: "{{ lp_rc_local_service }}"
26    state: "{{ lp_rc_local_state }}"
27  tags: lp_rc_local_service
28
29- name: "rc_local: Create /etc/rc.local"
30  ansible.builtin.template:
31    src: "{{ lp_rc_local_template }}"
32    dest: "{{ lp_rc_local_file }}"
33    owner: "{{ lp_rc_local_owner }}"
34    group: "{{ lp_rc_local_group }}"
35    mode: "{{ lp_rc_local_mode }}"
36    backup: "{{ lp_backup_conf }}"
37  notify: restart rc-local
38  tags: lp_rc_local_file
39
40# EOF
41...

reboot.yml

Synopsis: Configure reboot.

Description of the task.

[tasks/reboot.yml]

 1---
 2# linux_postinstall reboot
 3
 4- name: "reboot Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_reboot_force: {{ lp_reboot_force }}
 9      lp_reboot_required_ignore: {{ lp_reboot_required_ignore }}
10      lp_reboot_required_file: {{ lp_reboot_required_file }}
11      lp_reboot_command: {{ lp_reboot_command }}
12      lp_reboot_wait_connect_timeout: {{ lp_reboot_wait_connect_timeout }}
13      lp_reboot_wait_sleep: {{ lp_reboot_wait_sleep }}
14      lp_reboot_wait_delay: {{ lp_reboot_wait_delay }}
15      lp_reboot_wait_timeout: {{ lp_reboot_wait_timeout }}
16  ansible.builtin.debug:
17    msg: "{{ '{}'.format(msg) }}"
18  when: lp_reboot_debug|bool
19  tags: lp_reboot_debug
20
21- name: "reboot: Debian test {{ lp_reboot_required_file }}"
22  block:
23    - name: "reboot: Stat {{ lp_reboot_required_file }}"
24      ansible.builtin.stat:
25        path: "{{ lp_reboot_required_file }}"
26      register: reboot_required_file_status
27    - name: "reboot: Set reboot_required"
28      ansible.builtin.set_fact:
29        reboot_required: "{{ reboot_required_file_status.exists|
30                             default(false) }}"
31  when: ansible_os_family == 'Debian'
32
33- name: "reboot: RedHat test {{ lp_reboot_required_command }}"
34  block:
35    - name: "reboot: Run {{ lp_reboot_required_command }}"
36      ansible.builtin.command:
37        cmd: >
38          {{ lp_reboot_required_command }}
39      register: reboot_required_cmd_status
40    - name: "reboot: Set reboot_required"
41      ansible.builtin.set_fact:
42        reboot_required: "{{ (reboot_required_cmd_status.rc != 0)|
43                              ternary(true, false) }}"
44  when: ansible_os_family == 'RedHat'
45
46- name: "reboot: Debug reboot_required"
47  ansible.builtin.debug:
48    var: reboot_required
49  when: lp_reboot_debug|bool
50
51- name: "reboot: Reboot and wait for connection"
52  ansible.builtin.reboot:
53    connect_timeout: "{{ lp_reboot_wait_connect_timeout }}"
54    post_reboot_delay: "{{ lp_reboot_wait_delay }}"
55    reboot_timeout: "{{ lp_reboot_wait_timeout }}"
56  when: (reboot_required|default(false) and (not lp_reboot_required_ignore)) or
57        lp_reboot_force|bool
58
59# - name: "reboot: Reboot and wait for connection"
60#   block:
61#     - name: "reboot: Reboot"  # noqa 305
62#       shell: "{{ lp_reboot_command }}"
63#       async: 1
64#       poll: 0
65#     - name: "reboot: Wait for connection"
66#       wait_for_connection:
67#         connect_timeout: "{{ lp_reboot_wait_connect_timeout }}"
68#         sleep: "{{ lp_reboot_wait_sleep }}"
69#         delay: "{{ lp_reboot_wait_delay }}"
70#         timeout: "{{ lp_reboot_wait_timeout }}"
71#   when: (reboot_required|default(false) and
72#         (not lp_reboot_required_ignore)) or lp_reboot_force
73
74# EOF
75...

repos.yml

Synopsis: Configure repos.

Description of the task.

[tasks/repos.yml]

 1---
 2# linux_postinstall repos
 3
 4- name: "repos: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_repos_keys:
 9        {{ lp_repos_keys|to_nice_yaml(indent=2)|indent(2) }}
10      lp_repos:
11        {{ lp_repos|to_nice_yaml(indent=2)|indent(2) }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_repos_debug|bool
15  tags: lp_repos_debug
16
17- name: "repos: Manage repo signing keys"
18  ansible.builtin.apt_key:
19    data: "{{ item.data|default(omit) }}"
20    file: "{{ item.file|default(omit) }}"
21    id: "{{ item.id|default(omit) }}"
22    keyring: "{{ item.keyring|default(omit) }}"
23    keyserver: "{{ item.keyserver|default(omit) }}"
24    state: "{{ item.state|default(omit) }}"
25    url: "{{ item.url|default(omit) }}"
26    validate_certs: "{{ item.validate_certs|default(omit) }}"
27  loop: "{{ lp_repos_keys }}"
28  register: result
29  retries: "{{ lp_install_retries }}"
30  until: result is succeeded
31  delay: "{{ lp_install_delay }}"
32  tags: lp_repos_keys_manage
33
34- name: "repos: Manage repositories"
35  ansible.builtin.apt_repository:
36    codename: "{{ item.codename|default(omit) }}"
37    filename: "{{ item.filename|default(omit) }}"
38    mode: "{{ item.mode|default(omit) }}"
39    repo: "{{ item.repo|mandatory }}"
40    state: "{{ item.state|default(omit) }}"
41    update_cache: "{{ item.update_cache|default(omit) }}"
42    validate_certs: "{{ item.validate_certs|default(omit) }}"
43  loop: "{{ lp_repos }}"
44  loop_control:
45    label: "{{ item.repo }}"
46  tags: lp_repos_manage
47
48# EOF
49...

resolvconf.yml

Synopsis: Configure resolvconf.

Description of the task.

[tasks/resolvconf.yml]

 1---
 2# linux_postinstall resolvconf
 3
 4- name: "resolvconf: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_resolvconf_service: {{ lp_resolvconf_service }}
 9      lp_resolvconf_enable: {{ lp_resolvconf_enable }}
10      lp_package_state: {{ lp_package_state }}
11      lp_resolvconf_install: {{ lp_resolvconf_install }}
12      lp_resolvconf_packages:
13        {{ lp_resolvconf_packages|to_nice_yaml(indent=2)|indent(2) }}
14      lp_resolvconf_conf_owner: {{ lp_resolvconf_conf_owner }}
15      lp_resolvconf_conf_group: {{ lp_resolvconf_conf_group }}
16      lp_resolvconf_conf_mode: {{ lp_resolvconf_conf_mode }}
17      lp_resolvconf_conf:
18        {{ lp_resolvconf_conf|to_nice_yaml(indent=2)|indent(2) }}
19      lp_resolvconf_confd_head:
20        {{ lp_resolvconf_confd_head|to_yaml(indent=2)|indent(2) }}
21      lp_backup_conf: {{ lp_backup_conf }}
22  ansible.builtin.debug:
23    msg: "{{ '{}'.format(msg) }}"
24  when: lp_resolvconf_debug|bool
25  tags: lp_resolvconf_debug
26
27- name: "resolvconf: Install packages"
28  ansible.builtin.import_role:
29    name: vbotka.linux_lib
30    tasks_from: install_package.yml
31  when: lp_resolvconf_install|bool
32  vars:
33    ll_ipkg_list: "{{ lp_resolvconf_packages }}"
34    ll_ipkg_state: "{{ lp_package_state }}"
35    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
36    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
37    ll_debug: "{{ lp_resolvconf_debug|bool }}"
38  tags: lp_resolvconf_packages
39
40- name: "resolvconf: Configure lp_resolvconf_conf"
41  ansible.builtin.template:
42    src: "{{ item.src }}"
43    dest: "{{ item.dest }}"
44    owner: "{{ item.owner }}"
45    group: "{{ item.group }}"
46    mode: "{{ item.mode }}"
47    backup: "{{ lp_backup_conf }}"
48  loop: "{{ lp_resolvconf_conf }}"
49  loop_control:
50    label: "{{ item.dest }}"
51  notify: restart resolvconf
52  tags: lp_resolvconf_confd_head
53
54- name: "resolvconf: Service {{ state }} and {{ enable }}"
55  ansible.builtin.service:
56    name: "{{ lp_resolvconf_service }}"
57    state: "{{ state }}"
58    enabled: "{{ enabled }}"
59  register: result
60  vars:
61    enabled: "{{ lp_resolvconf_enable|bool|d(false) }}"
62    state: "{{ lp_resolvconf_state|d(default_state) }}"
63    default_state: "{{ enabled|ternary('started', 'stopped') }}"
64    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
65  tags: lp_resolvconf_service
66
67- name: "resolvconf: Debug service"
68  ansible.builtin.debug:
69    var: result
70  when: lp_resolvconf_debug|bool
71  tags: lp_resolvconf_service
72
73# EOF
74...

service.yml

Synopsis: Manage services.

Debug (6)

TBD

Sanity (24)

TBD

Automatic management of listed services (60)

If not empty (86) iterate lp_service_auto (69). Skip when lp_ ~ item (76) is not True (73). Get (77) and use (65) the OS dependent name of the service. Get (78) and set (66) the service enablement. Get (80) and set (66) the service state. Use default_stat (81) if lp_*_state does not exist. Get (79) and use the module (68).

Manual management of listed services (89)

If not empty (100) iterate lp_service in the included tasks (98). If auto (95) set the module (94) to ansible_service_mgr (OS native service manager found by the setup). TBC

Flush handlers (103)

Automatic management of listed services notifies ansible_service_mgr (74). See the tasks service-*.yml how manual management options notify handlers.

[tasks/service.yml]

  1---
  2# linux_postinstall service
  3
  4# [TODO] add list of services, e.g. tlp and nm 'lp_' ~ item ~ '_services'
  5
  6- name: "service: Debug"
  7  vars:
  8    msg: |-
  9      ansible_os_family: {{ ansible_os_family }}
 10      ansible_service_mgr: {{ ansible_service_mgr }}
 11      lp_service_sanity: {{ lp_service_sanity }}
 12
 13      lp_service_module: {{ lp_service_module }}
 14      lp_service_module_valid: {{ lp_service_module_valid }}
 15      lp_service:
 16        {{ lp_service|to_nice_yaml(indent=2)|indent(2) }}
 17      lp_service_auto:
 18        {{ lp_service_auto|to_nice_yaml(indent=2)|indent(2) }}
 19  ansible.builtin.debug:
 20    msg: "{{ '{}'.format(msg) }}"
 21  when: lp_service_debug|bool
 22  tags: lp_service_debug
 23
 24- name: Sanity
 25  block:
 26
 27    - name: "service: Get service facts"
 28      ansible.builtin.service_facts:
 29
 30    - name: "service: Sanity lp_service_auto items are defined"
 31      ansible.builtin.assert:
 32        that: my_services_undef|length == 0
 33        fail_msg: "[ERR] Undefined services: {{ my_services_undef }}"
 34        success_msg: "[OK]  All service names in lp_service_auto are valid."
 35        quiet: "{{ lp_service_sanity_quiet }}"
 36      when: lp_service_auto|length > 0
 37      vars:
 38        my_services_alias: "{{ lp_service_auto }}"
 39
 40    - name: "service: Sanity lp_service names are defined"
 41      ansible.builtin.assert:
 42        that: my_services_undef|length == 0
 43        fail_msg: "[ERR] Undefined services: {{ my_services_undef }}"
 44        success_msg: "[OK]  All service names in lp_service are valid."
 45        quiet: "{{ lp_service_sanity_quiet }}"
 46      when: lp_service|length > 0
 47      vars:
 48        my_services_alias: "{{ lp_service|map(attribute='name') }}"
 49
 50    - name: "service: Sanity lp_service_module"
 51      ansible.builtin.assert:
 52        that: lp_service_module in lp_service_module_valid
 53        fail_msg: "[ERR] {{ lp_service_module }} not in {{ lp_service_module_valid }}"
 54        success_msg: "[OK]  {{ lp_service_module }} is valid value of lp_service_module."
 55        quiet: "{{ lp_service_sanity_quiet }}"
 56
 57  when: lp_service_sanity|bool
 58  tags: lp_service_sanity
 59
 60- name: Automatic management of listed services
 61  block:
 62
 63    - name: "service: Automatic management of listed services"
 64      ansible.builtin.service:
 65        name: "{{ srv_name }}"
 66        state: "{{ srv_stat }}"
 67        enabled: "{{ srv_enbl|bool }}"
 68        use: "{{ use_modl }}"
 69      loop: "{{ lp_service_auto }}"
 70      loop_control:
 71        label: "{{ srv_name }} enabled={{ srv_enbl }} state={{ srv_stat }} use={{ use_modl }}"
 72      register: result
 73      when: run_task
 74      notify: "reload {{ ansible_service_mgr }} daemon"
 75      vars:
 76        run_task: "{{ lookup('vars', 'lp_' ~ item, default=false) }}"
 77        srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
 78        srv_enbl: "{{ lookup('vars', 'lp_' ~ item ~ '_enable', default=false) }}"
 79        use_modl: "{{ lookup('vars', 'lp_' ~ item ~ '_module', default='auto') }}"
 80        srv_stat: "{{ lookup('vars', 'lp_' ~ item ~ '_state', default=default_stat) }}"
 81        default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
 82
 83    - name: "service: Debug"
 84      ansible.builtin.include_tasks: fn/service-debug.yml
 85
 86  when: lp_service_auto|length > 0
 87  tags: lp_service_auto
 88
 89- name: Manual management of listed services
 90  block:
 91
 92    - name: "service: Manual management set module auto"
 93      set_fact:
 94        lp_service_module: "{{ ansible_service_mgr }}"
 95      when: lp_service_module == 'auto'
 96
 97    - name: "service: Include {{ lp_service_module }}"
 98      include_tasks: "fn/service-{{ lp_service_module }}.yml"
 99
100  when: lp_service|length > 0
101  tags: lp_service_manual
102
103- name: "service: Flush handlers"
104  ansible.builtin.meta: flush_handlers
105  tags:
106    - lp_service_auto
107    - lp_service_manual
108
109# EOF
110...

service-service.yml

Synopsis: Configure service-service.

Description of the task.

[tasks/fn/service-service.yml]

 1---
 2# linux_postinstall function service-service
 3
 4- name: "service: Manual management of listed services"
 5  ansible.builtin.service:
 6    name: "{{ item.name }}"
 7    arguments: "{{ item.arguments|default(omit) }}"
 8    enabled: "{{ item.enabled|default(omit) }}"
 9    pattern: "{{ item.pattern|default(omit) }}"
10    runlevel: "{{ item.runlevel|default(omit) }}"
11    sleep: "{{ item.sleep|default(omit) }}"
12    state: "{{ item.state|default(omit) }}"
13    use: "{{ item.use|default(omit) }}"
14  loop: "{{ lp_service }}"
15  loop_control:
16    label: >-
17      {{ item.name }}
18      enabled={{ item.enabled|d('UNDEFINED') }}
19      state={{ item.state|d('UNDEFINED') }}
20      use={{ item.use|d('UNDEFINED') }}
21  register: result
22  notify: "reload {{ ansible_service_mgr }} daemon"
23
24- name: "service: Debug Manual management full results"
25  ansible.builtin.debug:
26    var: result
27  when: lp_service_debug2|d(false)|bool
28
29- name: "service: Debug Manual management selected results"
30  ansible.builtin.debug:
31    msg: |
32      {% for i in result.results %}
33      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
34      changed: {{ i.changed }}
35      name: {{ i.name|d('UNDEFINED') }}
36      enabled: {{ i.enabled|d('UNDEFINED') }}
37      state: {{ i.state|d('UNDEFINED') }}
38      msg: {{ i.msg|d('UNDEFINED') }}
39
40      invocation:
41        {{ i.invocation.module_args|to_nice_yaml(indent=2)|indent(2) }}
42      item:
43        {{ i.item|to_nice_yaml(indent=2)|indent(2) }}
44      {% endfor %}
45  when: lp_service_debug|bool
46
47# EOF
48...

service-systemd.yml

Synopsis: Configure service-systemd.

Description of the task.

[tasks/fn/service-systemd.yml]

 1---
 2# linux_postinstall function service-systemd
 3
 4# https://docs.ansible.com/ansible/latest/collections/ansible/builtin/systemd_service_module.html#notes
 5# Quoting from Notes: The order of execution when having multiple
 6# properties is to first enable/disable, then mask/unmask and then
 7# deal with service state. It has been reported that systemctl can
 8# behave differently depending on the order of operations if you do
 9# the same manually.
10
11- name: "service:systemd"
12  block:
13
14    - name: "service:systemd: enable/disable"
15      ansible.builtin.systemd:
16      loop: "{{ _enabld }}"
17      loop_control:
18        label: "{{ item.name }} enabled={{ enabled }}"
19      register: result
20      notify: reload systemd daemon
21    - name: "service:systemd: Debug"
22      ansible.builtin.include_tasks: fn/service-debug.yml
23      when: _enabld|length > 0
24    - name: "service:systemd: Flush handlers"
25      ansible.builtin.meta: flush_handlers
26      when: _enabld|length > 0
27
28    - name: "service:systemd: mask/unmask"
29      ansible.builtin.systemd:
30      loop: "{{ _masked }}"
31      loop_control:
32        label: "{{ item.name }} enabled={{ enabled }} masked={{ masked }}"
33      register: result
34      notify: reload systemd daemon
35    - name: "service:systemd: Debug"
36      ansible.builtin.include_tasks: fn/service-debug.yml
37      when: _masked|length > 0
38    - name: "service:systemd: Flush handlers"
39      ansible.builtin.meta: flush_handlers
40      when: _masked|length > 0
41
42    - name: "service:systemd: all"
43      ansible.builtin.systemd:
44      loop: "{{ lp_service }}"
45      loop_control:
46        label: "{{ item.name }} enabled={{ enabled }} masked={{ masked }} state={{ state }}"
47      register: result
48      notify: reload systemd daemon
49    - name: "service:systemd: Debug"
50      ansible.builtin.include_tasks: fn/service-debug.yml
51      when: lp_service|length > 0
52
53  module_defaults:
54
55    ansible.builtin.systemd:
56      name: "{{ item.name|default(omit) }}"
57      daemon_reexec: "{{ item.daemon_reexec|default(omit) }}"
58      daemon_reload: "{{ item.daemon_reload|default(omit) }}"
59      enabled: "{{ item.enabled|default(omit) }}"
60      force: "{{ item.force|default(omit) }}"
61      masked: "{{ item.masked|default(omit) }}"
62      no_block: "{{ item.no_block|default(omit) }}"
63      scope: "{{ item.scope|default(omit) }}"
64      state: "{{ item.state|default(omit) }}"
65
66  vars:
67
68    _enabld: "{{ lp_service|selectattr('enabled', 'defined')|
69                            ansible.utils.remove_keys(target=['masked', 'state']) }}"
70    _masked: "{{ lp_service|selectattr('masked', 'defined')|
71                            ansible.utils.remove_keys(target=['state']) }}"
72    enabled: "{{ item.enabled|d('UNDEFINED') }}"
73    masked: "{{ item.masked|d('UNDEFINED') }}"
74    state: "{{ item.state|d('UNDEFINED') }}"
75
76# EOF
77...

service-sysvinit.yml

Synopsis: Configure service-sysvinit.

Description of the task.

[tasks/fn/service-sysvinit.yml]

1---
2# linux_postinstall function service-sysvinit
3
4- name: "service:sysvinit"
5  ansible.builtin.debug:
6    msg: "[WARNING] Not implemented yet. End host."
7- ansible.builtin.meta: end_host

service-debug.yml

Synopsis: Configure service-debug.

Description of the task.

[tasks/fn/service-debug.yml]

 1---
 2# linux_postinstall function service-debug
 3
 4- name: "service: Debug management full results"
 5  ansible.builtin.debug:
 6    var: result
 7  when: lp_service_debug2|d(false)|bool
 8
 9- name: "service: Debug management selected results"
10  ansible.builtin.debug:
11    msg: |
12      {% for i in result.results %}
13      # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
14      changed: {{ i.changed }}
15      item:
16        {{ i.item|to_nice_yaml(indent=2)|indent(2) }}
17      {% if i.skipped|d(false) %}
18      skip_reason: {{ i.skip_reason }}
19      {% else %}
20      name: {{ i.name|d('UNDEFINED') }}
21      enabled: {{ i.enabled|d('UNDEFINED') }}
22      state: {{ i.state|d('UNDEFINED') }}
23      msg: {{ i.msg|d('UNDEFINED') }}
24      invocation:
25        {{ i.invocation.module_args|to_nice_yaml(indent=2)|indent(2) }}
26      {% endif %}
27      {% endfor %}
28  when: lp_service_debug|bool
29
30# EOF
31...

smart.yml

Synopsis: Configure smart.

Description of the task.

[tasks/smart.yml]

 1---
 2# linux_postinstall smart
 3
 4- name: "smart: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_smart_install: {{ lp_smart_install }}
 9      lp_smart_packages:
10        {{ lp_smart_packages|to_nice_yaml(indent=2)|indent(2) }}
11      lp_backup_conf: {{ lp_backup_conf }}
12  ansible.builtin.debug:
13    msg: "{{ '{}'.format(msg) }}"
14  when: lp_smart_debug|bool
15  tags: lp_smart_debug
16
17- name: "smart: Install packages"
18  ansible.builtin.import_role:
19    name: vbotka.linux_lib
20    tasks_from: install_package.yml
21  when: lp_smart_install|bool
22  vars:
23    ll_ipkg_list: "{{ lp_smart_packages }}"
24    ll_ipkg_state: "{{ lp_package_state }}"
25    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
26    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
27    ll_debug: "{{ lp_smart_debug|bool }}"
28  tags: lp_smart_packages
29
30- name: "smart: Configure {{ lp_smart_conf_file }}. Do not scan for devices"
31  ansible.builtin.lineinfile:
32    state: absent
33    dest: "{{ lp_smart_conf_file }}"
34    regexp: '^\s*DEVICESCAN\s*(.*)$'
35    owner: "{{ lp_smart_conf_owner }}"
36    group: "{{ lp_smart_conf_group }}"
37    mode: "{{ lp_smart_conf_mode }}"
38    backup: "{{ lp_backup_conf }}"
39    create: true
40  when: not lp_smart_devicescan|bool
41  notify: reload smart
42  tags: lp_smart_conf
43
44- name: "smart: Configure devices in {{ lp_smart_conf_file }}"
45  ansible.builtin.lineinfile:
46    dest: "{{ lp_smart_conf_file }}"
47    regexp: "{{ item.regexp }}"
48    line: "{{ item.line }}"
49    owner: "{{ lp_smart_conf_owner }}"
50    group: "{{ lp_smart_conf_group }}"
51    mode: "{{ lp_smart_conf_mode }}"
52    backup: "{{ lp_backup_conf }}"
53    create: true
54  loop: "{{ lp_smart_devices }}"
55  loop_control:
56    label: "{{ item.line }}"
57  notify: reload smart
58  tags: lp_smart_conf
59
60- name: "smart: Service {{ state }} and {{ enable }}"
61  ansible.builtin.service:
62    name: "{{ lp_smart_service }}"
63    state: "{{ state }}"
64    enabled: "{{ enabled }}"
65  register: result
66  vars:
67    enabled: "{{ lp_smart_enable|bool|d(false) }}"
68    state: "{{ lp_smart_state|d(default_state) }}"
69    default_state: "{{ enabled|ternary('started', 'stopped') }}"
70    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
71  tags: lp_smart_service
72
73- name: "smart: Debug service"
74  ansible.builtin.debug:
75    var: result
76  when: lp_smart_debug|bool
77  tags: lp_smart_service
78
79# EOF
80...

snap.yml

Synopsis: Configure snap.

Description of the task.

[tasks/snap.yml]

 1---
 2# linux_postinstall snap
 3
 4- name: "snap: Debug"
 5  ansible.builtin.debug:
 6    msg: Not implemented yet.
 7
 8# [TODO]
 9#
10# https://snapcraft.io/docs/getting-started
11# https://www.osnews.com/story/131714/disabling-snaps-in-ubuntu-20-04/
12# https://www.kevin-custer.com/blog/disabling-snaps-in-ubuntu-20-04/
13# https://askubuntu.com/questions/1204571/chromium-without-snap
14
15# EOF
16...

speechd.yml

Synopsis: Configure speechd.

Description of the task.

[tasks/speechd.yml]

 1---
 2# linux_postinstall speechd
 3
 4- name: "speechd: Debug"
 5  ansible.builtin.debug:
 6    msg: "lp_speechd_enable: {{ lp_speechd_enable }}"
 7  when: lp_speechd_debug|bool
 8
 9- name: "speechd: Service {{ state }} and {{ enable }}"
10  ansible.builtin.service:
11    name: "{{ lp_speechd_service }}"
12    state: "{{ state }}"
13    enabled: "{{ enabled }}"
14  register: result
15  vars:
16    enabled: "{{ lp_speechd_enable|bool|d(false) }}"
17    state: "{{ lp_speechd_state|d(default_state) }}"
18    default_state: "{{ enabled|ternary('started', 'stopped') }}"
19    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
20  tags: lp_speechd_service
21
22- name: "speechd: Debug service"
23  ansible.builtin.debug:
24    var: result
25  when: lp_speechd_debug|bool
26
27# EOF
28...

sshd.yml

Synopsis: Configure sshd.

Description of the task.

[tasks/sshd.yml]

 1---
 2# linux_postinstall sshd
 3
 4- name: "sshd: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_sshd_enable: {{ lp_sshd_enable }}
 9      lp_sshd_config_remove_duplicates: {{ lp_sshd_config_remove_duplicates }}
10      lp_sshd_config:
11        {{ lp_sshd_config|to_yaml(indent=2)|indent(2) }}
12      lp_backup_conf: {{ lp_backup_conf }}
13  ansible.builtin.debug:
14    msg: "{{ '{}'.format(msg) }}"
15  when: lp_sshd_debug|bool
16  tags: lp_sshd_debug
17
18- name: "sshd: Remove duplicate parameters from /etc/ssh/sshd_config"
19  ansible.builtin.replace:
20    dest: /etc/ssh/sshd_config
21    after: '^\s*{{ item.key }}(?!\S)'
22    regexp: '^\s*{{ item.key }}(?!\S).*$'
23    backup: "{{ lp_backup_conf }}"
24    validate: "{{ lp_sshd_path }} -t -f %s"
25  loop: "{{ lp_sshd_config }}"
26  loop_control:
27    label: "{{ item.key }}"
28  notify: reload sshd
29  when: lp_sshd_config_remove_duplicates|bool
30  tags: lp_sshd_config
31
32- name: "sshd: Configure /etc/ssh/sshd_config"
33  ansible.builtin.lineinfile:
34    dest: /etc/ssh/sshd_config
35    regexp: '^\s*{{ item.key }}(?!\S).*$'
36    line: "{{ item.key }} {{ item.value }}"
37    backup: "{{ lp_backup_conf }}"
38    validate: "{{ lp_sshd_path }} -t -f %s"
39  loop: "{{ lp_sshd_config }}"
40  loop_control:
41    label: "{{ item.key }}: {{ item.value }}"
42  notify: reload sshd
43  tags: lp_sshd_config
44
45- name: "sshd: Service {{ state }} and {{ enable }}"
46  ansible.builtin.service:
47    name: "{{ lp_sshd_service }}"
48    state: "{{ state }}"
49    enabled: "{{ enabled }}"
50  register: result
51  vars:
52    enabled: "{{ lp_sshd_enable|bool|d(false) }}"
53    state: "{{ lp_sshd_state|d(default_state) }}"
54    default_state: "{{ enabled|ternary('started', 'stopped') }}"
55    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
56  tags: lp_sshd_service
57
58- name: "sshd: Debug service"
59  ansible.builtin.debug:
60    var: result
61  when: lp_sshd_debug|bool
62  tags: lp_sshd_service
63
64# EOF
65...

ssh.yml

Synopsis: Configure ssh.

Description of the task.

[tasks/ssh.yml]

 1---
 2# linux_postinstall ssh
 3
 4- name: "ssh: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_ssh_config:
 9        {{ lp_ssh_config|to_yaml(indent=2)|indent(2) }}
10      lp_backup_conf: {{ lp_backup_conf }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_ssh_debug|bool
14  tags: lp_ssh_debug
15
16- name: "ssh: Configure /etc/ssh/ssh_config"
17  ansible.builtin.template:
18    src: ssh_config.j2
19    dest: /etc/ssh/ssh_config
20    backup: "{{ lp_backup_conf }}"
21    mode: '0644'
22  tags: lp_ssh_conf
23
24# EOF
25...

sudoers.yml

Synopsis: Configure sudoers.

Description of the task.

[tasks/sudoers.yml]

 1---
 2# linux_postinstall sudoers
 3
 4- name: "sudoers: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_sudoers_conf:
 9        {{ lp_sudoers_conf|to_yaml(indent=2)|indent(2) }}
10      lp_backup_conf: {{ lp_backup_conf }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_sudoers_debug|bool
14  tags: lp_sudoers_debug
15
16- name: "sudoers: Configure /etc/sudoers"
17  ansible.builtin.lineinfile:
18    path: /etc/sudoers
19    line: "{{ item.line }}"
20    state: "{{ item.state|default('present') }}"
21    backup: "{{ lp_backup_conf }}"
22    create: true
23    mode: '0440'
24  loop: "{{ lp_sudoers_conf }}"
25  tags: lp_sudoers_conf
26
27- name: "sudoers: Configure /etc/sudoers.d/01"
28  ansible.builtin.lineinfile:
29    path: /etc/sudoers.d/01
30    line: "{{ item }}"
31    owner: "{{ lp_sudoers_owner }}"
32    group: "{{ lp_sudoers_group }}"
33    mode: "{{ lp_sudoers_mode }}"
34    backup: "{{ lp_backup_conf }}"
35    create: true
36  loop: "{{ lp_sudoers_01 }}"
37  tags: lp_sudoers_dconf
38
39# EOF
40...

swap.yml

Synopsis: Configure swap.

Description of the task.

[tasks/swap.yml]

  1---
  2# linux_postinstall swap
  3
  4- name: "swap: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_swap: {{ lp_swap }}
  9      lp_swap_enable: {{ lp_swap_enable }}
 10      lp_swap_sanity: {{ lp_swap_sanity }}
 11      lp_swap_flush_handlers: {{ lp_swap_flush_handlers }}
 12      lp_swap_rescue_end_host: {{ lp_swap_rescue_end_host }}
 13      lp_swap_file: {{ lp_swap_file|default("UNDEFINED") }}
 14      lp_swap_size: {{ lp_swap_size|default("UNDEFINED") }}
 15      lp_swap_stsize: {{ lp_swap_stsize|default("UNDEFINED") }}
 16      lp_backup_conf: {{ lp_backup_conf }}
 17  ansible.builtin.debug:
 18    msg: "{{ '{}'.format(msg) }}"
 19  when: lp_swap_debug|bool
 20  tags: lp_swap_debug
 21
 22- name: "swap: Sanity"
 23  block:
 24
 25    - name: "swap: sanity: Defined lp_swap_file"
 26      ansible.builtin.assert:
 27        that: lp_swap_file is defined
 28        fail_msg: "[ERR] Variable lp_swap_file must be defined."
 29
 30    - name: "swap: sanity: Defined lp_swap_size and lp_swap_stsize"
 31      ansible.builtin.assert:
 32        that: lp_swap_size is defined and lp_swap_stsize is defined
 33        fail_msg: "[ERR] Variables lp_swap_size and lp_swap_stsize must be defined."
 34      when: lp_swap_enable|bool
 35
 36  when: lp_swap_sanity|bool
 37  tags: lp_swap_sanity
 38
 39- name: "swap: Create, change, or remove {{ lp_swap_file }}"
 40  block:
 41
 42    - name: "swap: Create swapfile {{ lp_swap_file }}"
 43      ansible.builtin.shell:
 44        cmd: >
 45          sh -c
 46          'if [ ! -e {{ lp_swap_file }} ];
 47          then printf "create";
 48          fi'
 49      register: command_result
 50      changed_when: command_result.stdout == 'create'
 51      notify: create and mount swap file
 52      tags: lp_swap_swapfile
 53
 54    - name: "swap: Change swapfile {{ lp_swap_file }}"
 55      ansible.builtin.shell:
 56        cmd: >
 57          sh -c
 58          'if [ -e {{ lp_swap_file }} ] &&
 59          [ "`stat --format '%s' {{ lp_swap_file }}`" -ne "{{ lp_swap_stsize }}" ];
 60          then printf "change";
 61          fi'
 62      register: command_result
 63      changed_when: command_result.stdout == 'change'
 64      notify: change and mount swap file
 65      tags: lp_swap_swapfile
 66
 67    - name: "swap: Create swap entry in /etc/fstab"
 68      ansible.posix.mount:
 69        path: none
 70        src: "{{ lp_swap_file }}"
 71        fstype: swap
 72        opts: sw
 73        passno: '0'
 74        dump: '0'
 75        state: present
 76        backup: "{{ lp_backup_conf }}"
 77      when: lp_swap_enable|bool
 78      tags: lp_swap_fstab
 79
 80    - name: "swap: Remove swap entry from /etc/fstab"
 81      ansible.posix.mount:
 82        path: none
 83        src: "{{ lp_swap_file }}"
 84        fstype: swap
 85        opts: sw
 86        passno: '0'
 87        dump: '0'
 88        state: absent
 89        backup: "{{ lp_backup_conf }}"
 90      notify: remove swap file
 91      when: not lp_swap_enable|bool
 92      tags: lp_swap_swapfile
 93
 94  rescue:
 95
 96    - name: "swap: Print errors"
 97      ansible.builtin.debug:
 98        msg: |
 99          [ERR] task {{ ansible_failed_task.name }} failed. End host.
100          ansible_failed_task:
101            {{ ansible_failed_task|to_yaml(indent=2)|indent(2)
102          ansible_failed_result:
103            {{ ansible_failed_result|to_yaml(indent=2)|indent(2)
104
105    - name: "swap: End host"
106      ansible.builtin.meta: end_host
107      when: lp_swap_rescue_end_host|bool
108
109- name: "swap: Flush handlers"
110  ansible.builtin.meta: flush_handlers
111  when: lp_swap_flush_handlers|bool
112
113# EOF
114...

sysctl.yml

Synopsis: Configure sysctl.

Description of the task.

[tasks/sysctl.yml]

 1---
 2# linux_postinstall sysctl
 3
 4- name: "sysctl: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_sysctl_no_extra_spaces: {{ lp_sysctl_no_extra_spaces }}
 9      lp_sysctl_vars:
10        {{ lp_sysctl_vars|to_yaml(indent=2)|indent(2) }}
11  ansible.builtin.debug:
12    msg: "{{ '{}'.format(msg) }}"
13  when: lp_sysctl_debug|bool
14  tags: lp_sysctl_debug
15
16- name: "sysctl: Configure /etc/sysctl.conf"
17  ansible.builtin.lineinfile:
18    dest: /etc/sysctl.conf
19    regexp: '^\s*{{ item.var }}\s*=(.*)$'
20    line: "{{ item.var }}{{ lp_sysctl_extra_space }}={{ lp_sysctl_extra_space }}{{ item.value }}"
21    backup: "{{ lp_backup_conf }}"
22  loop: "{{ lp_sysctl_vars }}"
23  loop_control:
24    label: "{{ item.var }}: {{ item.value }}"
25  notify: load sysctl settings
26
27# EOF
28...

systemd.yml

Synopsis: Configure systemd.

Set my_services (13)

Iterate lp_systemd_unit (18) and create dictionary my_services. It will be used by handlers to decide if and how to reload or restart services

1my_services:
2  <name>.<type|default(lp_systemd_unit_type)>:
3    state: <control.state|default('started')>
4    restart_or_reload: <control.restart_or_reload|default('reload')>
5...

Debug (31)

To see the values of the variables run the playbook with options -t lp_systemd_debug -e lp_systemd_debug=True (54).

Packages (58)

Install packages when enabled (62).

Configure systemd (72)

Use community.general.ini_file (73) to configure files (74) in loop with_subelements (84-86). Register lp_systemd_conf_changes (83) and notify handler reload systemd conf (89).

1lp_systemd_conf:
2  <path>:
3    owner: <owner|default(lp_systemd_owner)>
4    group: <group|default(lp_systemd_group)>
5    mode: <mode|default(lp_systemd_mode)>
6    reload_service: <service to be reloaded or restarted by handler>
7    conf:
8      - {section: <section>, key: <option>, val: <value>}
9  ...

Create units (114)

Use `` ansible.builtin.template`` (115) to create units in the loop (123) when state == 'create' (127). Register lp_systemd_unit_create_changes (122) and notify handler reload systemd units (126).

1lp_systemd_unit:
2  - name: <name of the service>
3    type: <type of the service|default(lp_systemd_unit_type)>
4    path: <directory of the units|default(lp_systemd_unit_dir)>
5    owner: <owner|default(lp_systemd_owner)>
6    group: <group|default(lp_systemd_group)>
7    mode: <mode|default(lp_systemd_mode)>
8    state: <'create' or 'absent'|default('noop')>
9  ...

Remove units (136)

<TBD>

Control units (153)

 1lp_systemd_unit:
 2  - name: <name of the service>
 3    type: <type of the service|default(lp_systemd_unit_type)>
 4    control:
 5      daemon_reexec: <daemon_reexec|default(omit)>
 6      daemon_reload: <daemon_reload|default(omit)>
 7      enabled: <enabled|default(systemd_units_enabled)>
 8      force: <force|default(omit)>
 9      masked: <masked|default(omit)>
10      no_block: <no_block|default(omit)>
11      scope: <scope|default(omit)>
12      state: <state|default(omit)>

See also

<TBD>

[tasks/systemd.yml]

  1---
  2# linux_postinstall systemd
  3
  4# Vars
  5- name: "systemd: Create empty dictionary my_services"
  6  ansible.builtin.set_fact:
  7    my_services: {}
  8  tags:
  9    - lp_systemd_debug
 10    - lp_systemd_packages
 11    - lp_systemd_conf
 12
 13- name: "systemd: Set my_services"
 14  ansible.builtin.set_fact:
 15    my_services: "{{ my_services|
 16                     combine({my_name: {'state': my_state,
 17                                        'restart_or_reload': my_restart_or_reload }}) }}"
 18  loop: "{{ lp_systemd_unit }}"
 19  loop_control:
 20    label: "{{ my_name }}"
 21  vars:
 22    my_name: "{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
 23    my_state: "{{ item.control.state|default('started') }}"
 24    my_restart_or_reload: "{{ item.control.restart_or_reload|default('reloaded') }}"
 25  tags:
 26    - lp_systemd_debug
 27    - lp_systemd_packages
 28    - lp_systemd_conf
 29
 30# Debug
 31- name: "systemd: Debug"
 32  vars:
 33    msg: |-
 34      ansible_os_family: {{ ansible_os_family }}
 35      lp_systemd_install: {{ lp_systemd_install }}
 36      lp_systemd_packages:
 37        {{ lp_systemd_packages|to_nice_yaml(indent=2)|indent(2) }}
 38      lp_systemd_dir: {{ lp_systemd_dir }}
 39      lp_systemd_owner: {{ lp_systemd_owner }}
 40      lp_systemd_group: {{ lp_systemd_group }}
 41      lp_systemd_mode: {{ lp_systemd_mode }}
 42      lp_systemd_conf_no_extra_spaces: {{ lp_systemd_conf_no_extra_spaces }}
 43      lp_systemd_conf:
 44        {{ lp_systemd_conf|to_yaml(indent=2)|indent(2) }}
 45      lp_systemd_unit_dir: {{ lp_systemd_unit_dir }}
 46      lp_systemd_unit_type: {{ lp_systemd_unit_type }}
 47      lp_systemd_unit:
 48        {{ lp_systemd_unit|to_nice_yaml(indent=2)|indent(2) }}
 49      my_services:
 50        {{ my_services|to_yaml(indent=2)|indent(2) }}
 51      lp_backup_conf: {{ lp_backup_conf }}
 52  ansible.builtin.debug:
 53    msg: "{{ '{}'.format(msg) }}"
 54  when: lp_systemd_debug|bool
 55  tags: lp_systemd_debug
 56
 57# Packages
 58- name: "systemd: Install packages"
 59  ansible.builtin.import_role:
 60    name: vbotka.linux_lib
 61    tasks_from: install_package.yml
 62  when: lp_systemd_install|bool
 63  vars:
 64    ll_ipkg_list: "{{ lp_systemd_packages }}"
 65    ll_ipkg_state: "{{ lp_package_state }}"
 66    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 67    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 68    ll_debug: "{{ lp_systemd_debug|bool }}"
 69  tags: lp_systemd_packages
 70
 71# Conf
 72- name: "systemd: Configure systemd"
 73  community.general.ini_file:
 74    path: "{{ item.0.key }}"
 75    section: "{{ item.1.section }}"
 76    option: "{{ item.1.key }}"
 77    value: "{{ item.1.val }}"
 78    owner: "{{ item.0.value.owner|default(lp_systemd_owner) }}"
 79    group: "{{ item.0.value.group|default(lp_systemd_group) }}"
 80    mode: "{{ item.0.value.mode|default(lp_systemd_mode) }}"
 81    no_extra_spaces: "{{ lp_systemd_conf_no_extra_spaces }}"
 82    backup: "{{ lp_backup_conf }}"
 83  register: lp_systemd_conf_changes
 84  with_subelements:
 85    - "{{ lp_systemd_conf|dict2items }}"
 86    - value.conf
 87  loop_control:
 88    label: "{{ item.0.key }} {{ item.1.section }} {{ item.1.key }} {{ item.1.val }}"
 89  notify: reload systemd conf
 90  tags: lp_systemd_conf
 91
 92- name: "systemd: Debug conf results"
 93  ansible.builtin.debug:
 94    msg: "{{ lp_systemd_conf_changes.results }}"
 95  when: lp_systemd_debug|bool
 96  tags: lp_systemd_conf
 97
 98- name: "systemd: Debug loop conf results"
 99  ansible.builtin.debug:
100    msg: "{{ my_service }} {{ my_state }} {{ my_restart_or_reload }}"
101  loop: "{{ lp_systemd_conf_changes.results }}"
102  loop_control:
103    label: "{{ item.path|default('NA') }}"  # 'lp_systemd: false' complains "no attribute 'path'"
104  vars:
105    my_service: "{{ item.item.0.value.reload_service }}"
106    my_state: "{{ my_services[my_service].state|default('started') }}"
107    my_restart_or_reload: "{{ my_services[my_service].restart_or_reload|default('reloaded') }}"
108  when:
109    - lp_systemd_debug|bool
110    - lp_systemd_conf_changes.results|default([])|length > 0
111  tags: lp_systemd_conf
112
113# Units
114- name: "systemd: Create units"
115  ansible.builtin.template:
116    src: systemd-unit.j2
117    dest: "{{ item.path|default(lp_systemd_unit_dir) }}/{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
118    owner: "{{ item.owner|default(lp_systemd_owner) }}"
119    group: "{{ item.group|default(lp_systemd_group) }}"
120    mode: "{{ item.mode|default(lp_systemd_mode) }}"
121    backup: "{{ lp_backup_conf }}"
122  register: lp_systemd_unit_create_changes
123  loop: "{{ lp_systemd_unit }}"
124  loop_control:
125    label: "{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
126  notify: reload systemd units
127  when: item.state|default('noop') == 'create'
128  tags: lp_systemd_unit_create
129
130- name: "systemd: Debug unit create results"
131  ansible.builtin.debug:
132    var: lp_systemd_unit_create_changes
133  when: lp_systemd_debug|bool
134  tags: lp_systemd_unit_create
135
136- name: "systemd: Remove units"
137  ansible.builtin.file:
138    state: absent
139    path: "{{ item.path|default(lp_systemd_unit_dir) }}/{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
140  register: lp_systemd_unit_remove_changes
141  loop: "{{ lp_systemd_unit }}"
142  loop_control:
143    label: "{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
144  when: item.state|default('noop') == 'absent'
145  tags: lp_systemd_unit_remove
146
147- name: "systemd: Debug unit remove results"
148  ansible.builtin.debug:
149    var: lp_systemd_unit_remove_changes
150  when: lp_systemd_debug|bool
151  tags: lp_systemd_unit_remove
152
153- name: "systemd: Control units"
154  ansible.builtin.systemd:
155    name: "{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
156    daemon_reexec: "{{ item.control.daemon_reexec|default(omit) }}"
157    daemon_reload: "{{ item.control.daemon_reload|default(omit) }}"
158    enabled: "{{ item.control.enabled|default(omit) }}"
159    force: "{{ item.control.force|default(omit) }}"
160    masked: "{{ item.control.masked|default(omit) }}"
161    no_block: "{{ item.control.no_block|default(omit) }}"
162    scope: "{{ item.control.scope|default(omit) }}"
163    state: "{{ item.control.state|default(omit) }}"
164  register: lp_systemd_unit_control_changes
165  loop: "{{ lp_systemd_unit }}"
166  loop_control:
167    label: "{{ item.name }}.{{ item.type|default(lp_systemd_unit_type) }}"
168  when:
169    - item.control|default([])|length > 0
170    - not (item.name|regex_search('^(.*)@\.\w+$'))
171  tags: lp_systemd_unit_control
172
173- name: "systemd: Debug unit control results"
174  ansible.builtin.debug:
175    var: lp_systemd_unit_control_changes
176  when: lp_systemd_debug|bool
177  tags: lp_systemd_unit_control
178
179# EOF
180...

timesyncd.yml

Synopsis: Configure timesyncd.

Description of the task.

[tasks/timesyncd.yml]

 1---
 2# linux_postinstall timesyncd
 3
 4- name: "timesyncd: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_timesyncd: {{ lp_timesyncd }}
 9      lp_timesyncd_ntp: {{ lp_timesyncd_ntp }}
10      lp_timesyncd_fallbackntp: {{ lp_timesyncd_fallbackntp }}
11      lp_timesyncd_rootdistancemaxsec: {{ lp_timesyncd_rootdistancemaxsec }}
12      lp_timesyncd_pollintervalminsec: {{ lp_timesyncd_pollintervalminsec }}
13      lp_timesyncd_pollintervalmaxsec: {{ lp_timesyncd_pollintervalmaxsec }}
14  ansible.builtin.debug:
15    msg: "{{ '{}'.format(msg) }}"
16  when: lp_timesyncd_debug|bool
17  tags: lp_timesyncd_debug
18
19- name: "timesyncd: Configure /etc/systemd/timesyncd.conf"
20  ansible.builtin.template:
21    src: timesyncd.conf.j2
22    dest: /etc/systemd/timesyncd.conf
23    owner: root
24    group: root
25    mode: '0644'
26    backup: "{{ lp_backup_conf }}"
27  notify: restart timesyncd
28  tags: lp_timesyncd_conf
29
30- name: "timesyncd: Service {{ state }} and {{ enable }}"
31  ansible.builtin.service:
32    name: "{{ lp_timesyncd_service }}"
33    state: "{{ state }}"
34    enabled: "{{ enabled }}"
35  register: result
36  vars:
37    enabled: "{{ lp_timesyncd_enable|bool|d(false) }}"
38    state: "{{ lp_timesyncd_state|d(default_state) }}"
39    default_state: "{{ enabled|ternary('started', 'stopped') }}"
40    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
41  tags: lp_timesyncd_service
42
43- name: "timesyncd: Debug service"
44  ansible.builtin.debug:
45    var: result
46  when: lp_timesyncd_debug|bool
47  tags: lp_timesyncd_service
48
49# Notes on CentOS
50# * systemd compiled without timesyncd service in CentOS 7 ?
51# * use ntpd or chrony only ?
52# https://unix.stackexchange.com/questions/286708/
53# centos-7-2-minimal-time-synchronization-timedated-and-or-ntpd-chrony
54# https://www.freedesktop.org/wiki/Software/systemd/timedated/
55
56# EOF
57...

timezone.yml

Synopsis: Configure timezone.

Description of the task.

[tasks/timezone.yml]

 1---
 2# linux_postinstall timezone
 3
 4- name: "timezone: Debug"
 5  ansible.builtin.debug:
 6    msg: "lp_timezone_zoneinfo: {{ lp_timezone_zoneinfo }}"
 7  when: lp_timezone_debug|bool
 8  tags: lp_timezone_debug
 9
10- name: "timezone: Set timezone {{ lp_timezone_zoneinfo }}"
11  community.general.timezone:
12    name: "{{ lp_timezone_zoneinfo|default('UTC') }}"
13  tags: lp_timezone_set
14
15# EOF
16...

tlp.yml

Synopsis: Configure tlp.

Description of the task.

[tasks/tlp.yml]

 1---
 2# linux_postinstall tlp
 3
 4- name: "tlp: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_tlp_enable: {{ lp_tlp_enable }}
 9      lp_tlp_install: {{ lp_tlp_install }}
10      lp_tlp_packages:
11        {{ lp_tlp_packages|to_nice_yaml(indent=2)|indent(2) }}
12      lp_tlp_thinkpad: {{ lp_tlp_thinkpad }}
13      lp_tlp_packages_tp:
14        {{ lp_tlp_packages_tp|to_nice_yaml(indent=2)|indent(2) }}
15      lp_tlp_config_file: {{ lp_tlp_config_file }}
16      lp_tlp_config:
17        {{ lp_tlp_config|to_nice_yaml(indent=2)|indent(2) }}
18      lp_tlp_services:
19        {{ lp_tlp_services|to_nice_yaml(indent=2)|indent(2) }}
20      lp_tlp_restart_service: {{ lp_tlp_restart_service }}
21      lp_backup_conf: {{ lp_backup_conf }}
22  ansible.builtin.debug:
23    msg: "{{ '{}'.format(msg) }}"
24  when: lp_tlp_debug|bool
25  tags: lp_tlp_debug
26
27- name: "tlp: Install packages"
28  ansible.builtin.import_role:
29    name: vbotka.linux_lib
30    tasks_from: install_package.yml
31  when: lp_tlp_install|bool
32  vars:
33    ll_ipkg_list: "{{ lp_tlp_packages }}"
34    ll_ipkg_state: "{{ lp_package_state }}"
35    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
36    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
37    ll_debug: "{{ lp_tlp_debug|bool }}"
38  tags: lp_tlp_packages
39
40- name: "tlp: Install packages for ThinkPad"
41  ansible.builtin.import_role:
42    name: vbotka.linux_lib
43    tasks_from: install_package.yml
44  when: lp_tlp_thinkpad|bool
45  vars:
46    ll_ipkg_list: "{{ lp_tlp_packages_tp }}"
47    ll_ipkg_state: "{{ lp_package_state }}"
48    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
49    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
50    ll_debug: "{{ lp_tlp_debug|bool }}"
51  tags: lp_tlp_packages
52
53- name: "tlp: Configure {{ lp_tlp_config_file }}"
54  ansible.builtin.lineinfile:
55    dest: "{{ lp_tlp_config_file }}"
56    regexp: '^\s*{{ item.key }}\s*=\s*(.*)$'
57    line: "{{ item.key }}={{ item.value }}"
58    create: true
59    mode: '0644'
60    backup: "{{ lp_backup_conf }}"
61  loop: "{{ lp_tlp_config }}"
62  loop_control:
63    label: "{{ item.key }}: {{ item.value }}"
64  notify: restart tlp
65  tags: lp_tlp_conf
66
67- name: "tlp: Services start/stop and enable/disable"
68  ansible.builtin.service:
69    name: "{{ srv_name }}"
70    state: "{{ srv_stat }}"
71    enabled: "{{ srv_enbl }}"
72  loop: "{{ lp_tlp_services }}"
73  loop_control:
74    label: "{{ srv_name }} state: {{ srv_stat }} enabled: {{ srv_enbl }}"
75  vars:
76    srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
77    srv_enbl: "{{ lookup('vars', 'lp_' ~ item ~ '_enable', default=false) }}"
78    srv_stat: "{{ lookup('vars', 'lp_' ~ item ~ '_state', default=default_stat) }}"
79    default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
80  tags: lp_tlp_service
81
82# EOF
83...

udev.yml

Synopsis: Configure udev.

Description of the task.

[tasks/udev.yml]

  1---
  2# linux_postinstall udev
  3
  4- name: "udev: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_udev_debug2: {{ lp_udev_debug2|d(false)|bool }}
  9      lp_udev_enable: {{ lp_udev_enable }}
 10      lp_udev_enable_module: {{ lp_udev_enable_module }}
 11      lp_udev_service: {{ lp_udev_service }}
 12      lp_udev_conf_file: {{ lp_udev_conf_file }}
 13      lp_udev_conf:
 14        {{ lp_udev_conf|to_yaml(indent=2)|indent(2) }}
 15      lp_udev_rules_dir: {{ lp_udev_rules_dir }}
 16      lp_udev_rules_template: {{ lp_udev_rules_template }}
 17      lp_udev_rules:
 18        {{ lp_udev_rules|to_yaml(indent=2)|indent(2) }}
 19      lp_udev_persistent_net_template: {{ lp_udev_persistent_net_template }}
 20      lp_udev_persistent_net_rules_file: {{ lp_udev_persistent_net_rules_file }}
 21      lp_udev_persistent_net_rules:
 22        {{ lp_udev_persistent_net_rules|to_nice_yaml(indent=2)|indent(2) }}
 23      lp_udev_hci_name_rules_file: {{ lp_udev_hci_name_rules_file }}
 24      lp_udev_hci_name_rules:
 25        {{ lp_udev_hci_name_rules|to_nice_yaml(indent=2)|indent(2) }}
 26      lp_udev_hci_run_rules_file: {{ lp_udev_hci_run_rules_file }}
 27      lp_udev_hci_run_rules:
 28        {{ lp_udev_hci_run_rules|to_nice_yaml(indent=2)|indent(2) }}
 29      lp_backup_conf: {{ lp_backup_conf }}
 30  ansible.builtin.debug:
 31    msg: "{{ '{}'.format(msg) }}"
 32  when: lp_udev_debug|bool
 33  tags: lp_udev_debug
 34
 35- name: "udev: Configure {{ lp_udev_conf_file }}"
 36  ansible.builtin.lineinfile:
 37    dest: "{{ lp_udev_conf_file }}"
 38    regexp: '^\s*{{ item.key }}\s*=(.*)$'
 39    line: "{{ item.key }}={{ item.val }}"
 40    backup: "{{ lp_backup_conf }}"
 41  loop: "{{ lp_udev_conf }}"
 42  notify: update initrd
 43
 44- name: "udev: Configure {{ lp_udev_rules_dir }}"
 45  ansible.builtin.template:
 46    src: "{{ lp_udev_rules_template }}"
 47    dest: "{{ lp_udev_rules_dir }}/{{ item.key }}"
 48    owner: root
 49    group: root
 50    mode: '0644'
 51    backup: "{{ lp_backup_conf }}"
 52  loop: "{{ lp_udev_rules|dict2items }}"
 53  loop_control:
 54    label: "{{ item.key }}"
 55  notify: reload udev
 56  tags: lp_udev_rules
 57
 58  # > > > Deprecated, use lp_udev_rules instead - - - - - - - - - - - - - - - - - -
 59
 60- name: "udev: Configure {{ lp_udev_rules_dir }}/
 61                         {{ lp_udev_persistent_net_rules_file }}"
 62  ansible.builtin.template:
 63    src: "{{ lp_udev_persistent_net_template }}"
 64    dest: "{{ lp_udev_rules_dir }}/{{ lp_udev_persistent_net_rules_file }}"
 65    owner: root
 66    group: root
 67    mode: '0644'
 68    backup: "{{ lp_backup_conf }}"
 69  loop: "{{ lp_udev_persistent_net_rules }}"
 70  notify: reload udev
 71  tags: lp_udev_persistentnet
 72
 73- name: "udev: Configure {{ lp_udev_rules_dir }}/
 74                         {{ lp_udev_hci_name_rules_file }}"
 75  ansible.builtin.template:
 76    src: hci-name.rules.j2
 77    dest: "{{ lp_udev_rules_dir }}/{{ lp_udev_hci_name_rules_file }}"
 78    owner: root
 79    group: root
 80    mode: '0644'
 81    backup: "{{ lp_backup_conf }}"
 82  loop: "{{ lp_udev_hci_name_rules }}"
 83  notify: reload udev
 84  tags: lp_udev_hciname
 85
 86- name: "udev: Configure {{ lp_udev_rules_dir }}/
 87                         {{ lp_udev_hci_run_rules_file }}"
 88  ansible.builtin.template:
 89    src: hci-run.rules.j2
 90    dest: "{{ lp_udev_rules_dir }}/{{ lp_udev_hci_run_rules_file }}"
 91    owner: root
 92    group: root
 93    mode: '0644'
 94    backup: "{{ lp_backup_conf }}"
 95  loop: "{{ lp_udev_hci_run_rules }}"
 96  notify: reload udev
 97  tags: lp_udev_hcirun
 98
 99  # - - - - - - - - - - - - - - - - - - Deprecated, use lp_udev_rules instead < < <
100
101  # Service
102
103  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
104  # NOTE: ansible.builtin.service not idempotent when 'enabled: true'
105  # SEE: https://github.com/ansible/ansible/issues/75542
106  #      systemd module reports changed every time disabling a service
107  #      that is enabled-runtime #75542
108  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
109
110- name: "udev: Debug ansible_facts.services"
111  block:
112    - name: "udev: Get ansible_facts.services"
113      ansible.builtin.service_facts:
114    - name: "udev: Debug ansible_facts.services"
115      ansible.builtin.debug:
116        var: ansible_facts.services
117  when: lp_udev_debug2|d(false)|bool
118
119- name: "udev: Start and enable udev"
120  block:
121
122    - name: "udev: Start and enable udev (sysvinit)"
123      ansible.builtin.sysvinit:
124        name: "{{ lp_udev_service }}"
125        state: started
126        enabled: true
127      register: result
128      when: lp_udev_enable_module == 'sysvinit'
129
130    - name: "udev: Start and enable udev (systemd)"
131      ansible.builtin.systemd:
132        name: "{{ lp_udev_service }}"
133        state: started
134        enabled: true
135      register: result
136      when: lp_udev_enable_module == 'systemd'
137
138    - name: "udev: Start and enable udev (service)"
139      ansible.builtin.service:
140        name: "{{ lp_udev_service }}"
141        state: started
142        enabled: true
143      register: result
144      when: lp_udev_enable_module == 'service'
145
146    - name: "udev: Debug result"
147      ansible.builtin.debug:
148        var: result
149      when: lp_udev_debug2|d(false)|bool
150
151  when: lp_udev_enable|bool
152  tags: lp_udev_service
153
154- name: "udev: Stop and disable udev"
155  block:
156
157    - name: "udev: Stop and disable udev"
158      ansible.builtin.service:
159        name: "{{ lp_udev_service }}"
160        state: stopped
161        enabled: false
162      register: result
163
164    - name: "udev: Debug result"
165      ansible.builtin.debug:
166        var: result
167      when: lp_udev_debug2|d(false)|bool
168
169  when: not lp_udev_enable|bool
170  tags: lp_udev_service
171
172
173# EOF
174...

ufw.yml

Synopsis: Configure ufw.

Description of the task.

[tasks/ufw.yml]

  1---
  2# linux_postinstall ufw
  3
  4# Notes
  5#
  6# 1.Aliases of parameters in ufw module not implemented in task
  7#   "Configure ufw".
  8# 2.It's not necessary to reload ufw after configuration has
  9#   changed. Module ufw automatically updates the rules.
 10# 3.Best practice: First time 'lp_ufw_reset: true'; configure and enable
 11#   ufs (configuration item {state: 'enabled'} reloads firewall and
 12#   enables firewall on boot); 'lp_ufw_enable: true' start and enable ufw
 13#   service.
 14# 4.Configuration on the fly: configure and enable ufs.
 15# 5.The last configuration item should be {state: 'enabled'}.
 16# 6.ufw is not starting on boot despite ENABLED=yes in /etc/ufw/ufw.conf
 17#   See: How do I get ufw to start on boot?
 18#   https://askubuntu.com/questions/1040539/how-do-i-get-ufw-to-start-on-boot
 19# 7.See: man ufw.
 20
 21- name: "ufw: Debug"
 22  vars:
 23    msg: |-
 24      ansible_os_family: {{ ansible_os_family }}
 25      lp_ufw_install: {{ lp_ufw_install }}
 26      lp_ufw_enable: {{ lp_ufw_enable }}
 27      lp_ufw_reset: {{ lp_ufw_reset }}
 28      lp_ufw_reload: {{ lp_ufw_reload }}
 29      lp_ufw_packages:
 30        {{ lp_ufw_packages|to_nice_yaml(indent=2)|indent(2) }}
 31      lp_ufw_default:
 32        {{ lp_ufw_default|to_yaml(indent=2)|indent(2) }}
 33      lp_ufw_sysctl:
 34        {{ lp_ufw_sysctl|to_yaml(indent=2)|indent(2) }}
 35      lp_ufw_blocks:
 36        {{ lp_ufw_blocks|to_nice_yaml(indent=2)|indent(2) }}
 37      lp_ufw_conf:
 38        {{ lp_ufw_conf|to_yaml(indent=2)|indent(2) }}
 39      lp_ufw_service_conf:
 40        {{ lp_ufw_service_conf|to_yaml(indent=2)|indent(2) }}
 41      lp_backup_conf: {{ lp_backup_conf }}
 42  ansible.builtin.debug:
 43    msg: "{{ '{}'.format(msg) }}"
 44  when: lp_ufw_debug|bool
 45  tags: lp_ufw_debug
 46
 47- name: "ufw: Install packages"
 48  ansible.builtin.import_role:
 49    name: vbotka.linux_lib
 50    tasks_from: install_package.yml
 51  when: lp_ufw_install|bool
 52  vars:
 53    ll_ipkg_list: "{{ lp_ufw_packages }}"
 54    ll_ipkg_state: "{{ lp_package_state }}"
 55    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 56    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 57    ll_debug: "{{ lp_ufw_debug|bool }}"
 58  tags: lp_ufw_packages
 59
 60- name: "ufw: Disable and reset firewall to installation defaults"
 61  community.general.ufw:
 62    state: reset
 63  when: lp_ufw_reset|bool
 64  tags: lp_ufw_reset
 65
 66- name: "ufw: Reload firewall"
 67  community.general.ufw:
 68    state: reloaded
 69  when: lp_ufw_reload|bool
 70  tags: lp_ufw_reload
 71
 72- name: "ufw: Configure /etc/default/ufw"
 73  ansible.builtin.lineinfile:
 74    path: /etc/default/ufw
 75    regexp: '^\s*{{ item.key }}\s*=(.*)$'
 76    line: '{{ item.key }}={{ item.val }}'
 77    backup: "{{ lp_backup_conf }}"
 78  loop: "{{ lp_ufw_default }}"
 79  loop_control:
 80    label: "{{ item.key }}: {{ item.val }}"
 81  notify: reload ufw
 82  tags: lp_ufw_defaults
 83
 84- name: "ufw: Configure /etc/ufw/sysctl.conf"
 85  ansible.builtin.lineinfile:
 86    path: /etc/ufw/sysctl.conf
 87    regexp: '^\s*{{ item.key }}\s*=(.*)$'
 88    line: '{{ item.key }}={{ item.val }}'
 89    backup: "{{ lp_backup_conf }}"
 90  loop: "{{ lp_ufw_sysctl }}"
 91  loop_control:
 92    label: "{{ item.key }}: {{ item.val }}"
 93  notify: reload ufw
 94  tags: lp_ufw_defaults
 95
 96- name: "ufw: Configure blocks"
 97  ansible.builtin.blockinfile:
 98    path: "/etc/ufw/{{ item.0.key }}"
 99    marker: "# {mark} ANSIBLE MANAGED BLOCK {{ item.1.mark }}"
100    block: "{{ item.1.block }}"
101    insertbefore: "{{ item.1.insertbefore|default(omit) }}"
102    insertafter: "{{ item.1.insertafter|default(omit) }}"
103    backup: "{{ lp_backup_conf }}"
104  loop: "{{ lp_ufw_blocks|dict2items|subelements('value') }}"
105  loop_control:
106    label: "{{ item.0.key }} {{ item.1.mark }}"
107  notify: reload ufw
108  tags: lp_ufw_defaults
109
110- name: "ufw: Configure ufw"
111  community.general.ufw:
112    comment: "{{ item.comment|default(omit) }}"
113    default: "{{ item.default|default(omit) }}"
114    delete: "{{ item.delete|default(omit) }}"
115    direction: "{{ item.direction|default(omit) }}"
116    from_ip: "{{ item.from_ip|default(omit) }}"
117    from_port: "{{ item.from_port|default(omit) }}"
118    insert: "{{ item.insert|default(omit) }}"
119    insert_relative_to: "{{ item.insert_relative_to|default(omit) }}"
120    interface: "{{ item.interface|default(omit) }}"
121    log: "{{ item.log|default(omit) }}"
122    logging: "{{ item.logging|default(omit) }}"
123    name: "{{ item.name|default(omit) }}"
124    proto: "{{ item.proto|default(omit) }}"
125    route: "{{ item.route|default(omit) }}"
126    rule: "{{ item.rule|default(omit) }}"
127    state: "{{ item.state|default(omit) }}"
128    to_ip: "{{ item.to_ip|default(omit) }}"
129    to_port: "{{ item.to_port|default(omit) }}"
130  loop: "{{ lp_ufw_conf }}"
131  loop_control:
132    label: "{{ item.comment|default('no comment') }}"
133  tags: lp_ufw_conf
134
135- name: "ufw: Configure service"
136  community.general.ini_file:
137    path: "{{ item.0.path }}"
138    owner: "{{ item.0.owner|default(omit) }}"
139    group: "{{ item.0.group|default(omit) }}"
140    mode: "{{ item.0.mode|default(omit) }}"
141    create: "{{ item.0.create|default(omit) }}"
142    no_extra_spaces: "{{ item.0.no_extra_spaces|default(omit) }}"
143    section: "{{ item.1.section }}"
144    state: "{{ item.1.state|default(omit) }}"
145    option: "{{ item.1.option|default(omit) }}"
146    value: "{{ item.1.value|default(omit) }}"
147    backup: "{{ lp_backup_conf }}"
148  loop: "{{ lp_ufw_service_conf|subelements('ini', {'skip_missing': True}) }}"
149  loop_control:
150    label: "{{ item.0.path }}
151            {{ item.1.section|default('none') }}
152            {{ item.1.option|default('none') }}
153            {{ item.1.value|default('none') }}
154            {{ item.1.state|default('none') }}"
155  notify: "{{ item.0.handlers|default(omit) }}"
156  tags: lp_ufw_service_conf
157
158- name: "ufw: Service {{ state }} and {{ enable }}"
159  ansible.builtin.service:
160    name: "{{ lp_ufw_service }}"
161    state: "{{ state }}"
162    enabled: "{{ enabled }}"
163  register: result
164  vars:
165    enabled: "{{ lp_ufw_enable|bool|d(false) }}"
166    state: "{{ lp_ufw_state|d(default_state) }}"
167    default_state: "{{ enabled|ternary('started', 'stopped') }}"
168    enable: "{{ enabled|ternary('enabled', 'disabled') }}"
169  tags: lp_ufw_service
170
171- name: "ufw: Debug service"
172  ansible.builtin.debug:
173    var: result
174  when: lp_ufw_debug|bool
175  tags: lp_ufw_service
176
177# EOF
178...

users.yml

Synopsis: Configure users.

Description of the task.

[tasks/users.yml]

 1---
 2# linux_postinstall users
 3
 4- name: "users: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_users_nolog: {{ lp_users_nolog }}
 9      lp_users:
10        {{ lp_users|to_nice_yaml(indent=2)|indent(2) }}
11      lp_users_groups:
12        {{ lp_users_groups|to_nice_yaml(indent=2)|indent(2) }}
13  ansible.builtin.debug:
14    msg: "{{ '{}'.format(msg) }}"
15  when: lp_users_debug|bool
16  tags: lp_users_debug
17
18- name: "users: Manage user accounts"
19  ansible.builtin.user:
20    name: "{{ item.name }}"
21    authorization: "{{ item.authorization|default(omit) }}"
22    comment: "{{ item.comment|default(omit) }}"
23    create_home: "{{ item.create_home|default(omit) }}"
24    expires: "{{ item.expires|default(omit) }}"
25    force: "{{ item.force|default(omit) }}"
26    generate_ssh_key: "{{ item.generate_ssh_key|default(omit) }}"
27    group: "{{ item.group|default(omit) }}"
28    hidden: "{{ item.hidden|default(omit) }}"
29    home: "{{ item.home|default(omit) }}"
30    local: "{{ item.local|default(omit) }}"
31    login_class: "{{ item.login_class|default(omit) }}"
32    move_home: "{{ item.move_home|default(omit) }}"
33    non_unique: "{{ item.non_unique|default(omit) }}"
34    password: "{{ item.password|default(omit) }}"
35    password_lock: "{{ item.password_lock|default(omit) }}"
36    profile: "{{ item.profile|default(omit) }}"
37    remove: "{{ item.remove|default(omit) }}"
38    role: "{{ item.role|default(omit) }}"
39    seuser: "{{  item.seuser|default(omit) }}"
40    shell: "{{ item.shell|default(omit) }}"
41    skeleton: "{{ item.skeleton|default(omit) }}"
42    ssh_key_bits: "{{ item.ssh_key_bits|default(omit) }}"
43    ssh_key_comment: "{{ item.ssh_key_comment|default(omit) }}"
44    ssh_key_file: "{{ item.ssh_key_file|default(omit) }}"
45    ssh_key_passphrase: "{{ item.ssh_key_passphrase|default(omit) }}"
46    ssh_key_type: "{{ item.ssh_key_type|default(omit) }}"
47    state: "{{ item.state|default(omit) }}"
48    system: "{{ item.system|default(omit) }}"
49    uid: "{{ item.uid|default(omit) }}"
50    update_password: "{{ item.update_password|default(omit) }}"
51  loop: "{{ lp_users }}"
52  loop_control:
53    label: "{{ item.name }}"
54  no_log: "{{ lp_users_nolog|bool }}"
55  tags: lp_users_accounts
56
57- name: "users: Add users to additional groups"
58  ansible.builtin.user:
59    name: "{{ item.name }}"
60    groups: "{{ item.groups }}"
61    append: "{{ item.append|default(true) }}"
62  loop: "{{ lp_users_groups }}"
63  loop_control:
64    label: "{{ item.name }}: {{ item.groups }}"
65  tags: lp_users_groups
66
67#  EOF
68...

vars_firstfound.yml

Synopsis: Configure vars_firstfound.

Description of the task.

[tasks/vars_firstfound.yml]

 1---
 2# linux_postinstall vars_firstfound
 3
 4- name: "vars_firstfound: Include default vars for
 5              [{{ ansible_distribution_release }},
 6               {{ ansible_distribution }},
 7               {{ ansible_os_family }}]"
 8  ansible.builtin.include_vars: "{{ file }}"
 9# register: result
10  vars:
11    file: "{{ lookup('first_found', params) }}"
12    params:
13      skip: "{{ lp_vars_distro_firstfound_skip|bool }}"
14      files:
15        - "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
16        - "{{ ansible_distribution }}.yml"
17        - "{{ ansible_os_family }}.yml"
18        - default.yml
19        - defaults.yml
20      paths:
21        - "{{ role_path }}/vars/defaults"
22
23# Note: skip doesn't work with first_found lookup #43833
24# https://github.com/ansible/ansible/issues/43833
25# workaround: Create empty defaults.yml
26
27# - name: "vars_firstfound: Debug include default vars from"
28#   ansible.builtin.debug:
29#     var: result.ansible_included_var_files
30#   when: lp_debug|bool
31
32- name: "vars_firstfound: Include custom vars for
33              [{{ ansible_distribution_release }},
34               {{ ansible_distribution }},
35               {{ ansible_os_family }}]"
36# register: result
37  ansible.builtin.include_vars: "{{ file }}"
38  vars:
39    file: "{{ lookup('first_found', params) }}"
40    params:
41      skip: "{{ lp_vars_distro_firstfound_skip|bool }}"
42      files:
43        - "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
44        - "{{ ansible_distribution }}.yml"
45        - "{{ ansible_os_family }}.yml"
46        - default.yml
47        - defaults.yml
48      paths:
49        - "{{ role_path }}/vars"
50
51# Note: skip doesn't work with first_found lookup #43833
52# https://github.com/ansible/ansible/issues/43833
53# workaround: Create empty defaults.yml
54
55# - name: "vars_firstfound: Debug include custom vars from"
56#   ansible.builtin.debug:
57#     var: result.ansible_included_var_files
58#   when: lp_debug|bool
59
60# EOF
61...

vars_incremental.yml

Synopsis: Configure vars_incremental.

Description of the task.

[tasks/vars_incremental.yml]

 1---
 2# linux_postinstall vars_incremental
 3
 4- name: "vars_incemental: Include default vars for
 5              [{{ ansible_os_family }},
 6               {{ ansible_distribution }},
 7               {{ ansible_distribution_release }}]"
 8  ansible.builtin.include_vars: "{{ item }}"
 9  register: result
10  loop:
11    - "{{ my_path }}/defaults.yml"
12    - "{{ my_path }}/default.yml"
13    - "{{ my_path }}/{{ ansible_os_family }}.yml"
14    - "{{ my_path }}/{{ ansible_distribution }}.yml"
15    - "{{ my_path }}/{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
16  when: item is exists
17  vars:
18    my_path: "{{ role_path }}/vars/defaults.incr"
19
20- name: "vars_incemental: Debug include default vars"
21  ansible.builtin.debug:
22    var: result
23  when: lp_debug2|d(false)|bool
24
25- name: "vars_incemental: Include custom vars for
26              [{{ ansible_os_family }},
27               {{ ansible_distribution }},
28               {{ ansible_distribution_release }}]"
29  ansible.builtin.include_vars: "{{ item }}"
30  register: result
31  loop:
32    - "{{ my_path }}/defaults.yml"
33    - "{{ my_path }}/default.yml"
34    - "{{ my_path }}/{{ ansible_os_family }}.yml"
35    - "{{ my_path }}/{{ ansible_distribution }}.yml"
36    - "{{ my_path }}/{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
37  when: item is exists
38  vars:
39    my_path: "{{ role_path }}/vars"
40
41- name: "vars_incemental: Debug include custom vars"
42  ansible.builtin.debug:
43    var: result
44  when: lp_debug2|d(false)|bool
45
46# EOF
47...

vars.yml

Synopsis: Configure vars.

Description of the task.

[tasks/vars.yml]

 1---
 2# linux_postinstall vars
 3
 4- name: "vars: Include firstfound default vars"
 5  ansible.builtin.include_tasks: vars_firstfound.yml
 6  when: lp_vars_distro == 'firstfound'
 7
 8- name: "vars: Include incremental default vars"
 9  ansible.builtin.include_tasks: vars_incremental.yml
10  when: lp_vars_distro == 'incremental'
11
12- name: "vars: Include firstfound default vars for various flavors"
13  ansible.builtin.include_tasks: sub/vars_flavors.yml
14  when: lp_flavors_enable|bool
15
16# TODO "vars: Include incremental default vars for various flavors"
17
18# EOF
19...

virtualbox.yml

Synopsis: Configure virtualbox.

Description of the task.

[tasks/virtualbox.yml]

 1---
 2# linux_postinstall virtualbox
 3
 4- name: "virtualbox: Debug"
 5  vars:
 6    msg: |-
 7      ansible_lsb.description: {{ ansible_lsb.codename }}
 8      lp_virtualbox: {{ lp_virtualbox }}
 9      lp_virtualbox_ignore_errors: {{ lp_virtualbox_ignore_errors }}
10      lp_virtualbox_keys: {{ lp_virtualbox_keys }}
11      lp_virtualbox_repos: {{ lp_virtualbox_repos }}
12      lp_virtualbox_packages:
13        {{ lp_virtualbox_packages|to_nice_yaml(indent=2)|indent(2) }}
14      lp_virtualbox_services:
15        {{ lp_virtualbox_services|to_nice_yaml(indent=2)|indent(2) }}
16  ansible.builtin.debug:
17    msg: "{{ '{}'.format(msg) }}"
18  when: lp_virtualbox_debug|bool
19  tags: lp_virtualbox_debug
20
21# TODO: assert lp_virtualbox_modules are loaded
22#       when: lp_virtualbox|bool
23
24- name: "virtualbox: Add signing key of VirtualBox"
25  ansible.builtin.apt_key:
26    url: "{{ item }}"
27    state: present
28  loop: "{{ lp_virtualbox_keys }}"
29  register: result
30  retries: "{{ lp_install_retries }}"
31  until: result is succeeded
32  delay: "{{ lp_install_delay }}"
33  ignore_errors: "{{ lp_virtualbox_ignore_errors }}"  # noqa ignore-errors
34  tags: lp_virtualbox_keys
35
36- name: "virtualbox: Add repository of VirtualBox"
37  ansible.builtin.apt_repository:
38    repo: "{{ item }}"
39    state: present
40  loop: "{{ lp_virtualbox_repos }}"
41  ignore_errors: "{{ lp_virtualbox_ignore_errors }}"  # noqa ignore-errors
42  tags: lp_virtualbox_repos
43
44- name: "virtualbox: Install VirtualBox packages"
45  ansible.builtin.import_role:
46    name: vbotka.linux_lib
47    tasks_from: install_package.yml
48  when: lp_virtualbox_install|bool
49  vars:
50    ll_ipkg_list: "{{ lp_virtualbox_packages }}"
51    ll_ipkg_state: "{{ lp_package_state }}"
52    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
53    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
54    ll_debug: "{{ lp_virtualboxool_debug|bool }}"
55  ignore_errors: "{{ lp_virtualbox_ignore_errors }}"  # noqa ignore-errors
56  tags: lp_virtualbox_packages
57
58- name: "virtualbox: Services start/stop and enable/disable"
59  ansible.builtin.service:
60    name: "{{ srv_name }}"
61    state: "{{ srv_stat }}"
62    enabled: "{{ srv_enbl }}"
63  loop: "{{ lp_virtualbox_services }}"
64  loop_control:
65    label: "{{ srv_name }} state: {{ srv_stat }} enabled: {{ srv_enbl }}"
66  vars:
67    srv_name: "{{ lookup('vars', 'lp_' ~ item ~ '_service', default=item) }}"
68    srv_enbl: "{{ lookup('vars', 'lp_' ~ item ~ '_enable', default=false) }}"
69    srv_stat: "{{ lookup('vars', 'lp_' ~ item ~ '_state', default=default_stat) }}"
70    default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
71  tags: lp_virtualbox_service
72
73# EOF
74...

wpagui.yml

Synopsis: Configure wpagui.

Description of the task.

[tasks/wpagui.yml]

 1---
 2# linux_postinstall wpa_gui
 3
 4# Note: Disable NetworkManager before installing wpagui
 5#
 6# Example:
 7#
 8# lp_nm: true
 9# lp_nm_install: false
10# lp_nm_enable: false
11# lp_nm_conf:
12#     - {key: managed, val: 'false'}
13# lp_nm_mask: true
14
15- name: "wpagui: Debug"
16  vars:
17    msg: |-
18      ansible_os_family: {{ ansible_os_family }}
19      lp_wpagui_install: {{ lp_wpagui_install }}
20      lp_wpagui_packages:
21        {{ lp_wpagui_packages|to_nice_yaml(indent=2)|indent(2) }}
22  ansible.builtin.debug:
23    msg: "{{ '{}'.format(msg) }}"
24  when: lp_wpagui_debug|bool
25  tags: lp_wpagui_debug
26
27- name: "wpagui: Install packages"
28  ansible.builtin.import_role:
29    name: vbotka.linux_lib
30    tasks_from: install_package.yml
31  when: lp_wpagui_install|bool
32  vars:
33    ll_ipkg_list: "{{ lp_wpagui_packages }}"
34    ll_ipkg_state: "{{ lp_package_state }}"
35    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
36    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
37    ll_debug: "{{ lp_wpagui_debug|bool }}"
38  tags: lp_wpagui_packages
39
40# EOF
41...

wpasupplicant.yml

Synopsis: Configure wpasupplicant.

Description of the task.

[tasks/wpasupplicant.yml]

  1---
  2# linux_postinstall wpasupplicant
  3
  4- name: "wpasupplicant: Debug"
  5  vars:
  6    msg: |-
  7      ansible_os_family: {{ ansible_os_family }}
  8      lp_package_state: {{ lp_package_state }}
  9      lp_wpasupplicant_install: {{ lp_wpasupplicant_install }}
 10      lp_wpasupplicant_packages:
 11        {{ lp_wpasupplicant_packages|to_nice_yaml(indent=2)|indent(2) }}
 12      lp_wpasupplicant_bin: {{ lp_wpasupplicant_bin }}
 13      lp_wpasupplicant_conf_only: {{ lp_wpasupplicant_conf_only }}
 14      lp_wpasupplicant_conf_dir: {{ lp_wpasupplicant_conf_dir }}
 15      lp_wpasupplicant_conf_owner: {{ lp_wpasupplicant_conf_owner }}
 16      lp_wpasupplicant_conf_group: {{ lp_wpasupplicant_conf_group }}
 17      lp_wpasupplicant_conf_mode: {{ lp_wpasupplicant_conf_mode }}
 18      lp_wpasupplicant_conf_ctrl_interface: {{ lp_wpasupplicant_conf_ctrl_interface }}
 19      lp_wpasupplicant_conf_global:
 20        {{ lp_wpasupplicant_conf_global|to_yaml(indent=2)|indent(2) }}
 21      lp_wpa_action_script: {{ lp_wpa_action_script }}
 22      lp_wpa_action_script_dir: {{ lp_wpa_action_script_dir }}
 23      lp_wpa_action_script_dir_owner: {{ lp_wpa_action_script_dir_owner }}
 24      lp_wpa_action_script_dir_group: {{ lp_wpa_action_script_dir_group }}
 25      lp_wpa_action_script_dir_mode: {{ lp_wpa_action_script_dir_mode }}
 26      lp_wpa_action_script_file: {{ lp_wpa_action_script_file }}
 27      lp_wpa_action_script_owner: {{ lp_wpa_action_script_owner }}
 28      lp_wpa_action_script_group: {{ lp_wpa_action_script_group }}
 29      lp_wpa_action_script_mode: {{ lp_wpa_action_script_mode }}
 30      lp_wpa_action_script_dhclient: {{ lp_wpa_action_script_dhclient }}
 31      lp_wpa_action_script_pidfile: {{ lp_wpa_action_script_pidfile }}
 32      lp_wpa_action_script_options_connect: {{ lp_wpa_action_script_options_connect }}
 33      lp_wpa_action_script_options_disconnect: {{ lp_wpa_action_script_options_disconnect }}
 34      lp_wpa_action_script_logfile: {{ lp_wpa_action_script_logfile }}
 35      lp_wpasupplicant_service_conf:
 36        {{ lp_wpasupplicant_service_conf|to_yaml(indent=2)|indent(2) }}
 37      {% if lp_wpasupplicant_debug_classified|bool %}
 38      lp_wpasupplicant_conf:
 39        {{ lp_wpasupplicant_conf|to_yaml(indent=2)|indent(2) }}
 40      {% endif %}
 41      lp_backup_conf: {{ lp_backup_conf }}
 42  ansible.builtin.debug:
 43    msg: "{{ '{}'.format(msg) }}"
 44  when: lp_wpasupplicant_debug|bool
 45  tags: lp_wpasupplicant_debug
 46
 47# Packages
 48- name: "wpasupplicant: Install packages"
 49  ansible.builtin.import_role:
 50    name: vbotka.linux_lib
 51    tasks_from: install_package.yml
 52  when: lp_wpasupplicant_install|bool
 53  vars:
 54    ll_ipkg_list: "{{ lp_wpasupplicant_packages }}"
 55    ll_ipkg_state: "{{ lp_package_state }}"
 56    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
 57    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
 58    ll_debug: "{{ lp_wpasupplicant_debug|bool }}"
 59  tags: lp_wpasupplicant_packages
 60
 61# Action script for wpa_cli
 62- name: "wpasupplicant: Create dir {{ lp_wpa_action_script_dir }}"
 63  ansible.builtin.file:
 64    state: directory
 65    path: "{{ lp_wpa_action_script_dir }}"
 66    owner: "{{ lp_wpa_action_script_dir_owner }}"
 67    group: "{{ lp_wpa_action_script_dir_group }}"
 68    mode: "{{ lp_wpa_action_script_dir_mode }}"
 69  when: lp_wpa_action_script|bool
 70  tags: lp_wpa_action_script_dir
 71
 72- name: "wpasupplicant: Create script {{ lp_wpa_action_script_file }}"
 73  ansible.builtin.template:
 74    src: wpa_action.sh.j2
 75    dest: "{{ lp_wpa_action_script_file }}"
 76    owner: "{{ lp_wpa_action_script_owner }}"
 77    group: "{{ lp_wpa_action_script_group }}"
 78    mode: "{{ lp_wpa_action_script_mode }}"
 79    backup: "{{ lp_backup_conf }}"
 80  when: lp_wpa_action_script|bool
 81  tags: lp_wpa_action_script
 82
 83# Conf
 84- name: "wpasupplicant: Create wpasupplicant configuration"
 85  ansible.builtin.template:
 86    src: wpa_supplicant.conf.j2
 87    dest: "{{ lp_wpasupplicant_conf_dir }}/{{ my_filename }}"
 88    owner: "{{ lp_wpasupplicant_conf_owner }}"
 89    group: "{{ lp_wpasupplicant_conf_group }}"
 90    mode: "{{ lp_wpasupplicant_conf_mode }}"
 91    backup: "{{ lp_backup_conf }}"
 92  register: lp_wpasupplicant_conf_changes
 93  notify: reconfigure wpa_supplicant
 94  loop: "{{ lp_wpasupplicant_conf }}"
 95  loop_control:
 96    label: "{{ my_filename }}"
 97  no_log: "{{ not lp_wpasupplicant_debug_classified }}"
 98  vars:
 99    my_filename: "{{ lp_wpasupplicant_conf_file[item.type|default('default')] }}"
100  tags: lp_wpasupplicant_conf
101
102- name: "wpasupplicant: Debug: Create wpasupplicant configuration"
103  ansible.builtin.debug:
104    var: lp_wpasupplicant_conf_changes
105  when: lp_wpasupplicant_debug_classified|bool
106  tags: lp_wpasupplicant_conf
107
108# Service
109- name: "wpasupplicant: Configure wpa_supplicant services"
110  community.general.ini_file:
111    path: "{{ item.0.path }}/{{ item.0.service }}"
112    owner: "{{ item.0.owner|default(omit) }}"
113    group: "{{ item.0.group|default(omit) }}"
114    mode: "{{ item.0.mode|default(omit) }}"
115    create: "{{ item.0.create|default(omit) }}"
116    no_extra_spaces: "{{ item.0.no_extra_spaces|default(omit) }}"
117    section: "{{ item.1.section }}"
118    state: "{{ item.1.state|default(omit) }}"
119    option: "{{ item.1.option|default(omit) }}"
120    value: "{{ item.1.value|default(omit) }}"
121    backup: "{{ lp_backup_conf }}"
122  register: lp_wpasupplicant_service_conf_changes
123  notify: "{{ item.0.handlers|default(omit) }}"  # TODO: see handlers
124  loop: "{{ lp_wpasupplicant_service_conf|subelements('ini', {'skip_missing': True}) }}"
125  loop_control:
126    label: "{{ item.0.path }}/{{ item.0.service }}"
127  tags: lp_wpasupplicant_service_conf
128
129- name: "wpasupplicant: Debug: Configure wpasupplicant services"
130  ansible.builtin.debug:
131    var: lp_wpasupplicant_service_conf_changes
132  when: lp_wpasupplicant_debug|bool
133  tags: lp_wpasupplicant_service_conf
134
135- name: "wpasupplicant: Manage wpa_supplicant services"
136  ansible.builtin.service:
137    name: "{{ my_service }}"
138    state: "{{ item.state|default('started') }}"
139    enabled: "{{ item.enabled|default(true) }}"
140    arguments: "{{ item.arguments|default(omit) }}"
141    pattern: "{{ item.pattern|default(omit) }}"
142    runlevel: "{{ item.runlevel|default(omit) }}"
143    sleep: "{{ item.sleep|default(omit) }}"
144    use: "{{ item.use|default(omit) }}"
145  register: lp_wpasupplicant_service_changes
146  loop: "{{ lp_wpasupplicant_conf }}"
147  loop_control:
148    label: "{{ my_service }}"
149  vars:
150    my_dev: "{{ item.dev }}"
151    my_service: "{{ lp_wpasupplicant_service[item.type|default('default')] }}"
152  tags: lp_wpasupplicant_service
153
154- name: "wpasupplicant: Debug: Manage wpa_supplicant services"
155  ansible.builtin.debug:
156    var: lp_wpasupplicant_service_changes
157  when: lp_wpasupplicant_debug_classified|bool
158  tags: lp_wpasupplicant_service
159
160# EOF
161...

xen.yml

Synopsis: Configure xen.

Description of the task.

[tasks/xen.yml]

 1---
 2# linux_postinstall xen
 3
 4- name: "xen: Debug"
 5  vars:
 6    msg: |-
 7      ansible_os_family: {{ ansible_os_family }}
 8      lp_xen_packages:
 9        {{ lp_xen_packages|to_nice_yaml(indent=2)|indent(2) }}
10      lp_xen_dom0_mem:
11        {{ lp_xen_dom0_mem|to_nice_yaml(indent=2)|indent(2) }}
12      lp_xen_default_grub_conf:
13        {{ lp_xen_default_grub_conf|to_nice_yaml(indent=2)|indent(2) }}
14      lp_xen_global:
15        {{ lp_xen_global|to_nice_yaml(indent=2)|indent(2) }}
16      lp_backup_conf: {{ lp_backup_conf }}
17  ansible.builtin.debug:
18    msg: "{{ '{}'.format(msg) }}"
19  when: lp_xen_debug|bool
20  tags: lp_xen_debug
21
22- name: "xen: Install packages"
23  ansible.builtin.import_role:
24    name: vbotka.linux_lib
25    tasks_from: install_package.yml
26  when: lp_xen_install|bool
27  vars:
28    ll_ipkg_list: "{{ lp_xen_packages }}"
29    ll_ipkg_state: "{{ lp_package_state }}"
30    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
31    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
32    ll_debug: "{{ lp_xen_debug|bool }}"
33  tags: lp_xen_packages
34
35- name: "xen: Configure /etc/default/grub"
36  ansible.builtin.lineinfile:
37    dest: /etc/default/grub
38    regexp: '^\s*{{ item.key }}\s*=\s*(.*)$'
39    line: "{{ item.key }}={{ item.value }}"
40    backup: "{{ lp_backup_conf }}"
41  loop: "{{ lp_xen_default_grub_conf }}"
42  loop_control:
43    label: "{{ item.key }}: {{ item.value }}"
44  notify: update grub
45  tags: lp_xen_default_grub
46
47- name: "xen: Configure /etc/xen/xl.conf"
48  ansible.builtin.lineinfile:
49    dest: /etc/xen/xl.conf
50    regexp: '^\s*{{ item.var }}\s*=\s*(.*)$'
51    line: "{{ item.var }}={{ item.value }}"
52    backup: "{{ lp_backup_conf }}"
53    create: true
54    mode: "0644"
55  loop: "{{ lp_xen_global }}"
56  loop_control:
57    label: "{{ item.var }}: {{ item.value }}"
58  tags: lp_xen_global
59
60# EOF
61...

xorg.yml

Synopsis: Configure xorg.

Description of the task.

[tasks/xorg.yml]

 1---
 2# linux_postinstall xorg
 3
 4- name: "xorg: Debug"
 5  vars:
 6    msg: |-
 7      lp_xorg_conf:
 8        {{ lp_xorg_conf|to_yaml(indent=2)|indent(2) }}
 9  ansible.builtin.debug:
10    msg: "{{ '{}'.format(msg) }}"
11  when: lp_xorg_debug|bool
12  tags: lp_xorg_debug
13
14- name: "xorg: Configure {{ lp_xorg_conf_dir }}"
15  ansible.builtin.template:
16    src: xorg.conf.j2
17    dest: "{{ lp_xorg_conf_dir }}/{{ item.file }}"
18    backup: "{{ lp_backup_conf }}"
19    mode: '0644'
20  loop: "{{ lp_xorg_conf }}"
21  loop_control:
22    label: "{{ item.file }}"
23  tags: lp_xorg_conf
24
25# EOF
26...

zeitgeist.yml

Synopsis: Configure zeitgeist.

Description of the task.

[tasks/zeitgeist.yml]

 1---
 2# linux_postinstall zeitgeist
 3
 4# One-way atm
 5- name: "zeitgeist: Remove zeitgeist"
 6  ansible.builtin.apt:
 7    state: absent
 8    name: zeitgeist
 9    purge: true
10  when: not lp_zeitgeist_install|bool
11
12- name: "zeitgeist: Remove zeitgeist-*"
13  ansible.builtin.apt:
14    state: absent
15    name: zeitgeist-*
16    purge: true
17  when: not lp_zeitgeist_install|bool
18
19# - name: Disable zeitgeist
20#   ansible.builtin.service:
21#     name: zeitgeist
22#     state: stopped
23#     enabled: no
24#   when: not lp_zeitgeist
25# "Could not find the requested service zeitgeist"
26
27# for i in zeitgeist-fts zeitgeist; do
28# systemctl --user disable $i;
29# systemctl --user stop $i;
30# systemctl --user mask $i;
31# done
32
33# EOF
34...

zfs.yml

Synopsis: Configure zfs.

Description of the task.

[tasks/zfs.yml]

 1---
 2# linux_postinstall zfs
 3
 4- name: "zfs: Debug"
 5  vars:
 6    msg: |-
 7      lp_zfs_install: {{ lp_zfs_install }}
 8      lp_zfs_packages:
 9        {{ lp_zfs_packages|to_nice_yaml(indent=2)|indent(2) }}
10      lp_zfs_services:
11        {{ lp_zfs_services|default([])|to_yaml(indent=2)|indent(2) }}
12      lp_zfs_manage:
13        {{ lp_zfs_manage|to_yaml(indent=2)|indent(2) }}
14      lp_zfs_mountpoints:
15        {{ lp_zfs_mountpoints|to_yaml(indent=2)|indent(2) }}
16  ansible.builtin.debug:
17    msg: "{{ '{}'.format(msg) }}"
18  when: lp_zfs_debug|bool
19  tags: lp_zfs_debug
20
21- name: "zfs: Install packages"
22  ansible.builtin.import_role:
23    name: vbotka.linux_lib
24    tasks_from: install_package.yml
25  when: lp_zfs_install|bool
26  vars:
27    ll_ipkg_list: "{{ lp_zfs_packages }}"
28    ll_ipkg_state: "{{ lp_package_state }}"
29    ll_ipkg_autoremove: "{{ lp_packages_autoremove|bool }}"
30    ll_ipkg_rescue_end_host: "{{ lp_packages_rescue_end_host|bool }}"
31    ll_debug: "{{ lp_zfs_debug|bool }}"
32  tags: lp_zfs_packages
33
34- name: "zfs: Manage zfs services"
35  ansible.builtin.service:
36    name: "{{ item.name }}"
37    enabled: "{{ srv_enbl }}"
38    state: "{{ srv_stat }}"
39  loop: "{{ lp_zfs_services|default([]) }}"
40  loop_control:
41    label: "{{ item.name }} enabled: {{ srv_enbl }} state: {{ srv_stat }}"
42  vars:
43    srv_enbl: "{{ item.enabled|default(true) }}"
44    srv_stat: "{{ item.state|default(default_stat) }}"
45    default_stat: "{{ srv_enbl|bool|ternary('started', 'stopped') }}"
46  tags: lp_zfs_services
47
48- name: "zfs: Manage zfs"
49  community.general.zfs:
50    name: "{{ item.name }}"
51    state: "{{ item.state }}"
52    origin: "{{ item.origin|default(omit) }}"
53    extra_zfs_properties: "{{ item.extra_zfs_properties|default(omit) }}"
54  loop: "{{ lp_zfs_manage }}"
55  loop_control:
56    label: "{{ item.name }}"
57  tags: lp_zfs_manage
58
59- name: "zfs: Set mode and ownership of zfs mountpoints"
60  ansible.builtin.file:
61    state: directory
62    path: "{{ item.mountpoint }}"
63    owner: "{{ item.owner|default(omit) }}"
64    group: "{{ item.group|default(omit) }}"
65    mode: "{{ item.mode|default(omit) }}"
66  loop: "{{ lp_zfs_mountpoints }}"
67  loop_control:
68    label: "{{ item.mountpoint }}"
69  tags: lp_zfs_mountpoints
70
71# EOF
72...

vars_flavors.yml

Synopsis: Configure vars_flavors.

Description of the task.

[tasks/sub/vars_flavors.yml]

 1---
 2# linux_postinstall vars: vars_flavors
 3
 4# Create dir lp_flavors_dir. Loop lp_flavors and get stat of
 5# release_file(s). If release_file exists include tasks specific to this
 6# flavor.
 7
 8- name: 'sub: vars_flavors: Debug'
 9  vars:
10    msg: |-
11      lp_flavors_dir [{{ lp_flavors_dir }}]
12      lp_flavors_dir_owner [{{ lp_flavors_dir_owner }}]
13      lp_flavors_dir_group [{{ lp_flavors_dir_group }}]
14      lp_flavors_dir_mode [{{ lp_flavors_dir_mode }}]
15      lp_flavors
16      {{ lp_flavors|to_nice_yaml }}
17  ansible.builtin.debug:
18    msg: "{{ '{}'.format(msg) }}"
19  when: lp_debug|bool
20
21- name: 'sub: vars_flavors: Create {{ lp_flavors_dir }}'
22  ansible.builtin.file:
23    state: directory
24    path: '{{ lp_flavors_dir }}'
25    owner: '{{ lp_flavors_dir_owner }}'
26    group: '{{ lp_flavors_dir_group }}'
27    mode: '{{ lp_flavors_dir_mode }}'
28  delegate_to: localhost
29  run_once: true
30
31- name: 'sub: vars_flavors: Detect flavor'
32  ansible.builtin.stat:
33    path: '{{ item.value.release_file }}'
34  loop: '{{ lp_flavors|dict2items }}'
35  register: result
36
37- name: 'sub: vars_flavors: Debug result'
38  ansible.builtin.debug:
39    msg: "{{ result.results|json_query('[?stat.exists].item') }}"
40  when: lp_debug|bool
41
42- name: 'sub: vars_flavors: Include tasks for flavor'
43  ansible.builtin.include_tasks: "{{ 'sub/vars_flavors-' ~ outer_item.key ~ '.yml' }}"
44  loop: "{{ result.results|json_query('[?stat.exists].item') }}"
45  loop_control:
46    loop_var: outer_item
47
48# EOF
49...

vars_flavors_common.yml

Synopsis: Configure vars_flavors_common.

Description of the task.

[tasks/sub/vars_flavors_common.yml]

  1---
  2# linux_postinstall vars: vars-flavors-common
  3
  4# Fetch my_release_file from the remote host and store the file in
  5# lp_flavors_dir. Read release_attr from the fetched file and include
  6# vars that correspond the flavor, release and HW.
  7
  8# my_release_file
  9- name: 'sub: vars-flavors-common: Set my_release_file'
 10  ansible.builtin.set_fact:
 11    my_release_file: '{{ outer_item.value.release_file }}'
 12- name: 'sub: vars-flavors-common: Debug my_release_file'
 13  ansible.builtin.debug:
 14    var: my_release_file
 15  when: lp_debug|bool
 16
 17# my_flavor
 18- name: 'sub: vars-flavors-common: Set my_flavor'
 19  ansible.builtin.set_fact:
 20    my_flavor: '{{ outer_item.key }}'
 21- name: 'sub: vars-flavors-common: Debug my_flavor'
 22  ansible.builtin.debug:
 23    var: my_flavor
 24  when: lp_debug|bool
 25
 26# my_release_file_fetch
 27- name: 'sub: vars-flavors-common: Set my_release_file_fetch'
 28  ansible.builtin.set_fact:
 29    my_release_file_fetch: "{{ lp_flavors_dir ~ '/' ~
 30                               inventory_hostname ~ '-' ~
 31                               my_flavor }}"
 32- name: 'sub: vars-flavors-common: Fetch {{ my_release_file }} to
 33                                         {{ my_release_file_fetch }}'
 34  ansible.builtin.fetch:
 35    flat: true
 36    src: '{{ my_release_file }}'
 37    dest: '{{ my_release_file_fetch }}'
 38
 39# my_release_keys
 40- name: 'sub: vars-flavors-common: Clear my_release_keys'
 41  ansible.builtin.set_fact:
 42    my_release_keys: []
 43- name: 'sub: vars-flavors-common: Set my_release_keys'
 44  ansible.builtin.set_fact:
 45    my_release_keys: "{{ my_release_keys|
 46                         default([]) + [item.split('=').0|trim] }}"
 47  loop: "{{ lookup('file', my_release_file_fetch).splitlines() }}"
 48  when: item is match('^(\s*[a-zA-Z0-9_]+\s*)=(.*)$')
 49- name: 'sub: vars-flavors-common: Debug my_release_keys'
 50  ansible.builtin.debug:
 51    var: my_release_keys
 52  when: lp_debug|bool
 53
 54# my_release_dict
 55- name: 'sub: vars-flavors-common: Clear my_release_dict'
 56  ansible.builtin.set_fact:
 57    my_release_dict: {}
 58- name: 'sub: vars-flavors-common: Set my_release_dict attributes'
 59  ansible.builtin.set_fact:
 60    my_release_dict: "{{ my_release_dict|
 61                         combine({item: lookup('ini', item ~
 62                                                      ' type=properties file=' ~
 63                                                      my_release_file_fetch)}) }}"
 64  loop: '{{ my_release_keys }}'
 65- name: 'sub: vars-flavors-common: Debug my_release_dict'
 66  ansible.builtin.debug:
 67    var: my_release_dict
 68  when: lp_debug|bool
 69
 70# my_release
 71- name: 'sub: vars-flavors-common: Add flavor to my_release'
 72  ansible.builtin.set_fact:
 73    my_release: '{{ my_release|
 74                    default({})|
 75                    combine({my_flavor: my_release_dict}) }}'
 76- name: 'sub: vars-flavors-common: Debug my_release'
 77  ansible.builtin.debug:
 78    var: my_release
 79  when: lp_debug|bool
 80
 81# my_labels
 82- name: 'sub: vars-flavors-common: Set my_labels'
 83  ansible.builtin.set_fact:
 84    my_labels: "{{ lp_flavors[my_flavor].file_labels|
 85                   map('extract', my_release[my_flavor])|
 86                   list }}"
 87- name: 'sub: vars-flavors-common: Debug my_labels'
 88  ansible.builtin.debug:
 89    var: my_labels
 90  when: lp_debug|bool
 91
 92# Include default vars for flavor
 93- name: 'sub: vars-flavors-common: Include default vars for flavor
 94              [{{ my_labels.1 }},
 95               {{ my_labels.0 }},
 96               {{ my_flavor }}]'
 97  ansible.builtin.include_vars: "{{ file }}"
 98  vars:
 99    file: "{{ lookup('first_found', params) }}"
100    params:
101      skip: "{{ lp_vars_distro_firstfound_skip|bool }}"
102      files:
103        - '{{ my_flavor }}_{{ my_labels.0 }}_{{ my_labels.1 }}.yml'
104        - '{{ my_flavor }}_{{ my_labels.0 }}.yml'
105        - '{{ my_flavor }}.yml'
106        - default.yml
107        - defaults.yml
108      paths:
109        - '{{ role_path }}/vars/flavors'
110
111# Note: skip doesn't work with first_found lookup #43833
112# https://github.com/ansible/ansible/issues/43833
113# workaround: Create empty defaults.yml
114
115# EOF
116...