web-dev-qa-db-fra.com

Comment définir des variables d'environnement à l'aide d'Ansible

Je dois définir les variables comme Java_HOME et mettez à jour PATH. Il existe plusieurs façons de procéder. Une façon consiste à mettre à jour le /etc/environment variable et inclure une ligne pour Java_HOME en utilisant le module lineinfile puis exécutez la commande source /etc/environment directement sur l'OS invité (CentOS dans mon cas).

Une autre façon consiste à exécuter la commande d'exportation, par ex.

export Java_HOME=/usr/Java/jre1.8.0_51
export PATH=$PATH:$Java_HOME

Existe-t-il un moyen plus propre de le faire, car tout cela nécessite de manipuler des fichiers et d'exécuter des commandes directement sur le système d'exploitation pour mettre à jour les variables d'environnement?

29
Deepak Shenoy

Oui, il existe 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, elle n'est disponible que pour cette tâche spécifique. Dans les tâches suivantes, il n'existe que si vous le redéfinissez.

Bien que vous puissiez également définir des vars env par jeu:

- hosts:
  - localhost
  gather_facts: no
  environment:
    Java_HOME: /usr/Java/jre1.8.0_51
  tasks:
     ...

Maintenant, il sera disponible pour toutes les tâches de ce jeu.

Voir Configuration de l'environnement et FAQ: Comment puis-je définir le PATH ou toute autre variable d'environnement pour une tâche ou un playbook entier? dans les documents.


Un 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
25
udondan

J'ai trouvé qu'une solution de contournement pour ce faire était d'utiliser la commande lineinfile dans 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 devez utiliser des variables pour construire votre chemin de répertoire. J'ai inclus le chemin explicite pour simplifier mon exemple.

19
Deepak Shenoy

Mise à jour de l'approche lineinfile. La valeur Java_HOME ne doit pas inclure le répertoire bin. Les personnes suivantes ont travaillé pour les 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'
4
glennop