.env文件中的Ansible环境变量

时间:2020-02-13 13:38:49

标签: ansible environment-variables

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

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

- hosts: name
  tasks: 
    - name: `execute env file`
      command: . ./.env_file_name
      register: result

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

1 个答案:

答案 0 :(得分:1)

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

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

根据您的上下文,您可以选择以下选项:

1。库存环境变量

最好的选择是通过group_vars/host_vars使每个组/主机的清单端环境具有不同的值,然后将其用于environment keyword

# host_vars/my_host.yml
---
env_vars:
  VAR1: key1
  VAR2: key2
- hosts: my_host
  tasks: 
    - name: Display environment variables
      command: env
      environment: "{{ env_vars }}"

优点:

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

缺点:

  • 需要从侧面了解环境变量

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

如果您的任务全部为shell / command(我不建议这样做,因为最好使用适当的ansible module),您可以简单地在每个加载环境文件shell模块的时间

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

    - name: Do another action
      shell: |
        . ./.env_file_name && do_something_else

优点:

  • 无需从侧面了解环境变量

缺点:

  • 仅限于带有shell模块的任务

3。将env_file中的环境变量加载到ansible事实中

此选项是一劳永逸地解析env文件,并将其加载到与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 }}"

或者,如果需要执行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 }}"

优点:

  • 将适用于每个模块的环境
  • 无需从侧面了解环境变量

缺点:

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