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

2024-04-04

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

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

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

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


首先,. ./.env_file_name语法是shell语法并且不能与command module https://docs.ansible.com/ansible/latest/modules/command_module.html#command-module,你需要使用shell module https://docs.ansible.com/ansible/latest/modules/shell_module.html.

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

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

1.清点环境变量

最好的选择是将库存端的环境放在一个变量中,每个组/主机具有不同的值group_vars/host_vars https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html#organizing-host-and-group-variables,然后将其用于environment keyword https://docs.ansible.com/ansible/latest/user_guide/playbooks_environment.html

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

Pros:

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

Cons:

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

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

如果你的任务都是shell/command(我不建议这样做,因为最好使用适当的可靠模块 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html只要有可能),您只需每次使用 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

Pros:

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

Cons:

  • 仅限于任务shell module

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

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

Pros:

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

Cons:

  • 可能会因文件格式错误而失败
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐