diff --git a/.ansible-lint b/.ansible-lint
new file mode 100644
index 0000000000000000000000000000000000000000..8d40d067c46c42adf88f5922bc7fc9c6407ce7bb
--- /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 0000000000000000000000000000000000000000..fbebdb8c3eabfec06b071490a73331e2e80152fe
--- /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 2f7cbb9f27107ffd4662e52a314724860062ff59..70caa65943cc168681320ed0fdbd3e47f4d5e604 100644
--- a/handlers/main.yml
+++ b/handlers/main.yml
@@ -1,4 +1,6 @@
 ---
 
-- name: restart-sshd
-  service: name=sshd state=restarted
+- name: Restart SSHD
+  ansible.builtin.service:
+      name: sshd
+      state: restarted
diff --git a/meta/main.yml b/meta/main.yml
index f877ec6dac92ae0d600215749339c400a9108617..aed1e41bdbd0db1c44207701d66f89d5dde19878 100644
--- a/meta/main.yml
+++ b/meta/main.yml
@@ -1,18 +1,15 @@
 ---
 galaxy_info:
-  author: Rémi
-  description: Role to configure backup server to allow SFTP connection from all other servers
-  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:
-    - backup
-    - sftp
+    author: lefilament
+    description: Role to configure backup server to allow SFTP connection from all other servers
+    company: Le Filament (https://le-filament.com)
+    license: AGPL-3.0-or-later
+    min_ansible_version: "2.1"
+    platforms:
+        - name: Ubuntu
+          versions:
+              - bionic
+              - focal
+    galaxy_tags:
+        - backup
+        - sftp
diff --git a/tasks/main.yml b/tasks/main.yml
index 3bcf5d9d58ae9e0002b734d066cf17768653dbb2..d879ba533cc4cd1fa7cd671bb1401b60a7fa0082 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -1,111 +1,111 @@
 ---
 
 - name: Create SFTP group
-  group:
-    name: sftpgroup
+  ansible.builtin.group:
+      name: sftpgroup
 
 - name: Create SFTP users
-  user:
-    name: "{{ hostvars[item].backup_sftp_user }}"
-    group: sftpgroup
-    password: "!"
-    shell: /sbin/nologin
+  ansible.builtin.user:
+      name: "{{ hostvars[item].backup_sftp_user }}"
+      group: sftpgroup
+      password: "!"
+      shell: /sbin/nologin
   with_items: "{{ groups.all | difference(groups.backup_server) }}"
 
-- name: add SFTP users public key to authorized keys
-  authorized_key:
-    key: "{{ hostvars[item].host_user_public_key }}"
-    user: "{{ hostvars[item].backup_sftp_user }}"
-    exclusive: true
+- name: Add SFTP users public key to authorized keys
+  ansible.posix.authorized_key:
+      key: "{{ hostvars[item].host_user_public_key }}"
+      user: "{{ hostvars[item].backup_sftp_user }}"
+      exclusive: true
   with_items: "{{ groups.all | difference(groups.backup_server) }}"
 
-- name: create templates directory
-  file:
-    name: templates
-    state: directory
-    mode: '0755'
+- name: Create templates directory
+  ansible.builtin.file:
+      name: templates
+      state: directory
+      mode: '0755'
   connection: local
   become: false
   delegate_to: localhost
   tags: sshd
 
 - name: Get sshd_config file from init_server role locally
-  get_url:
-    url: "https://sources.le-filament.com/lefilament/ansible-roles/init_server/-/raw/master/templates/sshd_config.j2"
-    dest: templates/sshd_config.j2
-    mode: '0644'
+  ansible.builtin.get_url:
+      url: "https://sources.le-filament.com/lefilament/ansible-roles/init_server/-/raw/master/templates/sshd_config.j2"
+      dest: templates/sshd_config.j2
+      mode: '0644'
   connection: local
   become: false
   delegate_to: localhost
   tags: sshd
 
 - name: Copy sshd_config file
-  template:
-    src: templates/sshd_config.j2
-    dest: /etc/ssh/sshd_config
-    owner: root
-    group: root
-    mode: '0644'
-  notify: restart-sshd
+  ansible.builtin.template:
+      src: templates/sshd_config.j2
+      dest: /etc/ssh/sshd_config
+      owner: root
+      group: root
+      mode: '0644'
+  notify: Restart SSHD
   tags: sshd
 
-- name: add pip package
-  apt:
-    name: "{{ python_apt_packages }}"
-    force: true
-    install_recommends: false
+- name: Add pip package
+  ansible.builtin.apt:
+      name: "{{ python_apt_packages }}"
+      force: true
+      install_recommends: false
 
-- name: check that chroot directory for SFTP users exist
-  file:
-    name: /backup/sftp
-    state: directory
-    owner: root
-    group: root
-    mode: '0755'
+- name: Check that chroot directory for SFTP users exist
+  ansible.builtin.file:
+      name: /backup/sftp
+      state: directory
+      owner: root
+      group: root
+      mode: '0755'
 
-- name: check that directories for SFTP for all servers exist
-  file:
-    name: /backup/sftp/{{ hostvars[item].inventory_hostname | lower }}
-    state: directory
-    owner: "{{  hostvars[item].backup_sftp_user }}"
-    group: sftpgroup
-    mode: '0755'
+- name: Check that directories for SFTP for all servers exist
+  ansible.builtin.file:
+      name: /backup/sftp/{{ hostvars[item].inventory_hostname | lower }}
+      state: directory
+      owner: "{{  hostvars[item].backup_sftp_user }}"
+      group: sftpgroup
+      mode: '0755'
   with_items: "{{ groups.all | difference(groups.backup_server) }}"
 
-- name: check that directory for collecting openstack Cloud facts exists
-  file:
-    name: /backup/{{ item }}
-    state: directory
-    owner: lefilament
-    group: lefilament
-    mode: '0755'
+- name: Check that directory for collecting openstack Cloud facts exists
+  ansible.builtin.file:
+      name: /backup/{{ item }}
+      state: directory
+      owner: lefilament
+      group: lefilament
+      mode: '0755'
   with_items:
-    - cloud
-    - odoo
-    - odoo2
-    - versions
+      - cloud
+      - odoo
+      - odoo2
+      - versions
 
-- name: install swift client
-  pip:
-    name: "{{ swift_pip_packages }}"
+- name: Install swift client
+  ansible.builtin.pip:
+      name: "{{ swift_pip_packages }}"
 
 - name: Copy OpenStack Fact Collection scripts on server
-  template:
-    src: "{{ item.script }}.j2"
-    dest: /root/{{ item.script }}
-    owner: root
-    group: root
-    mode: '0700'
+  ansible.builtin.template:
+      src: "{{ item.script }}.j2"
+      dest: /root/{{ item.script }}
+      owner: root
+      group: root
+      mode: '0700'
   with_items: '{{ collect_backups }}'
   loop_control:
-    label: '{{ item.name }}'
+      label: '{{ item.name }}'
 
-- name: add cron job to retrieve backup list every day
-  cron:
-    name: "{{ item.name }}"
-    minute: "{{ item.minute }}"
-    hour: "{{ item.hour }}"
-    job: /root/{{ item.script }}
+- name: Add cron job to retrieve backup list every day
+  ansible.builtin.cron:
+      name: "{{ item.name }}"
+      minute: "{{ item.minute }}"
+      hour: "{{ item.hour }}"
+      job: /root/{{ item.script }}
   with_items: '{{ collect_backups }}'
   loop_control:
-    label: '{{ item.name }}'
+      label: '{{ item.name }}'
diff --git a/vars/main.yml b/vars/main.yml
index 4097c671f6ee2df96e58b2c522848cc549d56d8e..bb3c6042ede52c7d705bdd004e61f515329e561d 100644
--- a/vars/main.yml
+++ b/vars/main.yml
@@ -1,28 +1,28 @@
 ---
 python_apt_packages:
-  - python3-pip
-  - python3-dev
-  - python3-setuptools
-  - python3-wheel
+    - python3-pip
+    - python3-dev
+    - python3-setuptools
+    - python3-wheel
 
 swift_pip_packages:
-  - python-swiftclient
-  - python-keystoneclient
+    - python-swiftclient
+    - python-keystoneclient
 
 collect_backups:
-  - name: "check openstack cloud facts"
-    script: retrieve_openstack_cloud_facts.sh
-    hour: 4
-    minute: 30
-  - name: "check openstack odoo facts"
-    script: retrieve_openstack_odoo_facts.sh
-    hour: 4
-    minute: 45
-  - name: "check openstack odoo2 facts"
-    script: retrieve_openstack_odoo2_facts.sh
-    hour: 2
-    minute: 0
-  - name: "move versioned files"
-    script: move_versioned_files.sh
-    hour: 7
-    minute: 0
+    - name: "check openstack cloud facts"
+      script: retrieve_openstack_cloud_facts.sh
+      hour: 4
+      minute: 30
+    - name: "check openstack odoo facts"
+      script: retrieve_openstack_odoo_facts.sh
+      hour: 4
+      minute: 45
+    - name: "check openstack odoo2 facts"
+      script: retrieve_openstack_odoo2_facts.sh
+      hour: 2
+      minute: 0
+    - name: "move versioned files"
+      script: move_versioned_files.sh
+      hour: 7
+      minute: 0