Ansible:如何在YAML中指定单主机执行角色内特定任务文件?
Ansible按标签执行时控制任务主机范围
项目结构
mainly.yml └── roles ├── roles1 │ └── tasks │ ├── main.yml │ ├── playbook1.yml │ └── playbook2.yml └── roles2 └── tasks ├── main.yml ├── playbook3.yml └── playbook4.yml
现有roles1/tasks/main.yml内容
- name: install import_tasks: "playbook1.yml" tags: - role_install - role_install_configure - name: configure import_tasks: "playbook2.yml" tags: - role_configure - role_install_configure
需求
使用标签role_install_configure触发执行时,playbook1.yml的所有任务仅在特定主机server1上执行,playbook2.yml则在库存默认主机组的所有主机上执行,无需为playbook1.yml内的每个任务重复添加when条件,也不通过CLI指定主机范围。
解决方案
直接在import_tasks对应的任务上添加when条件,导入的整个playbook1.yml内的所有任务会自动继承这个条件,仅在server1上执行。修改后的roles1/tasks/main.yml如下:
- name: install (only on server1) import_tasks: "playbook1.yml" tags: - role_install - role_install_configure when: ansible_host == "server1" - name: configure import_tasks: "playbook2.yml" tags: - role_configure - role_install_configure
补充说明
- 若库存中使用主机名而非IP地址,可将条件改为
inventory_hostname == "server1",更贴合库存配置逻辑。 - 若需要单独触发
role_install标签时让playbook1.yml在所有主机执行,可给when条件补充标签判断:when: (ansible_host == "server1") or ('role_install' in ansible_run_tags and 'role_install_configure' not in ansible_run_tags)
内容的提问来源于stack exchange,提问作者esefe sgrgrz
相关产品推荐
相关产品推荐

