【发布时间】:2017-09-14 13:28:21
【问题描述】:
我想在ansible playbook执行过程中更新宿主机上的一个环境变量(这个playbook是在本地执行的),所以剩下的任务可以使用env变量的更新后的值,但是好像不行。
让我举个例子说明我想要完成的工作:
# Environment variable before changing
- set_fact: env_before="{{ lookup('env', 'ENV_VAR') }}"
# A task that updates the env variable, I tried to make the needed configuration
# into ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/environment
# Environment variable after changing
- set_fact: env_after="{{ lookup('env', 'ENV_VAR') }}"
# Unfortunately env_after = env_before
如果我重新执行 playbook,但这次不更改 env 变量,env_before 和 env_after 将具有 env 变量的更新值。
例子:
- 1st Execution:
- env_before = ENV_VAR = 10
- update_ENV_VAR to 20 and update ~/.bashrc, ~/.bash_profile, ~/.profile, /etc/environment files
with export ENV_VAR=20 etc.
- env_after = ENV_VAR = 20
- 2nd Execution (Do not make any changes just skip the update_ENV_var step
- env_before = ENV_VAR = 20 (new value from previous execution)
据我了解,ansible 仅在剧本的开头加载 env 变量,并将这些值保留到结尾。而且似乎 ansible 任务没有更新/采购相应的 bash conf 文件。所以我找不到更新 ENV 变量的方法,它的新值将在以下任务中可用。
唯一可行的方法是在下一个任务中定义 environment: 关键字,但我想避免这种情况。这个新值将被许多任务使用,因此我正在寻找一种在 playbook 执行期间更新其值的方法。
【问题讨论】:
-
为什么在这里使用环境变量而不是事实?一般情况下,在运行时不能改变linux中正在运行的进程的环境。
-
@KonstantinSuvorov 我正在使用和修改环境变量,因为更新后的下一个任务是使用 linux 环境变量变量来执行它。但我不想为每个任务使用环境关键字,所以我正在寻找替代方案。
标签: bash ansible environment-variables