如何在Ansible中设置playbook级变量?

时间:2015-12-30 20:57:39

标签: ansible ansible-playbook

我正在尝试在剧本中设置变量,以便在剧本级别的整个剧本的其余部分而不是主机级别访问它们。一个示例(从命令行传入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打破。还有其他方法可以定义这些变量,以便可以通过整个剧本访问它们吗?

2 个答案:

答案 0 :(得分:2)

这种变形作为布尔的事情变得棘手。这就是我能够开展的工作:

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运行它的ansible并评估“in”表达式而不是只留下字符串"dev in docker_required_roles"

引用变量时,必须始终记得使用bool过滤器来避免字符串"False"被解释为真实。

答案 1 :(得分:1)

看起来你误解了你的剧本在哪里摔倒。

错误告诉您它无法评估您放置pip角色的条件,因为您传递的是字符串文字"dev in pip_required_roles"而不是truefalse

相反,你需要让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's list syntax而不是你选择的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:
    ...

至于你想要完成什么的更广泛的想法,看起来你可能会更好地使用不同的库存文件和组变量。