我在envs.sh
文件夹中定义了一个/etc/profile.d/
脚本。
执行ansible-playbook
时,我试图获取此env var的值,但它反而给我一个错误:
Ansible test:
debug: msg="{{ ansible_env.NGN_VAL }} is an environment variable"
错误:
fatal: [xxx.yyy.zzz.kkk] => One or more undefined variables: 'dict object' has no attribute 'NGN_VAL'
FATAL: all hosts have already failed -- aborting
为什么它不执行该文件夹中的脚本?当我通过ssh
连接时,我回应它并显示其值。如何在ansible执行期间设置远程环境变量并获取它们?
由于
答案 0 :(得分:1)
如果要捕获环境变量,请使用此方法进行测试。
[jenkins@scsblnx-828575 jenkins]$ cat mypass
export MYPASSWD=3455637
[jenkins@scsblnx-828575 jenkins]$ cat test.yml
- hosts: all
user: jenkins
tasks:
- name: Test variables.
shell: source /apps/opt/jenkins/mypass && echo $MYPASSWD
register: myenvpass
- debug: var=myenvpass.stdout
[jenkins@scsblnx-828575 jenkins]$ ansible-playbook -i hosts test.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [127.0.0.1]
TASK [Test variables.] *********************************************************
changed: [127.0.0.1]
TASK [debug] *******************************************************************
ok: [127.0.0.1] => {
"myenvpass.stdout": "3455637"
}
PLAY RECAP *********************************************************************
127.0.0.1 : ok=3 changed=1 unreachable=0 failed=0
答案 1 :(得分:0)
在我看来,您可以混合使用 ansible vault 和系统环境变量。
使用 ansible vault 创建并加密文件(这是您放置远程环境变量内容的地方):
$ ansible-vault create vars_environment.yml
输入你的密码来加密这个文件并写入你的变量的内容,例如:
ngn_val: supersecret
我过去常常在 /etc/profile.d
目录中加载我的永久环境变量,但它们的路径更多:
/etc/profile.d
/etc/profile
/etc/environment
~/.profile
这是在剧本中编写 template 的好方法,尽管您可以使用 copy module:
---
# environment.yml
- name: Get enviroment variable server
hosts: debian.siccamdb.sm
vars:
dest_profile_environment: /etc/profile.d/environment.sh
vars_files:
- vars_environment.yml
tasks:
- name: "Template {{ dest_profile_enviroment }}"
template:
src: environment.sh.j2
dest: "{{ dest_profile_environment }}"
mode: '0644'
- name: Load env variable
shell: ". {{ dest_profile_environment }} && echo $NGN_VAL"
register: env_variable
- name: Debug env variable
debug:
var: env_variable.stdout_lines[0]
此处重要的是在 shell 任务中,因为您必须获取环境变量的来源,并通过寄存器 keyword 使用它,该寄存器可用于捕获变量中命令的输出。
这是本示例中模板的内容文件environment.sh.j2
:
export NGN_VAL={{ ngn_val }}
在运行剧本后在 vars_environment.yml
文件中输入您的密码:
ansible-playbook --vault-id @prompt environment.yml
输出如下:
PLAY [Get enviroment variable server] *************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************************************************************************************************************************************
ok: [debian.siccamdb.sm]
TASK [Template {{ dest_profile_enviroment }}] *****************************************************************************************************************************************************************************************
changed: [debian.siccamdb.sm]
TASK [Load env variable] **************************************************************************************************************************************************************************************************************
changed: [debian.siccamdb.sm]
TASK [Debug env variable] *************************************************************************************************************************************************************************************************************
ok: [debian.siccamdb.sm] => {
"env_variable.stdout_lines[0]": "supersecret"
}
PLAY RECAP ****************************************************************************************************************************************************************************************************************************
debian.siccamdb.sm : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
另一种方法是在远程服务器中使用 custom facts。如果您想将变量的内容保留在远程服务器中并在 playbook 中使用而不需要 ansible Vault,这是一个很好的做法。