Ansible - 在剧本执行过程中更新env变量
问题描述:
我想在主持人剧本执行期间更新主机上的环境变量(本地执行本剧本),因此其余任务可以使用env变量的更新值,但似乎这是不可能的。Ansible - 在剧本执行过程中更新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_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变量,并保持这些值,直到结束。看起来,这些可靠的任务并没有更新/采购相应的bash conf文件。所以我无法找到一种方法来更新ENV变量,其新值将在以下任务中可用。
这可能工作的唯一方法是在下一个任务中定义环境:关键字,但我想避免这种情况。这个新值将被许多任务使用,所以我正在寻找一种在剧本执行过程中更新其值的方法。
答
改变提交给任务的环境的唯一方法是在任务或播放中使用environment
关键字。如果你正在使用shell:
任务,你可以明确地获得你的~/.bashrc
等,但这不是很漂亮。
如果您将您的剧本分成多个剧本,并在您获得其价值后在剧本中设置了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 }}"
这将修改第二次播放中所有任务的环境。
为什么你在这里使用环境变量而不是事实?一般来说,您不能在运行时更改linux中正在运行的进程的环境。 –
@KonstantinSuvorov我正在使用和修改环境变量,因为更新后的下一个任务正在使用linux环境变量变量来执行它。但我不想使用每个任务的环境关键字,所以我正在寻找替代方案。 – PyTzatzi