【问题标题】:Ansible Set Dynamic Environment VariablesAnsible 设置动态环境变量
【发布时间】:2016-08-05 15:13:34
【问题描述】:

我知道 Ansible 的环境:playbook 顶部的命令,但我认为这对我来说不起作用,因为我在执行 playbook 之前不知道变量值。我正在尝试检索包版本和 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') }}"

【问题讨论】:

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


    【解决方案1】:

    这里发生了很多事情。

    首先,lookup 始终在 ansible 控制主机上运行,而您传递给 shell 模块的脚本在远程服务器上运行。因此,您将永远无法使用 lookup 获得 remote 环境变量。

    详情: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 }}"
    

    【讨论】:

    • 不确定我是否完全关注你。我通过 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 不是这样做的方法。
    • 非常感谢您的建议!我是 Ansible 的新手,它肯定很有帮助。
    • 再次感谢!我使用 set_fact、一组并行数组和转义的正则表达式使其工作。在这种情况下,似乎直接 bash 更合适和更清洁:P.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2023-04-05
    • 2019-09-07
    • 1970-01-01
    • 2016-07-14
    • 2021-12-23
    相关资源
    最近更新 更多