【问题标题】:Ansible - Update env variables during playbook executionAnsible - 在剧本执行期间更新环境变量
【发布时间】: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_beforeenv_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


【解决方案1】:

更改呈现给任务的环境的唯一方法是在任务或游戏中使用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 }}"

这将修改第二次播放中所有任务的环境。

【讨论】:

  • 谢谢。这是一个很好的建议和解决方法。不是我想要的,但我会调查的。 ~/.bashrc 的采购实际上会更新此任务的环境变量吗?下一个任务(如果不使用 source ~/.bashrc)将有“旧”任务,对吧?
  • 好吧,采购~/.bashrc 将执行在 bash 中采购点文件通常所做的事情:它将运行脚本。如果你设置FOO=bar,它会将shell变量FOO设置为bar。如果您export FOO,它将使该变量在当前环境和任何子进程的环境中可用由同一脚本启动
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多