我正在尝试在剧本中设置变量,以便在剧本级别的整个剧本的其余部分而不是主机级别访问它们。一个示例(从命令行传入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
打破。还有其他方法可以定义这些变量,以便可以通过整个剧本访问它们吗?
答案 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"
而不是true
或false
相反,你需要让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's list syntax而不是你选择的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:
...
至于你想要完成什么的更广泛的想法,看起来你可能会更好地使用不同的库存文件和组变量。