Ansible - /etc/profile.d脚本

时间:2016-03-08 00:29:50

标签: ansible

我在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执行期间设置远程环境变量并获取它们?

由于

2 个答案:

答案 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,这是一个很好的做法。