我正在尝试设置一个剧本,该剧本将运行命令以检查目标计算机中安装的服务的状态。该命令仅在执行.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
是否有任何剧本来运行可执行环境文件以设置目标计算机上存在的环境,然后运行我们的命令?
答案 0 :(得分:1)
首先,. ./.env_file_name
语法是 shell 语法,不能与command
module一起使用,您需要使用shell
module。
第二,由于每个任务都是ssh命令往返(因此是一个新的Shell会话),因此在每个任务上都会重置shell环境上下文,并且在一个任务中加载环境变量不会使它们可用于下一个任务。 / p>
根据您的上下文,您可以选择以下选项:
最好的选择是通过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 }}"
优点:
缺点:
如果您的任务全部为shell
/ command
(我不建议这样做,因为最好使用适当的ansible module),您可以简单地在每个加载环境文件shell模块的时间
- hosts: my_host
tasks:
- name: Display environment variables
shell: |
. ./.env_file_name && env
- name: Do another action
shell: |
. ./.env_file_name && do_something_else
优点:
缺点:
shell
模块的任务此选项是一劳永逸地解析env文件,并将其加载到与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 }}"
优点:
缺点: