Automate your workstation installation !

@sylvain_metayer

photo

Sylvain MÉTAYER

logo

Tech Lead @Onepoint

Avantages / Inconvénients

Objectif

État

Gérer mes fichiers de configuration

?

Gérer les logiciels installés

?

Versionnable

?

Facilement maintenable

?

Gérer mon poste de travail pro et perso

?

Gestion de secrets

?

Dotfiles, c’est quoi ?

User-specific application configuration is traditionally stored in so called dotfiles (files whose filename starts with a dot).
— https://wiki.archlinux.org/title/Dotfiles

Exemple

~/.bashrc
#!/usr/bin/env bash

if [ -f /etc/bashrc ]; then
 . /etc/bashrc
fi

export SSH_AUTH_SOCK=/run/user/1000/ssh-agent.socket
# ...

Et d’autres : vimrc, gitconfig, …​

Comment fait-on ?

Le bon vieux copier-coller

Copier-coller gif

Avantages / Inconvénients

Objectif

État

Gérer mes fichiers de configuration

✅

Gérer les logiciels installés

❌

Versionnable

😐

Facilement maintenable

❌

Gérer mon poste de travail pro et perso

❌

Gestion de secrets

❌

Un script maison

Du shell, du python, du C, du PHP…​ Venez comme vous êtes, on va coder !

Avantages / Inconvénients

Objectif

État

Gérer mes fichiers de configuration

✅

Gérer les logiciels installés

✅

Versionnable

✅

Facilement maintenable

😐

Gérer mon poste de travail pro et perso

✅

Gestion de secrets

✅

Stow

GNU Stow is a symlink farm manager which takes distinct sets of software and/or data located in separate directories on the filesystem, and makes them all appear to be installed in a single directory tree.
— https://www.gnu.org/software/stow/manual/stow.html#Bootstrapping

Avantages / Inconvénients

Objectif

État

Gérer mes fichiers de configuration

✅

Gérer les logiciels installés

❌

Versionnable

✅

Facilement maintenable

✅

Gérer mon poste de travail pro et perso

😐

Gestion de secrets

❌

Ansible

Concrètement, comment fait-on ?

Tell me more

Structure

├── playbooks
│   ├── demo
│   ├── work
│   ├── ├── main.yaml
├── roles
│   ├── jetbrains_toolbox
│   │   ├── defaults
│   │   ├── tasks
│   │── git_config
│   │   ├── tasks
│   └── [...]

Playbook

- hosts: localhost
  tasks:
    - name: "Simple task"
      debug:
        msg: |-
Hello DevoxxFR ! :)
  roles:
    - role: geerlingguy.docker
      become: true
    - role: git_config

Usage

$ cat scripts/setup.sh
python3 -m pip install --user -r "requirements.txt"
ansible-galaxy role install -r "requirements.yml"
$ cat requirements.txt
ansible==7.0.0
$ cat requirements.yml
roles:
  - src: geerlingguy.docker
    version: 6.1.0

Usage

$ ansible-playbook playbooks/demo/main.yaml -K
BECOME password:
PLAY [localhost] ************************************

TASK [git_config : Ensure Git config file exists] ************************************
ok: [localhost]

TASK [git_config : Render Git config Template] ************************************
changed: [localhost]

PLAY RECAP ************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Playbook run took 0 days, 0 hours, 0 minutes, 1 seconds

Installation de paquets

roles/commons/defaults/main.yaml
packages_to_install:
  - vim
  - firefox
  - code
roles/commons/tasks/main.yaml
- name: Install packages
  become: true
  ansible.builtin.package:
    name: "{{ packages_to_install }}"
    state: present
playbooks/demo/main.yaml
- hosts: localhost
  roles:
    - role: commons
      vars:
        packages_to_install: [vim]

Templating

- name: Template gitconfig
  ansible.builtin.template:
    src: templates/gitconfig.j2
    dest: "~/.gitconfig"
roles/git_config/templates/gitconfig.j2
[user]
{% if git_config_user is defined %}
  name = {{ git_config_user }}
{% endif %}
{% if git_config_email is defined %}
  email = {{ git_config_email }}
{% endif %}

Gestion des secrets

- name: "Copy secret file"
  copy:
    src: "secret_data.txt"
    dest: ~/secret_data.txt
    mode: "0600"

Gestion des secrets

$ANSIBLE_VAULT;1.1;AES256
36643862643964363163333161643539653566386330666363323531306239393830633438373132
6366366637663132376463333763383234306262626233320a656538336633653936303236643038
65633861346437346661346464353536663063646237333931313537383966643033326131623637
3265386338396337350a353066343734383865376236376566363636303864313264643364376663
65393931343435306133386564373966613836353738383735373365626566633464

Gestion des secrets

ansible-vault create secret_data.txt
$ ansible-vault view secret_data.txt
Vault password:
Hello DevoxxFR ! :)
$ ansible-playbook playbooks/demo/main.yaml --ask-vault-pass

Plusieurs postes ?

├── demo
│   ├── main.yaml
└── work
    └── main.yaml

Mais encore ?

Indicateur batterie off
- name: Display battery percentage
  dconf:
    key: "/org/gnome/desktop/interface/show-battery-percentage"
    value: "true"
    state: present
Indicateur batterie on

Windows (regedit) : win_regedit_module

Petite démo

Avantages / Inconvénients

Objectif

État

Gérer mes fichiers de configuration

✅

Gérer les logiciels installés

✅

Versionnable

✅

Facilement maintenable

✅

Gérer mon poste de travail pro et perso

✅

Gestion de secrets

✅

Et si je veux faire…​

Conclusion

Standard