Ansible - .env 文件中的环境变量

New*_*ee2 5 environment-variables ansible

我正在尝试设置一个剧本,它将运行命令来检查安装在目标机器上的服务的状态。该命令仅在.env file执行时才有效。执行.env fileis的命令.<space>./.env_file_name,该文件包含环境变量列表,例如 exportJAVA_HOME=/optware/java/jdk/1.2.

我尝试在使用以下剧本运行命令之前执行环境文件,但它不起作用。

- hosts: name
  tasks: 
    - name: `execute env file`
      command: . ./.env_file_name
      register: result
Run Code Online (Sandbox Code Playgroud)

是否有任何剧本可以运行可执行环境文件来设置目标机器上存在的环境,然后运行我们的命令?

zig*_*arn 17

首先,该. ./.env_file_name语法是shell语法,不能与command模块一起使用,需要使用shell模块

其次,shell 环境上下文在每个任务中都会重置,因为每个任务都是 ssh 命令往返(因此是一个新的 shell 会话),并且在一个任务中加载环境变量并不会使它们可用于下一个任务。

根据您的具体情况,您有一些选择:

1.清点环境变量

group_vars最好的选择是通过/host_vars将清单端的环境放在每个组/主机具有不同值的变量中,然后将其用作environment关键字

# host_vars/my_host.yml
---
env_vars:
  VAR1: key1
  VAR2: key2
Run Code Online (Sandbox Code Playgroud)
- hosts: my_host
  tasks: 
    - name: Display environment variables
      command: env
      environment: "{{ env_vars }}"
Run Code Online (Sandbox Code Playgroud)

优点:

  • 完整的ansible解决方案
  • 适用于每个模块的环境

缺点:

  • 需要知道ansible端的环境变量

2. 为每个任务加载环境变量

如果你的任务都是shell/ command(我不建议这样做,因为最好尽可能使用适当的ansible 模块),你可以简单地每次使用 shell 模块加载 env 文件

- hosts: my_host
  tasks: 
    - name: Display environment variables
      shell: |
        . ./.env_file_name && env

    - name: Do another action
      shell: |
        . ./.env_file_name && do_something_else
Run Code Online (Sandbox Code Playgroud)

优点:

  • 不需要知道ansible端的环境变量

缺点:

  • 仅限于shell模块任务

3.将环境变量从env_file加载到ansiblefact中

此选项是一次性解析 env 文件并将其加载到 ansible 事实中以与environment关键字一起使用。

- hosts: my_host
  tasks: 
    - name: Get env file content
      slurp:
        src: ./.env_file_name
      register: env_file_content

    - name: Parse environment
      set_fact:
        env_vars: "{{ ('{' + (env_file_content.content | b64decode).split('\n') | select | map('regex_replace', '([^=]*)=(.*)', '\"\\1\": \"\\2\"') | join(',') + '}') | from_json }}"

    - name: Display environment variables
      command: env
      environment: "{{ env_vars }}"
Run Code Online (Sandbox Code Playgroud)

或者,如果需要执行 env 文件而不是直接解析:

- hosts: my_host
  tasks: 
    - name: Get env file content
      shell: . ./.env_file_name && env
      register: env_file_result

    - name: Parse environment
      set_fact:
        env_vars: "{{ ('{' + env_file_result.stdout_lines | map('regex_replace', '([^=]*)=(.*)', '\"\\1\": \"\\2\"') | join(',') + '}') | from_json }}"

    - name: Display environment variables
      command: env
      environment: "{{ env_vars }}"
Run Code Online (Sandbox Code Playgroud)

优点:

  • 适用于每个模块的环境
  • 不需要知道ansible端的环境变量

缺点:

  • 可能会因文件格式错误而失败