4.1 KiB
Chapitre 1.0 : Décourverte Ansible
Pourquoi Ansible ?
- Beaucoup de tâches répétitive dans l'adminsys (dépôt de clés, configuration récurrente )
L'objectif est d'apprendre à faire tout ça avec Ansible pour gagner beaucoup de temps. En plus de ça c'est un gain de sécurité potentiel car on fait la config une seule fois. Les fois suivantes c'est Ansible qui s'en charge.
Ansible est très modulaire et exécute les tâches de manière intelligente. Si une tâche à déjà été faite (ex. dépôt de clé) il ne la refait pas.
Documentation officielle : https://docs.ansible.com/ansible/latest/index.html
Templating avec Jinja2
Permet de générer dynamiquement un fichier de configuration à partir de variables.
Exemple :
Voici un bout de rôle Ansible et notament un des fichiers de template
auto lo
iface lo inet loopback
{% set ports = [] %}
{% for port in ovs_ports | default([]) %}{{ports.append( port.interface )}}{% endfor %}
{% for interface in interface_list | default([]) %}
{% if interface not in ports | default(false) %}
iface {{interface}} inet manual
{% endif %}
{% endfor %}
{% include 'ovs.j2' %}
Fonctionne à partir des variables suivantes :
interface_list: [eno1,eno2]
ovs_ports:
- interface: eno1
bridge: vmbr0
Lien du role : https://github.com/coimbrap/ansible-role-ovs
Notion de rôle
Un rôle regroupe une liste de "task", ce qui revient à une liste de tâche à effectuer.
Ces tasks utilise des variables afin d'être modulaire. Ces variables sont initialisé dans les sources du rôles (dans le dossier defaults)
Avec un rôle bien fait nous n'avons pas à toucher aux sources du rôle, il nous suffit de modifier les valeurs des variables.
Structure d'un projet Ansible
-
Un fichier de configuration :
ansible.cfg
Défini les variables globale (connexion, inventaire...) -
Un fichier d'inventaire :
inventory.ini
Liste toutes les machines ainsi que les groupes de machines. -
Les playbooks : C'est ce que l'on exécute, exécute un ou plusieurs rôles sur une ou plusieurs machines ou des groupes de machines.
Variables Ansible
- group_vars: Variables locales à un groupe de machines
- Des variables globales à tout les conteneurs peuvent être définie dans un dossier all
- host_vars: Variables locales à une machine
Environnement virtualenv python
Nécessaire pour utiliser Ansible
Initialisation :
apt-get install python3-virtualenv
virtualenv env
source env/bin/activate
pip install ansible
Pour rentrer source env/bin/activate
, pour sortir deactivate
Exemple
Création d'un conteneur
Le rôle des CT : https://git.elukerio.org/elukerio/ansible-role-create-ct Le rôle sshkeys : https://git.elukerio.org/elukerio/ansible-role-sshkeys
Rédaction de l'inventaire :
Version INI
[krhacken]
test
host_vars/test
ct_name: test
# ID: 100-253
ct_vmid: 231
# Nodes: [zeus,jupiter]
ct_node: zeus
node_bastion: bastion
# Vlans:
ct_if: vmbr1
ct_vlan: 50
ct_prefix6: "fd2e:9d2b:16eb:30"
proxy_ip: "2001:ab8:1207:1509::f00d"
ct_cpus: 2
ct_ram: 1024
ct_swap: 0
ct_storage: local-zfs
ct_disk: 16
ct_template: local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz
ct_onboot: 1
ct_unprivileged: 1
On doit définir un mot de passe dans host_vars/test/passwd.yml
On l'encrypte : ansible-vault encrypt passwd.yml
NB : Il faut avoir défini un secret dans un fichier secret
(à ajouter dans le .gitignore) dans le dossier racine d'Ansible.
On lance ce rôle à partir d'un playbook du style :
- hosts: krhacken
connection: ssh
gather_facts: no
roles:
- create-ct
- sshkeys
On lance le playbook avec ansible-playbook playbooks/create-ct.yml
ansible fait le reste.
-- FIN --
Exemple de fichier ansible.cfg
[defaults]
inventory = inventory.ini
stdout_callback = debug
interpreter_python = auto_silent
gathering = smart
gather_timeout = 20
roles_path = roles
host_key_checking = False
callback_whitelist = timer, mail, profile_tasks
timeout = 30
vault_password_file = ./secret
[ssh_connection]
pipelining = True