2016-03-16 66 views
0

Consul lookup插件具有以下代碼。我想通過設置ANSIBLE_CONSUL_URL的環境變量來覆蓋。我似乎無法讓我的任務使用環境變量。如果我在運行任務之前手動設置環境變量,任務運行良好。在Ansible中設置環境似乎不起作用

self.agent_url = 'http://localhost:8500' 
if os.getenv('ANSIBLE_CONSUL_URL') is not None: 
    self.agent_url = os.environ['ANSIBLE_CONSUL_URL'] 

我的任務:

- name: Build list of modules and its associated tag 
    environment: 
    ANSIBLE_CONSUL_URL: "http://indeploy001.local.domain:8500" 
    set_fact: deploy_list="{{ item | replace("deploys/" + environment_id + "/",'') }}-{{ lookup('consul_kv','deploys/' + environment_id + '/' + item) }}" 
    with_items: "{{ modules }}" 
    register: deploy_list_result 

錯誤

TASK: [Build list of modules and its associated tag]  ************************** 
fatal: [127.0.0.1] => Failed to template deploy_list="{{ item | replace("deploys/" + environment_id + "/",'') }}-{{ lookup('consul_kv','deploys/' + environment_id + '/' + item) }}": Error locating 'deploys/sf/ariaserver' in kv store. Error was HTTPConnectionPool(host='localhost', port=8500): Max retries exceeded with url: /v1/kv/deploys/sf/ariaserver (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x1eac410>: Failed to establish a new connection: [Errno 111] Connection refused',)) 

FATAL: all hosts have already failed -- aborting 
+0

只是好奇:kv_store是第三方插件,還是根本沒有記錄?我無法找到它的文檔。我知道有一個模塊,因爲Ansible 2,但不是一個動作插件。 – udondan

+0

它是一個Ansible插件。 – luckytaxi

回答

0

查找是一個模板功能。在執行任務之前,將呈現任務的鍵以解析任何Jinja表達式。這意味着您的查找在任務執行之前執行。環境密鑰只是一個任務屬性,它在任務執行時起作用。但你沒有那麼遠。

此外,我不是100%確定在set_fact任務中使用的特殊情況下,您的環境會發生什麼情況。 set_fact是一個動作插件,在控制機器上運行。查找也是如此。但是這個任務本身沒有委託給本地主機。所以有可能爲控制機器或遠程機器設置env var。我的猜測是,它並沒有設置在本地主機上,也沒有遠程設置。我猜測的原因是,許多動作插件會在進程後面調用具有相同名稱的模塊,然後在目標主機上執行該模塊。邏輯行爲和用戶期望的是,env var然後由模塊在遠程主機上設置。鑑於第一段,只是一種猜測而忽略不計。

結論: 如果查找插件取決於環境變量,則不能將它們設置爲相同的任務。他們需要先設置 - 你已經發現的工作。