我有两个剧本,每个剧本有一个任务。
第一次播放检查每个目标上是否存在/var/test.dat
。只有当第一次播放成功时,我才希望第二次播放并行执行这些脚本。
如果第一次播放失败,即test.dat不存在,我希望在不执行第二次播放的情况下终止剧本。为此,我已将any_errors_fatal
设置为真正的
我需要有一个可翻译的播放strategy
设置为免费,因为每个脚本需要30分钟才能完成。
我对ansible的理解是有限的。
我知道,如果我把两个任务都放在一个PLAY下,并设置策略来释放两个任务,那么这两个任务将并行运行,这是我不想要的。
---
- name: Play 1- check for login and script
hosts: all_hosts
any_errors_fatal: true
strategy: free
tasks:
- name: Check script existence
shell: "ls /var/test.dat"
register: checkscript
- name:
fail:
msg: "script {{ scriptdet }} missing on {{ inventory_hostname }}"
when: checkscript.rc != 0
- name: Play 2- Run scripts
hosts: all_hosts
user: "{{ USER }}"
strategy: free
tasks:
- name: Execute backup script
shell: "{{ scriptdet }}"
args:
chdir: ~/..
我尝试了上面的剧本,但我看到第二部剧执行了,尽管第一部剧的任务失败了。
你能建议我如何让它发挥作用吗?
除非any_errors_catal为true,否则Ansible将在所有主机上完成运行,即使其他主机出现故障。然而,正如您所发现的,any_errors_catal不适用于免费策略。
创建全局变量也是不可能的。
但是,您提到您希望使用免费策略来加快执行速度。然而,免费策略只能防止"为已经完成的主机阻止新任务">
如果您需要在不等待其他主机完成的情况下执行同一任务,则需要并行性。战略与并行无关。
在Ansible中,可以使用forks
调整并行主机的数量。然而,默认值非常低,仅为5。
您想要的是将这个数字设置得更高——这取决于您的执行主机资源。根据我使用大量cpu和内存的经验,这可以调整到数百。
您可以在ansible.cfg
或命令行中设置:
ansible-playbook -f 30 my_playbook.yml
通过这种方式,您可以使用默认的线性策略,其中any_errors_catal设置为true。