我知道Ansible的环境:命令位于剧本的顶部,但我不认为这对我有用,因为我知道在执行之前我不知道变量的值。剧本。我试图检索包版本和PHP模块并将它们记录到文件中。我想使用正则表达式来捕获版本并将其存储到环境变量中。然后我想写一个变量将该变量的值等于带有shell命令的环境文件。我还想从环境中拉出一个数组并循环遍历。 Ansible似乎没有持久化shell环境,并且环境变量在命令之间被消除。这在Bash中很简单。这在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') }}"
答案 0 :(得分: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 }}"