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 文件中的环境变量 的相关文章

  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • 使用 lineinfile 和 blockinfile 编辑文件还是仅使用模板复制整个文件?

    我开始使用 Ansible 编写一个剧本 为我们的应用程序部署临时环境 我试图了解对文件应用更改的最佳实践是否是在控制计算机上本地更改它们 然后将它们传播到远程服务器 或者是否应该在剧本内操作文件 通过剧本操作文件在可读性和文档方面似乎更好
  • 使用 ansible 处理程序滚动重启

    我想运行一个 ansible playbook 它会安装一个服务 如果自上次运行以来发生任何更改 或多或少是 ansible 处理程序的规范用例 则重新启动它 但我想要一个不同的并行性用于安装而不是重新启动 我想一次在所有主机上安装 但是
  • 在 Ansible 中使用模板模块附加文件

    所以我有一个 ansible 剧本 它使用 Jinja2 模板来创建日志文件 每次我运行剧本时 它都会从customers yml中提取客户信息 并将完整的模板输出到 stunnel conf 文件中 该模板工作正常 但我试图找到一种方法来
  • 如何在 Jinja 中过滤字典?

    我有一个包字典 包名称是key和一些细节的字典是value php7 1 readline latest 7 1 9 1 ubuntu14 04 1 deb sury org 1 origins ppa launchpad net vers
  • “composer”在 Windows 服务器中未被识别为内部或外部命令

    我使用的是Windows Server 2008操作系统 我下载作曲家安装程序 exe https getcomposer org download 并安装到我的电脑上 当我尝试时composer install 我收到错误 compose
  • Ansible bitbucket 克隆配置 ssh 错误

    总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 主机密钥验证失败 然而 如果我流浪 ssh 然后运行 克隆 命令 私有存
  • 如何从 Ansible 模块获取当前主机名?

    我正在开发自定义 Ansible 模块来控制 Vagrant 控制多个 VM 服务器上的多个 VM 节点 遵循指南https docs ansible com ansible latest dev guide developing modu
  • Ansible:使用变量定义 playbook 主机

    我安装了以下版本 ansible 2 3 0 开发2131eaba0c 我想将我的主机变量指定为外部变量 然后在playbook与此类似 hosts integration In my 组变量 全部文件我有以下定义的变量 integrati
  • 主管和环境变量

    我真的不知道如何让主管使用环境变量 下面是一个配置片段 program htNotificationService priority 2 autostart true autorestart true directory home ubun
  • 如何在 Heroku 预览应用部署后脚本中设置 ENV var

    我想设置HOST环境变量到 HEROKU APP NAME herokuapps com在预览应用程序上 看来我不能这样做app json因为这是一个计算值 我希望在像这样的 部署后 脚本中做到这一点 heroku config set H
  • 添加多个 Visual Studio 属性表 (.props) 的 %PATH%

    界定PATH在属性表中的本地项目中 我需要将其添加到LocalDebuggerEnvironment 当只有 1 个属性表定义时 此方法效果很好PATH 如果我有多个属性表 而我想使用PATH从每个属性表中 Visual Studio 只会
  • 在Gradle中,有没有更好的方法来获取环境变量?

    在几个任务中 我引用了我的主文件夹中的 jar 有没有比获取环境变量更好的方法 ENV System getenv HOME ENV HOME task copyToServer dependsOn jar type Copy from b
  • 安塞布尔 + 10.11.6

    我在 非常 干净地安装 10 11 6 时遇到了 Ansible 的奇怪问题 我已经安装了brew zsh oh my zsh Lil snitch 和1password 实际上没有安装其他任何东西 我安装了ansible brew ins
  • Ansible:如何为Solaris设置全局路径

    我正在编写 Ansible 剧本来在 Solaris 服务器上设置和安装我们的应用程序 问题是我需要执行的 bash 脚本都假设某个目录位于 PATH 上 即 data bin 如果 Ansible 没有忽略所有这些 这通常不会成为问题 p
  • 如何使用ansible扩展Windows路径变量

    使用 win environment 可以向 Windows 主机添加 删除环境变量 但是要修改已经存在的变量 win environment 似乎没有用 因为您无法读取旧值来修改和更新变量 正确的 EDIT 从 Ansible 2 3 开
  • 有没有办法为 Jupyter Notebook 会话设置 PYTHONHASHSEED?

    我想禁用Python的随机化hash功能 https docs python org 3 reference datamodel html object hash 根据这个线程 无法通过模块查看或修改 PYTHONHASHSEED 的值 h
  • cygwin中刷新windows用户的环境变量

    我想在执行 setx VARNAME VARVALUE 特别是路径 后刷新 cygwins 环境 export VARNAME VARVALLUE 不是一个选项 因为如果导出的值是路径 类似于 UNIX 格式 我需要转换导出的值 但 VAR
  • Ansible:对任务失败执行清理

    我目前正在编写一个 Ansible play 它遵循此通用格式并通过 cron 作业运行 pre tasks Configuration package installation tasks Work with installed pack
  • Ansible 创建可以访问所有表的 postgresql 用户?

    这应该很简单 我想要创建一个 Ansible 语句来创建一个 Postgres 用户 该用户具有特定数据库的连接权限以及对该特定数据库中所有表的选择 插入 更新 删除权限 我尝试了以下方法 name Create postgres user

随机推荐