Ansible是否禁止混合roles与tasks?playbook执行报错求助
你的Ansible Playbook报错分析与解决办法
先给你吃个定心丸:Ansible完全允许在同一个play里混合使用roles和tasks,你遇到的报错和这个无关,问题出在YAML语法的缩进和格式上。
为啥会报错?
看你贴的site.yml代码,tasks前面多了个不该有的短横线(-)!这个错误直接打乱了整个play的结构:原本tasks是和hosts、vars、roles同级的play顶级配置项,加了短横线后,Ansible会把它当成一个新的、独立的play来解析,但这个新play没有必填的hosts字段,所以就抛出了ERROR! the field 'hosts' is req...的报错。
原代码的错误片段:
- hosts: some_hosts vars: pip_install_packages: - name: docker - tasks: # 这里的短横线是罪魁祸首! - name: Conditionally include bar vars include_vars: file: bar_vars.yml when: some_condition == "bar"
修正后的正确Playbook
只需要把tasks前面的短横线删掉,调整好缩进就行:
- hosts: some_hosts vars: pip_install_packages: - name: docker tasks: - name: Conditionally include bar vars include_vars: file: bar_vars.yml when: some_condition == "bar" - name: Conditionally include foo vars include_vars: file: foo_vars.yml when: some_condition == "foo" roles: - role1 - role2 environment: SOME_ENV_VAR: "{{ vault_some_env_var }}"
额外说下roles和tasks的执行顺序
顺便补个实用知识点:当同一个play里同时有roles和tasks时,Ansible的执行顺序是固定的:
- 先跑
pre_tasks(如果定义了的话) - 按顺序执行所有
roles - 再跑你定义的
tasks - 最后跑
post_tasks(如果有)
要是你想让自己写的tasks在roles之前执行,把它们放到pre_tasks里就行。
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

