簡體   English   中英

如何在Ansible中設置劇本級變量?

[英]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"而不是truefalse ,無法評估您施加在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_rolespip_required_roles變量成列表,然后docker_requiredpip_required使用Python的變量納入條件in運營商(注意到他們身邊缺少雙引號)。

作為次要說明,我還對vars塊進行了調整,以使用YAML的列表語法,而不是您選擇的Python樣式語法,但這比其他任何東西更個人喜好。 您也可以分解docker_require_rolespip_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM