gpt4 book ai didi

Ansible - 来自 .env 文件的环境变量

转载 作者:行者123 更新时间:2023-12-03 16:49:54 29 4
gpt4 key购买 nike

我正在尝试设置一个剧本,它将运行命令来检查目标机器中安装的服务的状态。该命令仅在 .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

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

最佳答案

一、. ./.env_file_name语法是 外壳 语法,不能与 command module 一起使用,您需要使用 shell module .
其次,每个任务都会重置 shell 环境上下文,因为每个任务都是一个 ssh 命令往返(因此是一个新的 shell session ),并且在一个任务中加载环境变量不会使它们可用于下一个任务。
根据您的上下文,您有一些选择:
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 }}"
优点:
  • 完整的ansible解决方案
  • 适用于每个模块的环境

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

  • 2.为每个任务加载环境变量
    如果你的任务都是 shell/ command (我不建议这样做,因为最好尽可能使用适当的 ansible module),您可以简单地每次使用 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
    优点:
  • 无需知道ansible端的环境变量

  • 缺点:
  • 仅限于 shell 的任务模块

  • 3.从env_file加载环境变量到ansible fact
    此选项是一劳永逸地解析 env 文件并将其加载到 ansible fact 中以与 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 }}"
    优点:
  • 适用于每个模块的环境
  • 无需知道ansible端的环境变量

  • 缺点:
  • 文件格式错误可能会失败
  • 关于Ansible - 来自 .env 文件的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60209185/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com