Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

lundi, novembre 28 2022

Ansible Vault

premier pas avec ansible vault :

créer un fichier de clef :

echo "passwd" > ./vault_ansible_pass

Modifier ansible.cfg pour ajouter :

vault_password_file=./vault_ansible_pass

Tester un crypage de chaine :

ansible-vault encrypt_string 'test'

on obtient :

!vault |
          $ANSIBLE_VAULT;1.1;AES256
          32366137346335353631326132326337336364656439313064366532393236633935623962393865
          6435623261396163613363313438643365373362336137320a316365363033663463656232376562
          66356431646238666466323237346464636135343231653263316165633132306134313564363439
          3639333136373638660a323036633265653335323434376530666561353230623162616662333637
          65393832343137356230393332383839393338343837383662366631636338313262

il suffit de copier/coller dans la variable ansible !

Ce fichier est bien entendu secret, et ne doit pas être publié dans git. Une solution est d'utiliser un dossier ~/.ansible_vault et de nommer vos roles selon vos domaines (exemple : vault_ovh_password)

lundi, juillet 26 2021

Ansible coding rules

  • All YAML files named with .yml extension
  • Use 2 (two) spaces for each indent
  • Use spaces around jinja variables (eg. var , not var)
  • Variables that are internal to the role should be lowercase
  • Keep roles self-contained. Roles should avoid including tasks from other roles whenever possible
  • Plays should do nothing more than include a list of roles except where pre_tasks and post_tasks are required
  • Use underscores as separators instead of dashes (e.g. my_role, not my-role)
  • When defining paths (or concatenating them), do not include trailing slashes (e.g. my_path: /foo not my_path: /foo/, or my_path /bar not my_path bar)
  • For variables that don't need to change or be overridden by the user, put them in vars/. For variables that would likely be overriden, put them in defaults/.

jeudi, juin 17 2021

Ansible, erreurs, verbosité ... ARA

Ansible est un outil génial, mais qui n'est pas non plus dépouvu de coquilles.

L'une des pires, est la transposition de stdout et stderr de la tâche exécutée sur le client, lors d'une remontée d'erreur. On obtient un paté ou les "\n" sont littéraux et cela donne une bouillie infame/.

Un truc connu, est de passer sa commande ansible dans un echo \-ne comme suit :

echo -ne "$(ansible-playbook .... )"

Mais cela reste pénible de toujours surcharger l'appel à ansible ainsi.

Récemment j'ai trouvé Ara, un outil génial qui se place en CALLBACK d'ansible, mais extrait tout une sommes de choses pertinentes ....

Et commencez a jouer :

pip3 install "ara[server]"
export ANSIBLE_CALLBACK_PLUGINS="$(python3 -m ara.setup.callback_plugins)"

ansible-playbook playbook.yaml

ara playbook list

Et pour la suite allez voir la doc :)

jeudi, juin 10 2021

Exécuter une commande sur tous les hotes avec ansible (pour debugger par exemple)

> ansible -m shell -a "host google.fr" all

proxy | CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.

openvas| CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.

nagios | CHANGED | rc=0 >>
google.fr has address 172.217.19.227
google.fr has IPv6 address 2a00:1450:4007:80c::2003
google.fr mail is handled by 30 alt2.aspmx.l.google.com.
google.fr mail is handled by 40 alt3.aspmx.l.google.com.
google.fr mail is handled by 20 alt1.aspmx.l.google.com.
google.fr mail is handled by 50 alt4.aspmx.l.google.com.
google.fr mail is handled by 10 aspmx.l.google.com.

mercredi, mai 27 2020

Ansible nested groups

dans la definition de l'inventaire, il est possible de faire des groupes imbriqués avec la directive children :

[servers:children]
dbservers
webservers
ftpserver

[dbservers]
db01
db02

...

Sur le même schema, il est possible de définir des variables communes à tout un groupe, plutôt que de copier les définitions dans les hôtes.

[all:vars]
ansible_user=root
ansible_port=22
ansible_python_interpreter=/usr/bin/python3
interpreter_python=/usr/bin/python3  

[servers:vars]
main_git_server: pedro.banana.local

jeudi, mars 19 2020

Ansible fetch

Parfois, nous voulons récupérer un fichier dans un contexte ansible pour lequel nous n'avons pas de clef autre que celle du déployer, et plutot que de copier cette clef, et "foutre la merde" partout, nous pouvons utiliser ansible pour faire cette copie :

ansible -m fetch TARGET -a "src=/etc/datadog-agent/datadog.yaml dest=DUMP"

dans DUMP, nous trouverons alors une arborescence copiant celle de la cible, et notre ficiher sera présent.

dimanche, mars 24 2019

Ansible: Jouer un role ... singulièrement

Il peut être nécessaire de tester un rôle sans écrire de playbook :

  • Nous écrivons un rôle pour plusieurs playbooks, qui devra donc être testé avant, sans lancer le playbook complet
  • Nous voulons simplement stocker la succession de directives sans faire l'enrobage comme quels hôtes seront concernés

Dans ce cas la, nous écrivons notre rôle de façon classique, en gardant la même structure arborescente, et dépendant toujours de l'inventaire mais aussi des variables des hôtes. Et pour l'appeler nous utiliseront le module "include_role" d'ansible comme suit :

ansible -m include_role -a name=<nom du role> <hostname>

Je m'en sers par exemple pour le push de drivers sur certaines machines dont l'utilisation est très ponctuelle (comme un driver wiki)

Et voila :)

samedi, août 4 2018

Ansible ... vs puppet

Je n'ai pas fait de post récemment sur Ansible ... parce qu'avoir travaillé dans une société qui m'a fait quasiment faire toutes les installations via Ansible, ca m'a fait largement dépasser les bases ...

Je connais maintenant bien la structure des rôles ansible :

Ansible/host_vars
Ansible/roles/baculum
Ansible/roles/baculum/defaults
Ansible/roles/baculum/files
Ansible/roles/baculum/tasks
Ansible/roles/baculum/templates
Ansible/roles/baculum/handlers

Mais je vais vous dire ce que j'aime le plus dans ansible, et pourquoi je le préfère à puppet :

Simplicité d'installation (ansible, ssh, clef, et python plus quelques modules éventuels) la ou puppet il faut un agent, valider la liaison avec un certificat ...

Certains diront que si on signe la comm entre le puppet master et le puppet node, c'est super cool question sécurité hein ? mais pour vous ssh, ca fait quoi ? un café dégueulasse ?

Bref, pas d'avantage précis d'un coté ou de l'autre ici.

Ansible reste plus simple et plus accessible que Puppet, ça c'est certain par contre. Le templating de Puppet permet peut être un peu plus que jinja2 et même la je ne le parierai pas :)

Bref, pour Ansible une fois que vous avez digéré la structure d'un rôle, la définition de variables (par défaut, ou par hôte), l'utilisation des handlers, pour faire des déclenchements de tache conditionnelles, ou encore le templating pour la création de fichier hautement customisable, vous avez votre outil d'installation et paramétrage de choix !

Après si vous préférez Puppet, sachant qu'il existe des agents puppet pour windows et donc la possibilité d'automatiser certaines taches windows en restant dans votre environnement d'automatisation ...

Ben oui, la on a un petit plus pour Puppet. Vivement ssh sur windows ! ou mieux vivement qu'on en ait fini avec windows. Mais en fait Ansible communique avec window via WinRM et Powershell, modulo un petit setup expliqué sur le site d'Ansible, ahahah ;)

Voila voila !

mercredi, mai 9 2018

Reforcer l'inventaire d'un client sous Ansible

Après avoir cherché du coté clear cache, gather facts, et autres, j'ai trouvé la solution, qui s'avère simpliste au possible:

ansible hostname.fqdn -m setup

vendredi, septembre 22 2017

Ansible 102

Un petit playbook pour s'assurer que vos architectures apache+mysql sont bien actives :

# file: ensure.yml
- hosts: webservers
  tasks:
  - name: ensure apache is running (and enable it at boot)
     service: name=apache2 state=started enabled=yes
  - name: ensure mysql is running (and enable it at boot)
     service: name=mysql state=started enabled=yes

et le fichier hosts qui va avec :

[webservers]
kara-el
kal-el
jor-el
supergirl
superman

ansible-playbook ensure.yml -i hosts

jeudi, septembre 21 2017

Ansible 101

Les prérequis pour utiliser Ansible :

sur le "maitre", le paquet ansible

apt install ansible

sur les clients, openssh-server et python

apt install openssh-server apt install python

Il faut ensuite générer une clef ssh sur le maitre et la copier dans le .ssh/authorized_keys de root sur les clients.

Ensuite, nous commençons à configurer la liste des hôtes à manager :

Editer le fichier /etc/ansible/hosts comme suit :

[openvas]
172.17.0.5

[puppet]
172.17.0.4 
172.17.0.3
172.17.0.7

[not-mine]
172.17.0.6
172.17.0.2

Nous pouvons ensuite tester que la base est fonctionnel comme suit :

ansible all -m ping

Puis procéder à une installation, ou une suppression de package comme suit :

ansible puppet -m apt -a "name=sl state=present"
ansible puppet -m apt -a "name=sl state=removed"

Voila pour les bases.

Pour les modules, et leurs attributs, je vous renvoie à la documentation

Il reste ensuite beaucoup à voir, comme créer un playbook (qui est une succession de modules et d'arguments mis dans un fichier yml), exemple :

Nous créons un fichier playbook nommé sl-playbook.yml qui contient :

- hosts: puppet
  tasks:
  - name: ensure sl is at the latest version
    apt: name=sl state=present

Attention aux indentations !!! Ici dotclear n'a pas permi de conserver celle-ci et donc un copier-coller de ce playbook donnera des erreurs.

Et exécutons l'installation de sl sur les noeuds puppet avec la commande :

ansible-playbook sl-playbook.xml

Enfin, dernière subtilité avec les playbook, il peut être utile de jouer le playbook sur une liste d'hôtes autre que celle centralisée dans /etc/ansible/hosts, pour ce :

ansible-playbook sl.playbook.yml -i my-hosts-list

ou my-hosts-list est un fichier au même format que le fichier hosts d'ansible.