From a03c20832b4b6d491f6a2b7c6b0d2085297111b7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Wed, 5 Jul 2023 16:01:16 +0200
Subject: [PATCH] [UPD] ansible-lint

---
 .ansible-lint     |   7 +
 .yamllint         |  39 ++++
 handlers/main.yml |  34 ++--
 meta/main.yml     |  34 ++--
 tasks/main.yml    | 454 +++++++++++++++++++++++-----------------------
 vars/Debian.yml   |  28 +--
 vars/RedHat.yml   |   2 +-
 7 files changed, 322 insertions(+), 276 deletions(-)
 create mode 100644 .ansible-lint
 create mode 100644 .yamllint

diff --git a/.ansible-lint b/.ansible-lint
new file mode 100644
index 0000000..8d40d06
--- /dev/null
+++ b/.ansible-lint
@@ -0,0 +1,7 @@
+---
+warn_list:  # or 'skip_list' to silence them completely
+    - git-latest  # Git checkouts must contain explicit version
+    - ignore-errors  # Use failed_when and specify error conditions instead of using ignore_errors
+    - no-changed-when  # Commands should not change things if nothing needs doing
+    - no-handler  # Tasks that run when changed should likely be handlers
+    - package-latest  # Package installs should not use latest
diff --git a/.yamllint b/.yamllint
new file mode 100644
index 0000000..fbebdb8
--- /dev/null
+++ b/.yamllint
@@ -0,0 +1,39 @@
+---
+# Based on ansible-lint config
+extends: default
+
+rules:
+    braces:
+        max-spaces-inside: 1
+        level: error
+    brackets:
+        max-spaces-inside: 1
+        level: error
+    colons:
+        max-spaces-after: -1
+        level: error
+    commas:
+        max-spaces-after: -1
+        level: error
+    # comments enable
+    comments: enable
+    comments-indentation: enable
+    document-start: enable
+    empty-lines:
+        max: 3
+        level: error
+    hyphens:
+        level: error
+    indentation:
+        level: warning
+        indent-sequences: consistent
+        spaces: 4
+        check-multi-line-strings: true
+    key-duplicates: enable
+    line-length: disable
+    new-line-at-end-of-file: enable
+    new-lines:
+        type: unix
+    # trailing-spaces enable
+    trailing-spaces: enable
+    truthy: enable
diff --git a/handlers/main.yml b/handlers/main.yml
index cd90d44..14cc685 100644
--- a/handlers/main.yml
+++ b/handlers/main.yml
@@ -1,25 +1,25 @@
 ---
 
-- name: restart-sshd
-  service:
-    name: ssh
-    state: restarted
+- name: Restart SSHD
+  ansible.builtin.service:
+      name: ssh
+      state: restarted
 
-- name: restart-cron
+- name: Restart cron
   ansible.builtin.service:
-    name: cron
-    state: restarted
+      name: cron
+      state: restarted
 
-- name: restart-apt-update-timer
+- name: Restart apt-update-timer
   ansible.builtin.systemd:
-    name: apt-daily.timer
-    daemon_reload: true
-    state: restarted
-    enabled: true
+      name: apt-daily.timer
+      daemon_reload: true
+      state: restarted
+      enabled: true
 
-- name: restart-apt-upgrade-timer
+- name: Restart apt-upgrade-timer
   ansible.builtin.systemd:
-    name: apt-daily-upgrade.timer
-    daemon_reload: true
-    state: restarted
-    enabled: true
+      name: apt-daily-upgrade.timer
+      daemon_reload: true
+      state: restarted
+      enabled: true
diff --git a/meta/main.yml b/meta/main.yml
index 3cc6d90..ccffe37 100644
--- a/meta/main.yml
+++ b/meta/main.yml
@@ -1,19 +1,19 @@
 ---
 galaxy_info:
-  author: Rémi
-  description: Initialization role (upgrade packages, create users, configure sudoers, SSHD and public keys, collect facts, etc.)
-  company: Le Filament (https://le-filament.com)
-  license: AGPL-3.0-or-later
-  min_ansible_version: 2.1
-  platforms:
-    - name: EL
-      versions:
-        - 7
-    - name: Ubuntu
-      versions:
-        - bionic
-        - focal
-  galaxy_tags:
-    - sshd
-    - upgrade
-    - user
+    author: lefilament
+    description: Initialization role (upgrade packages, create users, configure sudoers, SSHD and public keys, collect facts, etc.)
+    company: Le Filament (https://le-filament.com)
+    license: AGPL-3.0-or-later
+    min_ansible_version: "2.1"
+    platforms:
+        - name: EL
+          versions:
+              - "7"
+        - name: Ubuntu
+          versions:
+              - bionic
+              - focal
+    galaxy_tags:
+        - sshd
+        - upgrade
+        - user
diff --git a/tasks/main.yml b/tasks/main.yml
index d605b84..d5bec29 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -1,350 +1,350 @@
 ---
 - name: Include OS-specific variables.
-  include_vars: "{{ ansible_os_family }}.yml"
+  ansible.builtin.include_vars: "{{ ansible_os_family }}.yml"
 
 - name: Set machine hostname
-  hostname:
-    name: "{{ inventory_hostname_short | lower | regex_replace('_','') }}"
+  ansible.builtin.hostname:
+      name: "{{ inventory_hostname_short | lower | regex_replace('_', '') }}"
 
 - name: Set timezone to Europe/Paris
   community.general.timezone:
-    name: Europe/Paris
+      name: Europe/Paris
   notify:
-    - restart-cron
+      - Restart cron
 
 - name: Never include APT phased update
-  copy:
-    src: apt-phased-updates
-    dest: /etc/apt/apt.conf.d/99-Phased-Updates
-    owner: root
-    group: root
-    mode: '0644'
+  ansible.builtin.copy:
+      src: apt-phased-updates
+      dest: /etc/apt/apt.conf.d/99-Phased-Updates
+      owner: root
+      group: root
+      mode: '0644'
   when: ansible_os_family == "Debian"
 
 - name: Debian Update repo and upgrade installed packages
-  apt:
-    update_cache: true
-    upgrade: full
-    autoremove: true
-    force: true
-    install_recommends: false
+  ansible.builtin.apt:
+      update_cache: true
+      upgrade: full
+      autoremove: true
+      force: true
+      install_recommends: false
   async: 1200
   poll: 20
   when: not ansible_check_mode and ansible_os_family == "Debian"
 
 - name: Debian check Update repo and upgrade installed packages
-  apt:
-    update_cache: true
-    upgrade: full
-    autoremove: true
-    force: true
-    install_recommends: false
+  ansible.builtin.apt:
+      update_cache: true
+      upgrade: full
+      autoremove: true
+      force: true
+      install_recommends: false
   when: ansible_check_mode and ansible_os_family == "Debian"
 
 - name: RedHat Update repo and upgrade installed packages
-  yum:
-    update_cache: true
-    name: '*'
-    state: latest
+  ansible.builtin.yum:
+      update_cache: true
+      name: '*'
+      state: latest
   when: ansible_os_family == "RedHat"
 
 - name: Remove unecessary packages if present
-  apt:
-    name: "{{ packages_to_remove }}"
-    autoremove: true
-    purge: true
-    state: absent
+  ansible.builtin.apt:
+      name: "{{ packages_to_remove }}"
+      autoremove: true
+      purge: true
+      state: absent
   when: ansible_os_family == "Debian"
 
 - name: Remove unecessary files if present
-  file:
-    path: "{{ item }}"
-    state: absent
+  ansible.builtin.file:
+      path: "{{ item }}"
+      state: absent
   when: ansible_os_family == "Debian"
   with_items: "{{ files_to_remove }}"
 
 - name: Remove unecessary users if present
-  user:
-    name: "{{ item }}"
-    remove: true
-    state: absent
+  ansible.builtin.user:
+      name: "{{ item }}"
+      remove: true
+      state: absent
   with_items: "{{ users_to_remove }}"
 
-- name: disable dynamic motd news
-  lineinfile:
-    name: "/etc/default/motd-news"
-    regexp: "ENABLED=1"
-    line: "ENABLED=0"
-    mode: '0644'
+- name: Disable dynamic motd news
+  ansible.builtin.lineinfile:
+      name: "/etc/default/motd-news"
+      regexp: "ENABLED=1"
+      line: "ENABLED=0"
+      mode: '0644'
   when: ansible_os_family == "Debian"
-  ignore_errors: yes
+  ignore_errors: true
 
 - name: Copy nosnap file
-  copy:
-    src: nosnap
-    dest: /etc/apt/preferences.d/nosnap
-    owner: root
-    group: root
-    mode: '0644'
+  ansible.builtin.copy:
+      src: nosnap
+      dest: /etc/apt/preferences.d/nosnap
+      owner: root
+      group: root
+      mode: '0644'
   when: ansible_os_family == "Debian"
 
 - name: Remove Unattended Upgrades
-  apt:
-    name: "unattended-upgrades"
-    autoremove: true
-    purge: true
-    state: absent
+  ansible.builtin.apt:
+      name: "unattended-upgrades"
+      autoremove: true
+      purge: true
+      state: absent
   when: ansible_os_family == "Debian" and inventory_hostname not in groups.maintenance_contract
   tags: unattended-upgrade
 
 - name: Install Unattended Upgrades
-  apt:
-    name: "unattended-upgrades"
-    state: present
+  ansible.builtin.apt:
+      name: "unattended-upgrades"
+      state: present
   when: ansible_os_family == "Debian" and inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
 
-- name: enable apt auto upgrades
-  copy:
-    src: apt-auto-upgrades
-    dest: /etc/apt/apt.conf.d/20auto-upgrades
-    owner: root
-    group: root
-    mode: '0644'
+- name: Enable apt auto upgrades
+  ansible.builtin.copy:
+      src: apt-auto-upgrades
+      dest: /etc/apt/apt.conf.d/20auto-upgrades
+      owner: root
+      group: root
+      mode: '0644'
   when: ansible_os_family == "Debian"
 
 - name: Copy Unattended Upgrades configuration
-  template:
-    src: 'apt-unattended-upgrades.j2'
-    dest: '/etc/apt/apt.conf.d/50unattended-upgrades'
-    owner: root
-    group: root
-    mode: '0644'
+  ansible.builtin.template:
+      src: 'apt-unattended-upgrades.j2'
+      dest: '/etc/apt/apt.conf.d/50unattended-upgrades'
+      owner: root
+      group: root
+      mode: '0644'
   when: inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
 
 - name: Create apt-daily timer directory if it does not exist
   ansible.builtin.file:
-    path: '/etc/systemd/system/apt-daily.timer.d'
-    state: directory
-    owner: root
-    group: root
-    mode: '0755'
+      path: '/etc/systemd/system/apt-daily.timer.d'
+      state: directory
+      owner: root
+      group: root
+      mode: '0755'
   when: inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
 
-- name: override apt-daily timer
+- name: Override apt-daily timer
   ansible.builtin.copy:
-    src: 'apt-daily.timer'
-    dest: '/etc/systemd/system/apt-daily.timer.d/override.conf'
-    owner: root
-    group: root
-    mode: '0644'
+      src: 'apt-daily.timer'
+      dest: '/etc/systemd/system/apt-daily.timer.d/override.conf'
+      owner: root
+      group: root
+      mode: '0644'
   when: inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
   notify:
-    - restart-apt-update-timer
+      - Restart apt-update-timer
 
 - name: Create apt-daily-upgrade timer directory if it does not exist
   ansible.builtin.file:
-    path: '/etc/systemd/system/apt-daily-upgrade.timer.d'
-    state: directory
-    owner: root
-    group: root
-    mode: '0755'
+      path: '/etc/systemd/system/apt-daily-upgrade.timer.d'
+      state: directory
+      owner: root
+      group: root
+      mode: '0755'
   when: inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
 
-- name: override apt-daily-upgrade timer
+- name: Override apt-daily-upgrade timer
   ansible.builtin.copy:
-    src: 'apt-daily-upgrade.timer'
-    dest: '/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf'
-    owner: root
-    group: root
-    mode: '0644'
+      src: 'apt-daily-upgrade.timer'
+      dest: '/etc/systemd/system/apt-daily-upgrade.timer.d/override.conf'
+      owner: root
+      group: root
+      mode: '0644'
   when: inventory_hostname in groups.maintenance_contract
   tags: unattended-upgrade
   notify:
-    - restart-apt-upgrade-timer
-
-- name: Create {{ host_user }} group
-  group:
-    name: "{{ host_user }}"
-
-- name: Create {{ host_user }} user
-  user:
-    name: "{{ host_user }}"
-    group: "{{ host_user }}"
-    password: "{{ host_password | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}"
-    generate_ssh_key: true
-    ssh_key_file: .ssh/id_ed25519
-    ssh_key_type: ed25519
-    shell: /bin/bash
+      - Restart apt-upgrade-timer
+
+- name: Create group {{ host_user }}
+  ansible.builtin.group:
+      name: "{{ host_user }}"
+
+- name: Create user {{ host_user }}
+  ansible.builtin.user:
+      name: "{{ host_user }}"
+      group: "{{ host_user }}"
+      password: "{{ host_password | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}"
+      generate_ssh_key: true
+      ssh_key_file: .ssh/id_ed25519
+      ssh_key_type: ed25519
+      shell: /bin/bash
   register: publickey
 
 - name: Save public key to hostvars for SFTP
-  lineinfile:
-    name: "host_vars/{{ inventory_hostname }}"
-    regexp: "host_user_public_key:"
-    line: "host_user_public_key: {{ publickey.ssh_public_key }}"
-    mode: '0664'
+  ansible.builtin.lineinfile:
+      name: "host_vars/{{ inventory_hostname }}"
+      regexp: "host_user_public_key:"
+      line: "host_user_public_key: {{ publickey.ssh_public_key }}"
+      mode: '0664'
   connection: local
   become: false
   delegate_to: localhost
 
-- name: Create {{ host_user2 }} group
-  group:
-    name: "{{ host_user2 }}"
+- name: Create group {{ host_user2 }}
+  ansible.builtin.group:
+      name: "{{ host_user2 }}"
   when: host_user2 is defined
 
-- name: Create {{ host_user2 }} user
-  user:
-    name: "{{ host_user2 }}"
-    group: "{{ host_user2 }}"
-    password: "{{ host_password2 | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}"
-    generate_ssh_key: true
-    ssh_key_file: .ssh/id_ed25519
-    ssh_key_type: ed25519
-    shell: /bin/bash
+- name: Create user {{ host_user2 }}
+  ansible.builtin.user:
+      name: "{{ host_user2 }}"
+      group: "{{ host_user2 }}"
+      password: "{{ host_password2 | password_hash('sha512', 65534 | random(seed=inventory_hostname) | string) }}"
+      generate_ssh_key: true
+      ssh_key_file: .ssh/id_ed25519
+      ssh_key_type: ed25519
+      shell: /bin/bash
   when: host_user2 is defined
 
-- name: add user(s) in sudoers
-  template:
-    src: sudoers.j2
-    dest: /etc/sudoers
-    owner: root
-    group: root
-    mode: '440'
-    validate: /usr/sbin/visudo -cf %s
+- name: Add user(s) in sudoers
+  ansible.builtin.template:
+      src: sudoers.j2
+      dest: /etc/sudoers
+      owner: root
+      group: root
+      mode: '440'
+      validate: /usr/sbin/visudo -cf %s
   tags: sudoers
 
-- name: quiet nagios authentification
+- name: Quiet nagios authentification
   ansible.builtin.copy:
-    src: 'pam-sudo'
-    dest: '/etc/pam.d/sudo'
-    owner: root
-    group: root
-    mode: '0644'
-
-- name: add public key to authorized keys for {{ host_user }}
-  authorized_key:
-    key: "{{ default_ssh_public_keys }}"
-    user: "{{ host_user }}"
-    exclusive: true
+      src: 'pam-sudo'
+      dest: '/etc/pam.d/sudo'
+      owner: root
+      group: root
+      mode: '0644'
+
+- name: Add public key to authorized keys for {{ host_user }}
+  ansible.posix.authorized_key:
+      key: "{{ default_ssh_public_keys }}"
+      user: "{{ host_user }}"
+      exclusive: true
   tags: sshd
 
-- name: add public key to authorized keys for {{ host_user2 }}
-  authorized_key:
-    key: "{{ host_user2_pubkey }}"
-    user: "{{ host_user2 }}"
-    exclusive: true
+- name: Add public key to authorized keys for {{ host_user2 }}
+  ansible.posix.authorized_key:
+      key: "{{ host_user2_pubkey }}"
+      user: "{{ host_user2 }}"
+      exclusive: true
   when: host_user2 is defined and host_user2_pubkey is defined
   tags: sshd
 
-- name: make sure /etc/ssh/ssh_host_ed25519_key exists
-  stat:
-    path: /etc/ssh/ssh_host_ed25519_key
+- name: Make sure /etc/ssh/ssh_host_ed25519_key exists
+  ansible.builtin.stat:
+      path: /etc/ssh/ssh_host_ed25519_key
   register: ssh_host_exists
   tags: sshd
 
 - name: Generate /etc/ssh/ssh_host_ed25519_key if missing
-  command: ssh-keygen -A
+  ansible.builtin.command: ssh-keygen -A
   when: not ssh_host_exists.stat.exists and not ansible_check_mode
   tags: sshd
 
 - name: Copy sshd_config file
-  template:
-    src: sshd_config.j2
-    dest: /etc/ssh/sshd_config
-    owner: root
-    group: root
-    mode: '0644'
-    validate: /usr/sbin/sshd -t -f %s
-  notify: restart-sshd
+  ansible.builtin.template:
+      src: sshd_config.j2
+      dest: /etc/ssh/sshd_config
+      owner: root
+      group: root
+      mode: '0644'
+      validate: /usr/sbin/sshd -t -f %s
+  notify: Restart SSHD
   tags: sshd
 
 - name: Enable SSH daemon service
-  service:
-    name: ssh
-    enabled: true
+  ansible.builtin.service:
+      name: ssh
+      enabled: true
 
 - name: Copy bashrc file with session timeout
-  copy:
-    src: bash.bashrc
-    dest: /etc/bash.bashrc
-    owner: root
-    group: root
-    mode: '0644'
+  ansible.builtin.copy:
+      src: bash.bashrc
+      dest: /etc/bash.bashrc
+      owner: root
+      group: root
+      mode: '0644'
   when: ansible_os_family == "Debian"
 
 - name: Add session timeout
-  blockinfile:
-    path: /etc/bashrc
-    block: |
-      TMOUT=900
-      readonly TMOUT
-      export TMOUT
+  ansible.builtin.blockinfile:
+      path: /etc/bashrc
+      block: |
+          TMOUT=900
+          readonly TMOUT
+          export TMOUT
   when: ansible_os_family == "RedHat"
 
-- name: disable ipv6
-  sysctl:
-    name: "net.ipv6.conf.all.forwarding"
-    value: '1'
-    sysctl_set: true
-
-- name: setup ipv6
-  template:
-    src: 51-ipv6.yaml.j2
-    dest: /etc/netplan/51-ipv6.yaml
-    owner: root
-    group: root
-    mode: '0644'
+- name: Enable ipv6 forwarding
+  ansible.posix.sysctl:
+      name: "net.ipv6.conf.all.forwarding"
+      value: '1'
+      sysctl_set: true
+
+- name: Setup ipv6
+  ansible.builtin.template:
+      src: 51-ipv6.yaml.j2
+      dest: /etc/netplan/51-ipv6.yaml
+      owner: root
+      group: root
+      mode: '0644'
   when: ipv6_address is defined and inventory_hostname in groups['manual_ipv6']
 
-- name: set default path
-  template:
-    src: environment.j2
-    dest: /etc/environment
-    owner: root
-    group: root
-    mode: '0644'
+- name: Set default path
+  ansible.builtin.template:
+      src: environment.j2
+      dest: /etc/environment
+      owner: root
+      group: root
+      mode: '0644'
   when: ansible_os_family == "Debian"
 
 - name: Check if backup servers present in root known hosts
-  lineinfile:
-    path: /root/.ssh/known_hosts
-    regexp: "{{ hostvars[item].host_server_public_key }}"
-    state: absent
+  ansible.builtin.lineinfile:
+      path: /root/.ssh/known_hosts
+      regexp: "{{ hostvars[item].host_server_public_key }}"
+      state: absent
   check_mode: true
   changed_when: false
   register: known_hosts_line
   with_items: "{{ groups.backup_server }}"
 
 - name: Add backup servers in root known host
-  known_hosts:
-    hash_host: true
-    key: "{{ hostvars[item['item']].host_server_known_entry }}"
-    name: "[{{ hostvars[item['item']].ansible_host }}]:{{ default_sshd_port }}"
+  ansible.builtin.known_hosts:
+      hash_host: true
+      key: "{{ hostvars[item['item']].host_server_known_entry }}"
+      name: "[{{ hostvars[item['item']].ansible_host }}]:{{ default_sshd_port }}"
   when: item.found is not defined
   with_items: "{{ known_hosts_line.results }}"
 
 - name: Copy Installed Package Listing script on server
-  template:
-    src: collect_installed_packages_facts_{{ ansible_os_family }}.sh.j2
-    dest: /root/collect_installed_packages_facts.sh
-    owner: root
-    group: root
-    mode: '0700'
-
-- name: disable e-mailing of crontab
-  cron:
-    name: MAILTO
-    env: true
-    job: ""
-
-- name: add cron job to check installed packages every day
-  cron:
-    name: collect installed packages facts
-    minute: "43"
-    hour: "0"
-    job: /root/collect_installed_packages_facts.sh
+  ansible.builtin.template:
+      src: collect_installed_packages_facts_{{ ansible_os_family }}.sh.j2
+      dest: /root/collect_installed_packages_facts.sh
+      owner: root
+      group: root
+      mode: '0700'
+
+- name: Disable e-mailing of crontab
+  ansible.builtin.cron:
+      name: MAILTO
+      env: true
+      job: ""
+
+- name: Add cron job to check installed packages every day
+  ansible.builtin.cron:
+      name: collect installed packages facts
+      minute: "43"
+      hour: "0"
+      job: /root/collect_installed_packages_facts.sh
diff --git a/vars/Debian.yml b/vars/Debian.yml
index 61ed1d6..8fbddb3 100644
--- a/vars/Debian.yml
+++ b/vars/Debian.yml
@@ -1,18 +1,18 @@
 ---
 packages_to_remove:
-  - samba*
-  - snapd
-  - popularity-contest
-  - ubuntu-advantage-tools
+    - samba*
+    - snapd
+    - popularity-contest
+    - ubuntu-advantage-tools
 files_to_remove:
-  - /etc/dhcp/dhclient-enter-hooks.d/samba
-  - /root/snap
-  - /home/{{ host_user }}/snap
-  - /snap
-  - /usr/games
-  - /usr/local/games
-  - /var/cache/snapd
-  - /var/snap
-  - /var/lib/snapd
+    - /etc/dhcp/dhclient-enter-hooks.d/samba
+    - /root/snap
+    - /home/{{ host_user }}/snap
+    - /snap
+    - /usr/games
+    - /usr/local/games
+    - /var/cache/snapd
+    - /var/snap
+    - /var/lib/snapd
 users_to_remove:
-  - zabbix
+    - zabbix
diff --git a/vars/RedHat.yml b/vars/RedHat.yml
index 1fb5304..19762d8 100644
--- a/vars/RedHat.yml
+++ b/vars/RedHat.yml
@@ -2,4 +2,4 @@
 packages_to_remove: []
 files_to_remove: []
 users_to_remove:
-  - zabbix
+    - zabbix
-- 
GitLab