Installation

  • Le serveur ansible sera nommé (ans) et la machine à piloter (foo).
  • Sur ans (Ubuntu 18.04) : apt-get install ansible
  • Sur ans, création d'une paire de clés : ssh-keygen
    • A créer dans /root/.ssh/ansible
    • Pas de Passphrase
  • Sur ans, dans /etc/ansible/ansible.cfg :
    • remote_port = 22
    • host_key_checking = true ou false (au choix)
    • remote_user = root
    • private_key_file = /root/.ssh/ansible
  • Configuration de la machine cible (@ip 1.2.3.4) :
    • Sur foo, installez un serveur ssh
    • sur foo, dans "/etc/ssh/sshd_config" :
      • Port 2200 (par exemple)
      • PermitRootLogin yes
    • Sur foo, restart du serveur ssh
    • Sur ans : ssh-copy-id -i /root/.ssh/ansible.pub -p 2200 root@1.2.3.4
    • Sur foo : dans "/etc/ssh/sshd_config" :
      • PermitRootLogin without-password
    • Sur foo, restart du serveur ssh
  • Sur ans, configurez le fichier /etc/ansible/hosts :
    foo    ansible_host=1.2.3.4    ansible_port=2200    ansible_user=root

Utilisation en ligne de commande

  • En règle générale, il faut écrire "ansible" puis le nom du module utilisé "-m shell", puis les éventuelles options "-a cat /etc/fstab", et enfin la machine, ou le groupe de machine définie dans le fichier /etc/ansible/hosts "foo". Ce qui donne simplement : ansible -m shell -a "cat /etc/fstab" foo
  • La liste complète des modules utilisables est disponible sur le site : https://docs.ansible.com

Le langage YAML

  • Ce langage permet de décrire des listes, sans utiliser de balises. C'est un concurent au langage XML.
  • L'indentation est très importante en YAML. Il faut utiliser 2 espaces, ou 4 espaces, ou encore 6 espaces, mais jamais les tabulations !
  • Un tiret "-" déclare un élément dans une liste. Attention aux espaces !
  • Ce tutoriel sur YAML est facile à comprendre : sweetohm.net
- eleve: ezola
  nom: ZOLA
  prenom: Emile
- eleve: jverne
  nom: VERNE
  prenom: Jules
  classe: 1STMG

Utilisation des playbooks YAML

  • Il est possible de regrouper plusieures commandes ansible dans un fichier YAML
  • Exemple d'appel d'un playbook, avec passage de paramètres :
    ansible-playbook /root/unTest.yml -e 'v1=yes v2=/tmp'

Exemple 1 : Backup d'un conteneur LXD (version simple)

  • A utiliser avec la commande : ansible-playbook /root/exemple1.yml -e 'cible=uneMachineVirtuelle'
  • Le script "scriptBackupLxd" est identique à celui-ci
  • Le fichier txz sera copié sur un partage Microsoft "backup" à l'adresse 192.168.1.10
- hosts: localhost
  tasks:
    - shell: mount.cifs //192.168.1.10/backup  /mnt -o vers=1.0,username=toto,password=azerty,noserverino
      failed_when: false

- hosts: foo
  tasks:
    - copy: src=/root/scriptBackupLxd dst=/usr/local/sbin/scriptBackupLxd owner=root group=root mode=0750
    - shell: /usr/local/sbin/scriptBackupLxd {{cible}}
    - fetch: src={{cible}}.txz dest=/mnt/{{cible}}.txz flat=yes

- hosts: localhost
  tasks:
    - shell: umount /mnt

Exemple 2 : Backup d'un conteneur LXD (version à utiliser)

  • Première amélioration : scriptBackupLxd est déposé sur un nas dans le partage ansible. Cela permet une meilleure gestion des versions.
  • Deuxième amélioration : Utilisation d'un block. Si une erreur survient, par exemple en cas de "exit 1" sur scriptBackupLxd, la suite du block est ignorée et c'est la partie rescue qui est activée.
- hosts: localhost
  tasks:
    - shell: mount.cifs //192.168.1.10/ansible /media/iAnsible -o vers=1.0,username=tata,password=qsdfgh,noserverino
      failed_when: false
    - shell: mount.cifs //192.168.1.10/backup /media/iBackup -o vers=1.0,username=toto,password=azerty,noserverino
      failed_when: false

- hosts: foo
  tasks:
    - block:
      - copy: src=/media/iAnsible/scriptBackupLxd dst=/usr/local/sbin/scriptBackupLxd owner=root group=root mode=0750
      - debug: msg="Création de l'archive txz sur le serveur"
      - shell: /usr/local/sbin/scriptBackupLxd {{cible}}
      - debug: msg="Copie de l'archive sur le NAS"
      - fetch: src={{cible}}.txz dest=/mnt/{{cible}}.txz flat=yes
      - file: path={{cible}}.txz state=absent
      rescue:
      - debug: msg="Annulation du backup"

- hosts: localhost
  tasks:
    - shell: umount /media/iAnsible
    - shell: umount /media/iBackup