我知道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') }}"
不知道,如果我跟着你完全。我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
非常感謝您的建議!我是Ansible的新手,絕對有幫助。 – Nabsta
再次感謝!我使用set_fact,一組並行數組以及轉義正則表達式來處理它。在這種情況下,似乎直接打擊更合適,更清潔:P。 – Nabsta