2017-09-14 79 views
0

我想在主持人劇本執行期間更新主機上的環境變量(本地執行本劇本),因此其餘任務可以使用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_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變量,並保持這些值,直到結束。看起來,這些可靠的任務並沒有更新/採購相應的bash conf文件。所以我無法找到一種方法來更新ENV變量,其新值將在以下任務中可用。

這可能工作的唯一方法是在下一個任務中定義環境:關鍵字,但我想避免這種情況。這個新值將被許多任務使用,所以我正在尋找一種在劇本執行過程中更新其值的方法。

+0

爲什麼你在這裏使用環境變量而不是事實?一般來說,您不能在運行時更改linux中正在運行的進程的環境。 –

+0

@KonstantinSuvorov我正在使用和修改環境變量,因爲更新後的下一個任務正在使用linux環境變量變量來執行它。但我不想使用每個任務的環境關鍵字,所以我正在尋找替代方案。 – PyTzatzi

回答

0

改變提交給任務的環境的唯一方法是在任務或播放中使用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 }}" 

這將修改第二次播放中所有任務的環境。

+0

謝謝。這是一個很好的建議和解決方法。不是我想要的,但我會研究它。 〜/ .bashrc的採購實際上會更新這個任務的env變量嗎?下一個任務(如果不使用source〜/ .bashrc)將會有「舊」一個,對吧? – PyTzatzi

+0

那麼,採購'〜/ .bashrc'會做bash中的一個點文件通常會做的事情:它會運行腳本。如果你設置'FOO = bar',它會將shell變量'FOO'設置爲'bar'。如果你'輸出FOO',它將使得該變量在當前環境和任何子進程的環境中可用*由相同的腳本*啓動。 – larsks