如何使用Ansible设置环境变量

Dee*_*noy 29 java-home 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
Run Code Online (Sandbox Code Playgroud)

有没有更简洁的方法来执行此操作,因为所有这些都需要直接在操作系统上操作文件和运行命令来更新环境变量?

udo*_*dan 26

是的,有一种更清洁的方式.您可以为每个任务设置环境变量:

  tasks:
  - shell: echo JAVA_HOME is $JAVA_HOME
    environment:
      JAVA_HOME: /usr/java/jre1.8.0_51
    register: shellout
  - debug: var=shellout
Run Code Online (Sandbox Code Playgroud)

输出:

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": []
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在任务中设置上述环境变量,则它仅适用于此特定任务.在后续任务中,除非再次定义,否则它不存在.

虽然你也可以为每个游戏定义env vars:

- hosts:
  - localhost
  gather_facts: no
  environment:
    JAVA_HOME: /usr/java/jre1.8.0_51
  tasks:
     ...
Run Code Online (Sandbox Code Playgroud)

现在它将可用于此剧的所有任务.

请参阅设置环境常见问题解答:如何为任务或整个手册设置PATH或任何其他环境变量?在文档中.


脚本任务的另一个例子:

  tasks:
  - script: /tmp/script.sh
    environment:
      JAVA_HOME: /usr/java/jre1.8.0_51
    register: shellout
  - debug: var=shellout
Run Code Online (Sandbox Code Playgroud)

脚本只包含以下内容:

#!/bin/sh

echo JAVA_HOME is $JAVA_HOME
Run Code Online (Sandbox Code Playgroud)


Dee*_*noy 20

我发现执行此操作的解决方法是在Ansible中使用lineinfile命令:

- name: Set JAVA_HOME
  lineinfile: dest=/etc/environment state=present regexp='^JAVA_HOME' >
     line='JAVA_HOME=/opt/jre1.8.0_51/bin'
Run Code Online (Sandbox Code Playgroud)

虽然这不是理想的,但它允许您创建新的环境变量.当然,您应该使用变量来构建目录路径.我已经包含了显式路径来简化我的示例.


小智 11

更新到 lineinfile 方法。JAVA_HOME 值不应包含 bin 目录。以下适用于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'
Run Code Online (Sandbox Code Playgroud)