首先,. ./.env_file_name
语法是shell语法,不能与 command
模块 一起使用,需要使用shell
模块。
其次,shell环境上下文在每个任务中都会被重置,因为每个任务都是一个ssh命令往返(即一个新的shell会话),在一个任务中加载环境变量不会使它们对下一个任务可用。
根据您的情况,您有几个选项:
1.清单环境变量
最佳选项是将环境设置为清单侧的变量,通过不同的值为每个组/主机分组在group_vars
/host_vars
中使用,然后将其用于 environment
关键字。
---
env_vars:
VAR1: key1
VAR2: key2
- hosts: my_host
tasks:
- name: Display environment variables
command: env
environment: "{{ env_vars }}"
优点:
- 提供了全套的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
优点:
缺点:
3. 从env_file加载环境变量到ansible事实中
此选项是为了一次性解析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 }}"
优点:
- 适用于每个模块的环境
- 无需在Ansible端了解环境变量
缺点:
source
关键字在shell中引用.env
或任何其他文件。尝试这样做:command: source <path>
。 - error404shell
模块。否则,要在任务执行中使用环境变量,你需要使用environment
关键字。 - zigarn