Question:
I need to set the variables like JAVA_HOME
and update PATH
. There are a number of ways of doing this. One way is to update the /etc/environment
variable and include a line for JAVA_HOME
using the lineinfile module and then run the command source /etc/environment
directly on the guest OS (CentOS in my case).
Another way is to execute the export command e.g.
1 2 3 |
export JAVA_HOME=/usr/java/jre1.8.0_51 export PATH=$PATH:$JAVA_HOME |
Is there a cleaner way to do this as all these require manipulating files and running commands directly on the OS to update the environment variables?
Answer:
Yes, there is a cleaner way. You can set environment variables per task:
1 2 3 4 5 6 7 |
tasks: - shell: echo JAVA_HOME is $JAVA_HOME environment: JAVA_HOME: /usr/java/jre1.8.0_51 register: shellout - debug: var=shellout |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
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": [] } } } |
If you set the environment variable like above in a task, it is only available for this specific task. In subsequent tasks it does not exist unless you define it again.
Though you can define env vars per play as well:
1 2 3 4 5 6 7 8 |
- hosts: - localhost gather_facts: no environment: JAVA_HOME: /usr/java/jre1.8.0_51 tasks: ... |
Now it’s gonna be available for all tasks of this play.
See Setting the Environment and FAQ: How can I set the PATH or any other environment variable for a task or entire playbook? in the docs.
Another example with a script task:
1 2 3 4 5 6 7 |
tasks: - script: /tmp/script.sh environment: JAVA_HOME: /usr/java/jre1.8.0_51 register: shellout - debug: var=shellout |
Where the script simply has this content:
1 2 3 4 |
#!/bin/sh echo JAVA_HOME is $JAVA_HOME |