Ansible如何跳过所有roles 无需打标签运行playbook内所有tasks
编写Ansible playbook调试时经常需要反复运行自定义tasks,常规做法是给所有tasks和/或roles打标签,再通过--tags参数选择性执行。如果想跳过所有roles、仅运行playbook内直接定义的tasks,有没有无需给所有内容逐个打标签的快捷实现方式?
现有示例playbook如下:
--- - name: example playbook become: true hosts: - worker roles: - dev-sec.ssh-hardening - iptables tasks: - name: install pip3 apt: name=python3-pip state=present - name: install kas via pip pip: name: kas state: present
期望实现类似执行如下命令的效果,无需为tasks打标签即可跳过所有roles,仅运行my-example-playbook.yml中定义的tasks:
ansible-playbook -i hosts.yml my-example-playbook.yml --skip-all-roles
Ansible原生没有--skip-all-roles这个直接参数,两个方案可以实现需求,按需选择即可:
零改动方案:直接用
--start-at-task参数指定从tasks段第一个任务开始执行。Ansible的执行顺序是pre_tasks→roles→tasks→post_tasks,指定从tasks段的首个任务启动时,前面所有roles的内容会被直接跳过。
对应示例的执行命令:ansible-playbook -i hosts.yml my-example-playbook.yml --start-at-task "install pip3"注意这个方案会同时跳过
pre_tasks段的内容,如果play里写了pre_tasks要慎用;另外要保证指定的任务名全局唯一,避免匹配到角色内的同名任务。一劳永逸方案:花1分钟调整下
roles段写法,给所有引入的角色统一打一个公共标签,不需要改任何角色内部代码,也不需要给自定义tasks打标签,后续就能用固定参数一键跳过所有roles。
修改后的roles段示例:roles: - role: dev-sec.ssh-hardening tags: managed_roles - role: iptables tags: managed_roles后续要跳过roles只跑自定义tasks时,直接执行:
ansible-playbook -i hosts.yml my-example-playbook.yml --skip-tags managed_roles正常跑全量流程时直接不加参数执行即可,不受任务名修改、pre_tasks配置影响,适合长期维护的playbook。
内容的提问来源于stack exchange,提问作者grmmgrmm

