2016-08-05 304 views
0

我知道Ansible的環境:命令在劇本頂部,但我認爲這對我來說並不適用,因爲我看到在執行劇本之前我不知道變量的值。我試圖檢索包版本和PHP模塊並將它們記錄到文件中。我想使用正則表達式來捕獲版本並將其存儲到環境變量中。然後,我想用一個shell命令將該變量等於該變量的值寫入環境文件。我也想從環境中拉出一個數組,並通過它循環。 Ansible似乎沒有堅持shell環境,並且環境變量在命令之間被擦除。這在Bash中很簡單。這在Ansible中可能嗎?我試圖:Ansible設置動態環境變量

--- 
- hosts: all 
    become: yes 
    vars: 
     site_variables: 
      code_directory: /home/ 
     dependency_versions: 
      WGET_VERSION: placeholder 
      PHP_MODULES: placeholder 

    tasks: 
    - name: Retrieve Environment 
     shell: export WGET_VERSION=$(wget --version | grep -o 'Wget [0-9]*.[0-9]*\+') 
     shell: export PHP_MODULES=$(php -m) 
     shell: echo "export {{ item }}={{ lookup('env', item) }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - WGET_VERSION 


    - name: Write PHP Modules Out 
     shell: export PHP_MODULES=$(php -m) 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[PHP Modules\]//g') 
     shell: export PHP_MODULES=$(echo {{ lookup('env', 'PHP_MODULES') }} | sed 's/\[Zend Modules\]//g') 
     shell: export PHP_MODULES=({{ lookup('env', 'PHP_MODULES') }}) 
     shell: echo "# - {{ item.0 }}" >> {{ site_variables.code_directory }}/.env.log 
     with_items: 
     - "{{ lookup('env', 'PHP_MODULES') }}" 

回答

2

這裏有很多事情要做。

首先,lookup始終運行ansible控制主機上,你傳遞給shell模塊的腳本在遠程服務器上運行一段時間。因此,您將永遠無法使用lookup獲取遠程環境變量。

詳情:https://docs.ansible.com/ansible/playbooks_lookups.html

其次,環境變量不從孩子到家長傳播。如果你有一個腳本,做這個...

export MYVARIABLE=foo 

...你運行該腳本,您的當前環境不會突然有一個名爲MYVARIABLE變量。對於Ansible產生的進程來說,這一點同樣適用於你的shell產生的進程。

如果你想設置一個ansible變量,可以考慮使用register關鍵字來獲取值:

- hosts: localhost 
    gather_facts: false 
    tasks: 
    - name: get wget version 
     command: wget --version 
     register: wget_version_raw 

    - name: extract wget version 
     set_fact: 
     wget_version: "{{ wget_version_raw.stdout_lines[0].split()[2] }}" 

    - name: show wget version 
     debug: 
     msg: "wget version is: {{ wget_version }}" 
+0

不知道,如果我跟着你完全。我ssh進入遠程主機並手動設置WGET_VERSION ...因此,讓我們說WGET_VERSION = 1.1.1。 {{lookup('env',item)}}實際上是從我手動設置的remote_host(1.1.1)中拉出環境變量並正確記錄它。它只是沒有通過Ansible在shell中設置新值:export WGET_VERSION = $(wget --version | grep -o'Wget [0-9] *。[0-9] * \ +')。我可能只需要更多地考慮這一點,因爲我最終需要通過一個數組提供全部內容。也許Ansible不是這樣做的。 – Nabsta

+0

非常感謝您的建議!我是Ansible的新手,絕對有幫助。 – Nabsta

+0

再次感謝!我使用set_fact,一組並行數組以及轉義正則表達式來處理它。在這種情況下,似乎直接打擊更合適,更清潔:P。 – Nabsta