2017-09-26 68 views
1

我的问题是,我无法通过传递字典来设置环境来设置整个剧本的环境。那可能吗?如何用传入的环境词典定义Ansible playbook环境

例如,这里是我的样本ansible剧本:

- hosts: localhost 
    vars: 
    env_vars: "{{ PLAY_ENVS }}" 

    environment: "{{ env_vars }}" 

    tasks: 
    - name: Here is what you passed in 
     debug: msg="env_vars == {{ env_vars }}" 

    - name: What is FAKE_ENV 
     debug: msg="FAKE_ENV == {{ lookup('env', 'FAKE_ENV') }}" 

而且我通过命令:

/bin/ansible-playbook sample_playbook.yml --extra-vars '{PLAY_ENVS: {"FAKE_ENV":"/path/to/fake/destination"}}' 

我得到的回应是:

PLAY [localhost] *************************************************************** 

TASK [setup] ******************************************************************* 
ok: [localhost] 

TASK [Here is what you passed in] ********************************************** 
ok: [localhost] => { 
    "msg": "env_vars == {u'FAKE_ENV': u'/path/to/fake/destination'}" 
} 

TASK [What is FAKE_ENV] ******************************************************** 
ok: [localhost] => { 
    "msg": "FAKE_ENV == " 
} 

PLAY RECAP ********************************************************************* 
localhost     : ok=3 changed=0 unreachable=0 failed=0 

正如你所看到的'FAKE_ENV'没有在环境中设置。我究竟做错了什么?

+1

我现在不能验证,但'debug'模块:

你应该与衍生的过程中检查你的环境,这样的:

- hosts: localhost vars: env_vars: FAKE_ENV: foobar environment: "{{ env_vars }}" tasks: - name: Test with spawned process shell: echo $FAKE_ENV 

并获得预期的结果可能不是测试它的最好方法。对于不同的目标,它甚至不建立连接,也可能跟随本地主机上的快捷方式。你能否尝试注册一些“真实”行动模块的结果?例如用'content'复制'并检查一个文件的内容。 – techraf

回答

2

Ansible中的查找是在父级ansible过程的上下文中执行的。利用查找插件"stdout": "foobar",