Comment définir les variables d'environnement à L'aide D'Ansible
j'ai besoin de définir les variables de la forme JAVA_HOME
et mettre à jour PATH
. Il y a un certain nombre de façons de le faire. Une façon est de mettre à jour le /etc/environment
variables et incluent une ligne pour JAVA_HOME
lineinfile module et ensuite lancer la commande source /etc/environment
directement sur l'OS invité (CentOS dans mon cas).
une autre façon est d'exécuter la commande d'exportation par exemple
export JAVA_HOME=/usr/java/jre1.8.0_51
export PATH=$PATH:$JAVA_HOME
y a-t-il un moyen plus propre de le faire car tout cela nécessite de manipuler des fichiers et exécuter des commandes directement sur le système D'exploitation pour mettre à jour les variables d'environnement?
3 réponses
Oui, il y a un moyen plus propre. Vous pouvez définir des variables d'environnement par tâche:
tasks:
- shell: echo JAVA_HOME is $JAVA_HOME
environment:
JAVA_HOME: /usr/java/jre1.8.0_51
register: shellout
- debug: var=shellout
Sortie:
TASK: [shell echo JAVA_HOME is $JAVA_HOME] **********************************
changed: [localhost]
TASK: [debug var=shellout] ****************************************************
ok: [localhost] => {
"var": {
"shellout": {
"changed": true,
"cmd": "echo JAVA_HOME is \"$JAVA_HOME\"",
"delta": "0:00:00.005797",
"end": "2015-08-07 06:32:47.295061",
"invocation": {
"module_args": "echo JAVA_HOME is \"$JAVA_HOME\"",
"module_name": "shell"
},
"rc": 0,
"start": "2015-08-07 06:32:47.289264",
"stderr": "",
"stdout": "JAVA_HOME is /usr/java/jre1.8.0_51",
"stdout_lines": [
"JAVA_HOME is /usr/java/jre1.8.0_51"
],
"warnings": []
}
}
}
Si vous définissez la variable d'environnement comme ci-dessus dans une tâche, il est uniquement disponible pour cette tâche spécifique. Dans les tâches suivantes, il n'existe que si vous le définissez à nouveau.
bien que vous puissiez définir env vars par jeu aussi bien:
- hosts:
- localhost
gather_facts: no
environment:
JAVA_HOME: /usr/java/jre1.8.0_51
tasks:
...
Maintenant, il va être disponible pour toutes les tâches de ce jeu.
voir Configuration de l'Environnement et FAQ: Comment puis-je définir le chemin ou toute autre variable d'environnement pour une tâche ou un playbook entier? dans les docs.
Autre exemple, avec une tâche de script:
tasks:
- script: /tmp/script.sh
environment:
JAVA_HOME: /usr/java/jre1.8.0_51
register: shellout
- debug: var=shellout
où le script a simplement ce contenu:
#!/bin/sh
echo JAVA_HOME is $JAVA_HOME
j'ai trouvé qu'une solution de contournement pour faire cela était d'utiliser le lineinfile commande en Ansible:
- name: Set JAVA_HOME
lineinfile: dest=/etc/environment state=present regexp='^JAVA_HOME' >
line='JAVA_HOME=/opt/jre1.8.0_51/bin'
bien que ce ne soit pas idéal, cela vous permet de créer de nouvelles variables environnementales. Bien sûr, vous devriez utiliser des variables pour construire votre chemin de répertoire. J'ai inclus le chemin explicite pour simplifier mon exemple.
mise à jour de l'approche lineinfile. La valeur JAVA_HOME ne doit pas inclure le répertoire bin. Ce qui suit a fonctionné pour centos:
- name: Set JAVA_HOME
lineinfile:
dest: /etc/environment
state: present
regexp: '^JAVA_HOME'
line: 'JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk'