【问题标题】:Ansible - Environment variables settingAnsible - 环境变量设置
【发布时间】:2020-02-18 07:58:27
【问题描述】:

我需要在目标机器上设置环境。环境变量存在于名为 .env337 的文件中。该文件中有几个变量,例如

export AB_HOME=/tl/dev/abinitio/abinitio-V3  #/gcc3p32   # for 32-bit
export PATH=${AB_HOME}/bin:${PATH}

我尝试了下面的剧本来设置环境并注册环境变量,以便在 environment 关键字中使用它们来在注册的环境中运行其他命令,但它没有奏效。

- hosts: dev
  gather_facts: false
  tasks:
    - name: To set the environment
      shell: . ./.env337
      register: output

有没有其他方法可以解决这个问题。

【问题讨论】:

    标签: ansible environment-variables


    【解决方案1】:

    问:“设置环境并注册环境变量,以便在 environment 关键字中使用它们来运行其他命令。”

    A:shell命令中设置的环境变量不能持久化。执行命令后,shell 进程将终止。例如

        - shell: |
            cat ./.env337
            . ./.env337
            echo "AB_HOME = $AB_HOME"
            echo "PATH = $PATH"
            exit 0
          register: result
    
        - debug:
            var: result.stdout_lines
    
        - shell: |
            echo "AB_HOME = $AB_HOME"
            echo "PATH = $PATH"
            exit 0
          register: result
    
        - debug:
            var: result.stdout_lines
    

        "result.stdout_lines": [
            "export AB_HOME=/tl/dev/abinitio/abinitio-V3  #/gcc3p32   # for 32-bit", 
            "export PATH=${AB_HOME}/bin:${PATH}", 
            "", 
            "AB_HOME = /tl/dev/abinitio/abinitio-V3", 
            "PATH = /tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
        ]
    
        "result.stdout_lines": [
            "AB_HOME = ", 
            "PATH = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
        ]
    

    正如预期的那样,第二个shell 任务中缺少变量。


    问:“如果我不知道 env 文件中存在的所有变量是什么。有没有其他方法可以打印所有变量而不是使用 echo。”

    答:简短回答:使用环境变量创建字典 env_dict_add。在shell模块中使用它来创建环境environment: "{{ env_dict_add }}"

    详情

    1) 创建一个未知变量列表。例如

        - shell: cat ./.env337
          register: result
        - set_fact:
            env_list: "{{ env_list|default([]) +
                          [item.split('=').0.split(' ').1|trim] }}"
          loop: "{{ result.stdout_lines }}"
        - debug:
            var: env_list
    

    给予

        "env_list": [
            "AB_HOME", 
            "PATH"
        ]
    

    2) 使用环境创建字典。例如

        - shell: |
            . ./.env337
            set
          register: result
        - set_fact:
            env_dict: "{{ env_dict|default({})|
                          combine({my_key: my_value}) }}"
          vars:
            my_key: "{{ item.split('=').0 }}"
            my_value: "{{ item.split('=').1|default('') }}"
          loop: "{{ result.stdout_lines }}"
    

    3) 使用字典中的任何环境变量。例如,打印通过获取文件.env337 导出的任何变量

        - debug:
            msg: "var: {{ item }} value: {{ env_dict[item] }}"
          loop: "{{ env_list }}"
    

    给予

        "msg": "var: AB_HOME value: /tl/dev/abinitio/abinitio-V3"
    
        "msg": "var: PATH value: /tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
    

    4) 仅使用附加环境变量创建字典。例如

        - set_fact:
            env_dict_add: "{{ env_dict_add|default({})|
                              combine({item: env_dict[item]}) }}"
          loop: "{{ env_list }}"
        - debug:
            var: env_dict_add
    

    给予

        "env_dict_add": {
            "AB_HOME": "/tl/dev/abinitio/abinitio-V3", 
            "PATH": "/tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
        }
    

    5) 使用字典env_dict_add 在shell 命令中创建环境变量。例如

        - shell: echo ${{ item }}
          loop: "{{ env_list }}"
          register: result
          environment: "{{ env_dict_add }}"
        - debug:
            msg: "{{ dict(result.results|json_query('[].[item, stdout]')) }}"
    

        "msg": {
            "AB_HOME": "/tl/dev/abinitio/abinitio-V3", 
            "PATH": "/tl/dev/abinitio/abinitio-V3/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/admin/bin"
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-24
      • 2023-04-05
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2014-12-17
      相关资源
      最近更新 更多