首先,. ./.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:
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:
Cons:
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: