[英]How can I set playbook-level variables in Ansible?
我正在嘗試在劇本中設置變量,以便可以在劇本級別而不是主機級別訪問整個劇本的其余部分。 一個示例(從命令行傳遞machine_mode
變量):
- name: configure and install everything for the new boxes
sudo: True
hosts: new_hosts
vars: [
docker_required_roles: "['app_server', 'other_app_server']",
pip_required_roles: "['some_server', 'other_server']",
docker_required: "{{ machine_mode }} in docker_required_roles",
pip_required: "{{ machine_mode }} in pip_required_roles"
]
pre_tasks:
- name: Gathering ec2 facts
action: ec2_facts
roles:
#install docker and pip when required
- { role: bobbyrenwick.pip, when: "pip_required"}
- { role: angstwad.docker_ubuntu, when: "docker_required"}
不幸的是,當我運行它時, error while evaluating conditional: dev in pip_required_roles
。 我還有其他方法可以定義這些變量,以便可以通過整個劇本進行訪問嗎?
這個布爾值布爾變量變得棘手。 這是我能夠開始工作的地方:
vars:
docker_required_roles: ['app_server', 'other_app_server']
pip_required_roles: ['some_server', 'other_server']
docker_required: '{{"{{machine_mode}}" in docker_required_roles}}'
pip_required: '{{"{{machine_mode}}" in pip_required_roles}}'
tasks:
- debug: var=pip_required
- debug: var=pip_required
when: '{{pip_required | bool}}'
請注意角色名稱字符串列表,只需使用實際的YAML正確地表示它們即可,而不是python代碼字符串。
對於引用,您需要在其周圍使用多余的花括號以使其能夠通過jinja2運行並評估“ in”表達式,而不僅僅是在字符串"dev in docker_required_roles"
留下"dev in docker_required_roles"
。
引用變量時, 必須始終記住使用bool
過濾器,以避免字符串"False"
被解釋為真。
您似乎誤解了劇本的位置。
錯誤告訴您,在傳遞字符串字面量"dev in pip_required_roles"
而不是true
或false
,無法評估您施加在pip角色上的條件。
相反,您需要讓Ansible正確評估條件語句,以便為您的條件角色提供布爾值。 您可以這樣更改vars塊來做到這一點:
- name: configure and install everything for the new boxes
sudo: True
hosts: all
vars:
- docker_required_roles: ['app_server', 'other_app_server']
- pip_required_roles : ['some_server', 'other_server']
- docker_required : machine_mode in docker_required_roles
- pip_required : machine_mode in pip_required_roles
roles:
#install docker and pip when required
- { role: bobbyrenwick.pip, when: "pip_required"}
- { role: angstwad.docker_ubuntu, when: "docker_required"}
這改變了你的字符串字面docker_require_roles
和pip_required_roles
變量成列表,然后docker_required
和pip_required
使用Python的變量納入條件in
運營商(注意到他們身邊缺少雙引號)。
作為次要說明,我還對vars塊進行了調整,以使用YAML的列表語法,而不是您選擇的Python樣式語法,但這比其他任何東西更個人喜好。 您也可以分解docker_require_roles
和pip_required_roles
變量的列表以使用YAML語法,但是出於某些原因,這對我來說顯得有些尷尬:
...
vars:
- docker_required_roles:
- 'app_server'
- 'other_app_server'
- pip_required_roles :
- 'some_server'
- 'other_server'
- docker_required : machine_mode in docker_required_roles
- pip_required : machine_mode in pip_required_roles
roles:
...
至於您要完成的目標的更廣泛的想法,看起來您最好使用不同的清單文件和組變量來完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.