Ansible (la suite)

Mon objectif ici est de construire une base d’automatisation pour personnaliser de manière standard mes stations Linux. Je vais m’attacher à utiliser Ansible pour installer et paramètrer mon shell zsh. Ce sera l’occasion d’utiliser les notions de templates (Jinja) et de variables.

Création de la structure du projet

source ansible2.9.2/bin/activate
ansible-galaxy init custom_system

Construction du rôle

Le rôle Ansible effectuera les tâhes suivante :

  1. Installation des paquets zsh et git
  2. Installation de oh-my-zsh (via clone git)
  3. Réglage des permissions
  4. Définition du shell par défaut
  5. Création du fichier de configuration par défaut

custom_system/tasks/main.yml

---
- name: 'zsh : install zsh' (1)
  apt:
      name:
        - zsh
        - git
      state: present
      update_cache: yes
      install_recommends: no
  become: yes

- name: clone oh-my-zsh for users (2)
  tags:
    # Suppress warning: [ANSIBLE0006] git used in place of git module
    # Git module doesn't allow us to set `core.autocrlf=input`.
    - skip_ansible_lint
  become: yes
  become_user: '{{ item }}'
  # core.autocrlf=input prevents https://github.com/robbyrussell/oh-my-zsh/issues/4402
  command: 'git clone -c core.autocrlf=input --depth=1 https://github.com/robbyrussell/oh-my-zsh.git .oh-my-zsh'
  args:
    chdir: '~{{ item }}'
    creates: '~{{ item }}/.oh-my-zsh'
  loop: "{{ usernames }}"

- name: set permissions of oh-my-zsh for users (3)
  become: yes
  file:
    path: '~{{ item }}/.oh-my-zsh'
    mode: 'go-w'
    recurse: yes
  loop: "{{ usernames }}"

- name: set default shell for users (4)
  become: yes
  user:
    name: '{{ item }}'
    shell: /bin/zsh
  loop: "{{ usernames }}"

- name: write .zshrc for users (5)
  become: yes
  become_user: '{{ item }}'
  template:
    src: zshrc.j2
    dest: '~{{ item }}/.zshrc'
    backup: yes
    mode: 'u=rw,go=r'
  loop: "{{ usernames }}"

Afin d’appliquer la configuration à plusieurs comptes, on utilise la fonction loop qui va extraire chacune des lignes du tableau usernames et le placer dans item.

La configuration zsh pour l’utilisateur est défini dans le fichier .zshrc, afin d’adapter les paramètres j’exploite un template dans lequel je substitue la variable oh_my_zsh_plugins avec un tableau transformé en une liste avec comme séparateur l’espace (join ' ‘).

custom_system/templates/zshrc.j2

export ZSH=$HOME/.oh-my-zsh

ZSH_THEME="af-magic"

DISABLE_AUTO_UPDATE="true"

# Format: plugins=(rails git textmate ruby lighthouse)
plugins=({{ oh_my_zsh_plugins | join(' ') }})

source $ZSH/oh-my-zsh.sh

Les variables peuvent être déclaré à différent niveau, afin de simplifier la configuration je retiens la déclaration au sein de l’inventaire.

inventory.yml

myhosts:
  hosts:
    192.168.112.132:
    192.168.112.130:
  vars:

     usernames:
      - "eric"
      - "root"

     oh_my_zsh_plugins:
      - "git"
      - "z"   

Execution

Il reste à créer un playbook qui fait appel au rôle et l’applique à l’ensemble des hosts déclarés dans l’inventaire :

playbook.yml

- name: "Initialisation du system"
  hosts: all
  roles:
        - role: "custom_system"

Lancement :

$ ansible-playbochanged playbochanged.yml -i inventory.yml -K --user eric --ask-pass
SSH password:
BECOME password[defaults to SSH password]:

PLAY [Initialisation du system] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
changed: [192.168.112.132]
changed: [192.168.112.130]

TASK [custom_system : zsh : install zsh] **************************************************************************************************************************************************************************
changed: [192.168.112.132]
changed: [192.168.112.130]

TASK [custom_system : clone oh-my-zsh for users] ******************************************************************************************************************************************************************
changed: [192.168.112.130] => (item=eric)
changed: [192.168.112.132] => (item=eric)
changed: [192.168.112.130] => (item=root)
changed: [192.168.112.132] => (item=root)

TASK [custom_system : set permissions of oh-my-zsh for users] *****************************************************************************************************************************************************
changed: [192.168.112.130] => (item=eric)
changed: [192.168.112.132] => (item=eric)
changed: [192.168.112.132] => (item=root)
changed: [192.168.112.130] => (item=root)

TASK [custom_system : set default shell for users] ****************************************************************************************************************************************************************
changed: [192.168.112.132] => (item=eric)
changed: [192.168.112.130] => (item=eric)
changed: [192.168.112.130] => (item=root)
changed: [192.168.112.132] => (item=root)

TASK [custom_system : write .zshrc for users] *********************************************************************************************************************************************************************
changed: [192.168.112.130] => (item=eric)
changed: [192.168.112.132] => (item=eric)
changed: [192.168.112.132] => (item=root)
changed: [192.168.112.130] => (item=root)

PLAY RECAP ********************************************************************************************************************************************************************************************************
192.168.112.130            : ok=6    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.112.132            : ok=6    changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Related