2017-01-02 84 views
2

ansible 2.1.2.0Ansible - 有條件時沒有劇本水平vars_prompt工作

我有一個情況這裏,我正在努力檢查和大家看到,如果解決方案甚至可以與Ansible vars_prompt功能和when有條件。

Ansible有這個功能叫:vars_prompt,我想俱樂部這與when條件(when: ...我們通常在任務使用在任務或劇本一級的行動)

PS:我的問題是不是不同這篇文章Ansible to Conditionally Prompt for a Variable?即我的vars:變量不依賴於任何機器的OS ENV變量,在我的情況下,我只有一個簡單的硬編碼值vars:變量。我還在主要劇本級別(而不是在任務級別)運行when條件。

我想要做的就是向用戶提示用於輸入變量的值,只要在命令行中,用戶名爲ansible-playbook install_tool.yml ... ...--extra-vars "install_tool=true"

工作區/ ansible /install_tool.yml我有:

- hosts: all 
    become: true 
    gather_facts: false 

    vars: 
    instance: test 
    #install_tool: false 
    company_api_url: DUMMY_INVALID_URL 

    vars_prompt: 
    - name: "company_api_url" 
     prompt: "Enter Company API URL: " 
     default: "https://{{ instance }}.company.com" 
     private: no 
     when: install_tool == "true" and company_api_url == "DUMMY_INVALID_URL" 
     # or 
     #when: ("{{ install_tool }}" == "true" and "{{ company_api_url }}" == "DUMMY_INVALID_URL") 

    pre_tasks: 
    - debug: msg="install_tool = {{ install_tool }} and instance = {{ instance }}" 
     when: install_tool == "true" 

我的問題:
我怎樣才能得到上面的條件提示工作(憑有效取代default值舞會pt變量)跳過以提示用戶完全取決於install_tool變量的值?

我的理解: 在頂層劇本文件(install_tool.yml),我定義一個變量instance與價值test。爲何要在vars_prompt部分default值沒有接test,當它在劇本關卡的定義(--OR如果什麼用戶通過在命令行instance變量前取代它的價值:--extra-vars "instance=qa"在這種情況下,我想要默認值爲[https://qa.company.com],我該怎麼做)?我在運行任何語法時都看不到任何錯誤。

我得到下面的輸出(不過我期待一個替代URL值,如:[https://test.company.com]):

運行:

install_tool設置或者在命令行通過爲 false它仍然提示甚至
$ ansible-playbook -i "localhost," --connection=local install_tool.yml --extra-vars "install_tool=false instance=qa" 

$ ansible-playbook -i inventory -l localhost install_tool.yml --extra-vars "install_tool=false" 
... 
.....some lines here 
... 
PLAYBOOK: install_tool.yml ******************************************* 
1 plays in install_tool.yml 
Enter Company API URL: [https://{{ instance }}.company.com]: 

作爲使用when: ("{{ install_tool }}" == "true" and ...)條件在vars_prompt部分,在/爲- name: company_api_url變量,它沒有錯誤的任何語法問題或等(這意味着,Ansible不認爲這是錯誤的),然後爲什麼,Ansible仍然提示我進入vars_prompts以上變量,即使我通過--extra-vars "install_tool=false"- 或 -如果我取消註釋行:install_tool: falsevars:部分?

PS:when: ...條件成功合作時install_tool是真正的pre_tasks部分,即,它顯示了這些2個變量的值,當install_tool設置爲false,那麼它不運行- debug一步,並跳過它(這是預期的)。

感謝。

+0

把它歸結爲一個單一的問題,並提出一個可重複的例子。 – ceving

+0

@ceving我改變了我的帖子,這有幫助嗎?我想詳細提供一些解釋。上述install_tool.yml是否在您的最後顯示替代的'default'值,並且當'install_tool'設置爲false時跳過了提示部分? –

+0

https://github.com/ansible/ansible/issues/19777 –

回答

2

您可以檢查提示變量的所有支持屬性here

when聲明不支持提示變量。從來沒有。

提示變量的模板默認值也是not supported

防止vars提示的唯一方法是通過extra_vars傳遞有問題的變量。在你的例子中,如果你通過-e company_api_url=my_custom_url,Ansible將跳過提示。

+0

我同意Konstantin。如果傳遞的值不是用戶所期望的(例如:依賴於時間窗等的Typos/Values),那麼Ansible自動化足夠智能,足以提示用戶至少進行交互式運行。有沒有計劃添加此功能?我同意進行非交互式運行,我們不希望Ansible在運行過程中提示用戶。 –

+0

我不是一個Ansible團隊開發人員,所以不能告訴你任何計劃,對不起:)但我主張儘可能少的互動行爲。我在很多劇本的開頭使用'assert'任務來確保在進一步的劇本運行過程中所需的所有數據都存在,併爲用戶提供有意義的錯誤信息來修復輸入數據。 –

+0

同意,我想我應該在這種情況下快速失敗。 –