Ansible : comment définir des variables à la volée dans son playbook
Imaginons que j'ai besoin de définir des variables au fur et à mesure que le processus avance
Cas concret déployer des WAR issues d'une "nightly build" depuis des repo maven :
je demarre par une tâche allant à la pêche aux SNAPSHOT
- name: Find last snapshot
command: ssh {{ server_repo }} ls -d {{ maven_repository }}/standard/{{ branch }}.*-SNAPSHOT | sort
register: snapshot
ici register va me permettre d'utiliser "snapshot" par la suite. Disons command m'a permit de trouver FOOBAR-1.2.3-SNAPSHOT
- name: let's define "war_path"
command: echo {{ path }}{{ snapshot.stdout | basename }}.war
when: snapshot
register: war_path
ici 2 choses et une astuce :
1) j'utilise de nouveau register pour pouvoir télécharger le war plus tard 2) j'utilise when ce qui permet de ne faire la command que quand la tasks snapshot est registered 3) l'astuce : utiliser command comme si on avait fait un simple export FOO=BAR, et sur la ligne de command on utilise snapshot.stdout parce qu'on a register snapshot précédement qui n'est qu'une chaine et pas une liste. Ce qui, avec les filtres "basename" et la concaténation avec ".war ", me donne grosso modo comme résultat un tout QQ :
echo /un/jolie/path/FOOBAR-1.2.3-SNAPSHOT.war
tâche suivante :
- name: war_path download from server_repo
command: scp -pr {{ server_repo }}:{{ war_path.stdout }} /temp
when: war_path
ici un simple scp, on remarquera war_path qui est la tasks register juste au dessus et le when qui utilise war_path
- name: war_path check is here
stat: path=/temp/{{ war_path.stdout | basename}}
register: war_path_exists
ici vérification que le transfert a eu lieu
- name: war_path fail to download
fail: file /temp/{{ war_path.stdout | basename}} does not exists
when: war_path_exists.stat.exists == False
ici on peut vérifier que ça a foiré, on se contente d'un message d'erreur mais on aurait pu faire péter un mail au service IT :P
- name: war_path Extract
command: chdir={{ home }}/{{ target }}-tomcat/webapps/{{ foobar }} {{ java_home }}/bin/jar xf /temp/{{ war_path.stdout | basename }}
when: war_path
et on acheve par la décompression du war
je vous fais grâce du restart tomcat :)
Pour finir, un petit gist qui fait joujou avec uniquement des variables à base de echo :)