代码之家  ›  专栏  ›  技术社区  ›  Petr

仅适用于匹配某些变量的主机的简单运行剧本

  •  1
  • Petr  · 技术社区  · 8 年前

    when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6
    

    整个剧本中的每一项任务,但对我来说似乎效率很低。

    难道没有办法把整个剧本限制在这些机器上,这样我就不必把这条线放在每一个任务中了吗?

    我想它甚至会执行得更快,因为它不需要在每个任务中检查服务器是否为RedHat 6。

    此外,我认为最有效的性能方法是将RHEL 6服务器的列表存储在一边,并仅在其上执行此剧本,因为Ansible并不是真正缓存此信息,所以它总是必须连接到所有服务器,以确定它们是否为RHEL和版本6?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Konstantin Suvorov    8 年前

    使用 include with_first_found :

    - include: "{{ include_path }}"
      with_first_found:
       - "{{ ansible_distribution }}.yml"
       - "{{ ansible_os_family }}.yml"
       - "default.yml"
      loop_control:
        loop_var: include_path
    

    更新:已添加 loop_var 以防止可能 item 可变碰撞。

        2
  •  0
  •   Henrik Pingel    8 年前

    解决此问题的一个策略是在主任务文件中包含一个任务文件,其中包含特定于分发版本的任务,如以下所示:

    - include: "{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml"
    

    文件 tasks/RedHat-6.yml 将包含RHEL6的所有特定任务。

    当您想让您的剧本在不支持分发时失败时,您可以这样做:

    - include: RedHat6.yml
      when: ansible_distribution == "RedHat" and ansible_distribution_major_version == 6
    
    - fail:
        msg: "Distribution not supported"
        when: ansible_distribution != "RedHat" or whatever conditions you want