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?

27
demandé sur techraf 2015-08-02 21:19:19

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
23
répondu udondan 2015-08-07 05:06:33

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.

19
répondu Deepak Shenoy 2015-08-06 19:12:04

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'
2
répondu glennop 2018-04-29 00:02:59