我想在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
如果我重新执行剧本,但这次没有更改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仅在playbook的开头加载env变量,并将这些值保持到最后。并且似乎ansible任务没有更新/获取相应的bash conf文件。所以我找不到更新ENV变量的方法,它的新值将在以下任务中可用。
这可行的唯一方法是在下一个任务中定义 environment:关键字,但我想避免这种情况。这个新值将被许多任务使用,所以我正在寻找一种在playbook执行期间更新其值的方法。
答案 0 :(得分:0)
更改呈现给任务的环境的唯一方法是在任务或游戏中使用environment
关键字。如果您使用的是shell:
个任务,则可以明确地找到~/.bashrc
等,但这并不是非常漂亮。
如果您将Playbook分成多个播放,并在您获得其值后在播放中设置environment
键,该怎么办?像这样:
- hosts: localhost
tasks:
- set_fact:
myvar: "some value"
- hosts: localhost
environment:
MYVAR: "{{ myvar }}"
tasks:
- shell: "echo $MYVAR"
register: res
- debug:
msg: "MYVAR = {{ res.stdout }}"
这将修改第二场比赛中所有任务的环境。