0

我有两部戏剧,每部都有一项任务。

第一个 Play 检查是否/var/test.dat存在于每个目标上。只有当第一次播放成功时,我才希望运行第二次播放,它并行执行这些脚本。

如果第一次播放失败,即 test.dat 不存在,我希望在不执行第二次播放的情况下终止剧本。为此,我已将 setany_errors_fatal设置为 true

我需要将 ansible Playstrategy设置为免费,因为每个脚本都需要 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: ~/..

我尝试了上面的剧本,但是尽管第一个剧本的任务失败了,但我看到第二个剧本执行了。

你能建议我怎样才能让它工作吗?

4

1 回答 1

0

除非 any_errors_fatal 为真 - Ansible 将在所有主机上完成运行 - 即使其他主机失败。但是,正如您发现的那样, any_errors_fatal 不适用于免费策略。

创建全局变量也是不可能的。

但是,您提到要使用免费策略来加快执行速度。但是,免费策略只能防止“阻止已经完成的主机的新任务”。.

如果您需要在不等待其他主机完成的情况下执行相同的任务,则需要并行性。策略与并行性无关。

在 Ansible 中,您可以使用forks. 但是默认值非常低,只有 5。

您想要的是将此数字设置得更高 - 取决于您执行的主机资源。根据我对大量 cpu 和内存的经验,可以将其调整为数百。

您可以在命令行中ansible.cfg或在命令行中进行设置:

ansible-playbook -f 30 my_playbook.yml

这样您就可以使用默认的线性策略,其中 any_errors_fatal 设置为 true。

于 2020-03-29T12:38:40.973 回答