Un testeur de template Ansible en ligne
Avec Python2, dict.keys()
, dict.values()
et dict.items()
retournent une liste. Avec Python3, ces méthodes retournent un objet de type "dictionary view".
Utiliser une loop avec une de ces 3 méthodes renvoie l'erreur suivante: 'dict object' has no attribute \"dict_keys(['hosts'])
Il faut utiliser le filtre list pour convertir l'objet en liste:
vars:
hosts:
testhost1: 127.0.0.2
testhost2: 127.0.0.3
tasks:
- debug:
msg: '{{ item }}'
# Only works with Python 2
#loop: "{{ hosts.keys() }}"
# Works with both Python 2 and Python 3
loop: "{{ hosts.keys() | list }}"
Sur les distribs disposant de python < 2.7.9 (ubuntu 14.04 par exemple), les modules ansible apt_key et apt_repository ne gèrent pas les urls en HTTPS.
example:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to validate the SSL certificate for packages.elastic.co:443. Make sure your managed systems have a valid CA certificate installed. If the website serving the url uses SNI you need python >= 2.7.9 on your managed machine (the python executable used (/usr/bin/python) is version: 2.7.6 (default, Nov 13 2018, 12:45:42) [GCC 4.8.4]) or you can install the `urllib3`, `pyOpenSSL`, `ndg-httpsclient`, and `pyasn1` python modules to perform SNI verification in python >= 2.6. You can use validate_certs=False if you do not need to confirm the servers identity but this is unsafe and not recommended. Paths checked for this platform: /etc/ssl/certs, /etc/pki/ca-trust/extracted/pem, /etc/pki/tls/certs, /usr/share/ca-certificates/cacert.org, /etc/ansible. The exception msg was: hostname 'packages.elastic.co' doesn't match 'e.sni.fastly.net'."}
Il est nécessaire d'installer les packages python-urllib3
, python-openssl
, python-pyasn1
, python-pip
et pip ndg-httpsclient
pour que cela soit fonctionnel.
example:
- name: Debian - ensure python-urllib3, python-openssl, python-pyasn1 & python-pip are installed
apt:
name: python-urllib3,python-openssl,python-pyasn1,python-pip
state: present
when: ansible_distribution_release == "trusty"
- name: Debian - ensure ndg-httpsclient pip is installed
pip:
name: ndg-httpsclient
state: present
when: ansible_distribution_release == "trusty"
Pour afficher toutes les variables ansible d'un host: ansible -m debug -a "var=hostvars[inventory_hostname]" localhost
C'est super utile pour débuguer les variables réellement prises en compte quand on a des variables qui s'overrident entre les host_vars
, group_vars
, ...
Une bonne introduction au déploiement d'infra sur Azure avec Ansible et Terraform. A noter l'utilisation du module Ansible pour Terraform.
Erreur rencontrée avec Ansible 2.6.5, Python 2.7.15 et MacOS 10.13 lors de l'execution d'un playbook sur un Windows 2016 Server:
$ ansible-playbook playbook.yml
PLAY [Prepare instance] *********************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************************************
Friday 05 October 2018 11:32:23 +0200 (0:00:00.072) 0:00:00.072 ********
objc[11299]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[11299]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
^C [ERROR]: User interrupted execution
A priori c'est lié à la gestion des forks dans MacOS High Sierra. Le workaround est de faire un export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
avant de lancer Ansible
Utilisation de Packer et Ansible comme alternative aux Dockerfiles pour créer des images Docker.
La méthode proposée est plus complexe que les Dockerfiles mais réutilisable en dehors du monde Docker et beaucoup plus lisible.
Un playbook Ansible à lancer en Post-Install Arch Linux pour avoir une machine fonctionnelle.
Le playbook est optimisé pour les laptops thinkpad mais constitue une bonne base de travail.
Une demo fournie par Red Hat pour deployer une architecture microservices basée sur Kubernetes, Openshift et Spring Cloud / Netflix OSS avec Ansible.
EDIT:
- Les repos Git Hub avec la conf Ansible et le code source des demos est ici: https://github.com/redhat-helloworld-msa
- Une video condensée de 11 min présente le projet: https://developers.redhat.com/blog/2016/07/27/have-your-own-microservices-playground/
Bonnes pratiques pour gérer ses rôles avec Ansible Galaxy:
- utiliser la commande
ansible-galaxy init
pour créer la structure du rôle$ ansible-galaxy init test-role - test-role was created successfully $ tree . └── test-role ├── defaults │ └── main.yml ├── files ├── handlers │ └── main.yml ├── meta │ └── main.yml ├── README.md ├── tasks │ └── main.yml ├── templates ├── tests │ ├── inventory │ └── test.yml └── vars └── main.yml 9 directories, 8 files
- Isoler chaque rôle dans un repo git séparé (permet de gérer la version du rôle avec les tags git)
- Utiliser Ansible Galaxy pour installer les rôles privés avec un fichier requirements.yml:
$ cat requirements.yml - src: git+https://bitbucket.org/ursuad/sample_role_oracle-java version: v1.1.6 $ ansible-galaxy install -r requirements.yml
- Gérer les dépendances entre rôles dans meta/main.yml
$ cat meta/main.yml dependencies: - { role: 'git+https://bitbucket.org/ursuad/sample_role_launchpad-ppa-webupd8,v1.0.0'}
ansible-lint vérifie le playbook indiqué en argument et indique les tâches qui ne suivent pas les best-practices Ansible dans leur définitions.
L'installation se fait via pip:
pip2 install ansible-lint
Playbook pour tester des plays ansible dans un container Docker:
ansible-playbook main.yml --extra-vars '{"tasks":["./task_file1.yml","./task_file2.yml","other_var":"value"]}'
pour gérer des serveurs avec ansible en passant par un bastion SSH:
- Créer le fichier
ansible.cfg
[ssh_connection] ssh_args = -F ssh.cfg control_path = ~/.ssh/mux-%r@%h:%p
- Créer le fichier ssh.cfg:
# Connexion directe avec le bastion. # Pensez à adapter le User et le IdentityFile selon vos besoins. Host bastion Hostname 84.39.41.33 User admin IdentityFile /home/you/.ssh/your_key.pem # Pour toutes les machines de la zone privée : # Vous pouvez renseigner un range d’IPs ou une zone dns, exemple: # *.eu-west-1.compute.amazonaws.com Host 192.168.47.* # Proxifier la connexion au travers du bastion. ProxyCommand ssh -F ssh.cfg -W %h:%p bastion # A adapter à votre cas : le User et la clé pour les connexions aux machines privées. User admin IdentityFile /home/you/.ssh/your_key.pem # Directives de multiplexing SSH Host * ControlMaster auto ControlPath ~/.ssh/mux-%r@%h:%p ControlPersist 15m
Yannick Perré explique comment il a introduit ansible pour automatiser les déploiements manuels réalisés par des admin sys dans un contexte d'entreprise fonctionnant en silo, "à l'ancienne". Sans rentrer dans les détails, il mentionne l'utilisation de Jenkins pour fournir une interface type web pour exécuter les playbooks ansible (complexité masquée, odonnancement des executions, trace des execustions, ...).
Il explique ensuite comment il utilise docker avec ansible pour prototyper et tester avant un déploiement sur une infra VM classique.
La démarche est intéressante, car elle montre comment ansible peut être déployé step-by-step sur de petit périmètres (déploiement DB, puis applications, puis serveur d'applis, puis autres operations sysadmin) et s'adapter aux contraintes structurelles (frein au changement, process en places, ...) sans nécessiter de tout révolutionner.
Mes playbooks ansible pour gérer mes pc ubuntu et mon home server debian.
C'est "work in progress" pour le moment...
Un classement de tutos pour différents langages (ruby, python, ...) et outils (git, puppet, chef, aws ec2, ...)