Ansible集动态环境变量

时间:2016-08-05 15:13:34

标签: bash shell environment-variables ansible ansible-playbook

我知道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') }}"

1 个答案:

答案 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 }}"