Подтвердить что ты не робот

Как установить переменные среды с помощью Ansible

Мне нужно установить переменные типа JAVA_HOME и обновить PATH. Существует несколько способов сделать это. Один из способов - обновить переменную /etc/environment и включить строку для JAVA_HOME с помощью модуля lineinfile, а затем запустить исходный код /etc/environment непосредственно на гостевой ОС (CentOS в моем случае).

Другой способ - выполнить команду экспорта, например.

export JAVA_HOME=/usr/java/jre1.8.0_51
export PATH=$PATH:$JAVA_HOME

Есть ли более чистый способ сделать это, поскольку для этого требуется манипулирование файлами и запуск команд непосредственно в ОС для обновления переменных среды?

4b9b3361

Ответ 1

Да, есть более чистый способ. Вы можете установить переменные среды для каждой задачи:

  tasks:
  - shell: echo JAVA_HOME is $JAVA_HOME
    environment:
      JAVA_HOME: /usr/java/jre1.8.0_51
    register: shellout
  - debug: var=shellout

Вывод:

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": []
        }
    }
}

Если вы задаете переменную окружения, как указано выше, в задаче, она доступна только для этой конкретной задачи. В последующих задачах он не существует, если вы не определяете его снова.

Хотя вы также можете определить env vars за игру:

- hosts:
  - localhost
  gather_facts: no
  environment:
    JAVA_HOME: /usr/java/jre1.8.0_51
  tasks:
     ...

Теперь он будет доступен для всех задач этой игры.

См. Настройка среды и Часто задаваемые вопросы. Как установить PATH или любую другую переменную среды для задачи или всего playbook? в документах.


Другой пример с задачей script:

  tasks:
  - script: /tmp/script.sh
    environment:
      JAVA_HOME: /usr/java/jre1.8.0_51
    register: shellout
  - debug: var=shellout

Если script просто имеет это содержимое:

#!/bin/sh

echo JAVA_HOME is $JAVA_HOME

Ответ 2

Я обнаружил, что обходным путем для этого было использование команды lineinfile в Ansible:

- name: Set JAVA_HOME
  lineinfile: dest=/etc/environment state=present regexp='^JAVA_HOME' >
     line='JAVA_HOME=/opt/jre1.8.0_51/bin'

Хотя это не идеально, это позволяет создавать новые переменные среды. Конечно, вы должны использовать переменные для создания пути к каталогу. Я включил явный путь для упрощения моего примера.