在剧本执行之前/之后更新 SLURM 节点状态

在剧本执行之前/之后更新 SLURM 节点状态

我想在运行 Ansible 剧本之前/之后自动设置 SLURM 集群中节点的状态(从空闲到耗尽,在应用剧本后回到空闲状态)。scontrol为此所需的命令仅在集群的头节点上可用。但是,Ansible 剧本应用于集群的计算节点。有没有办法在当前连接的主机以外的其他主机上运行远程命令?我可以考虑只使用内置模块,shell然后通过 SSH 连接到头节点。但也许有更好的方法吗?

我已经寻找了现成的 Ansible 模块,但找不到适合我的用例的模块。现有的模块都专注于安装/配置 SLURM 集群。

我的想法是使用do-until循环设置新的集群节点状态,然后反复检查节点是否已切换到新状态(因为可能仍有正在运行的作业)。

答案1

我最终按照以下方式解决了这个问题:

  • 请注意,我正在从本地客户端运行剧本(而不是在头节点本身)。

  • 我添加了一个strategy: free命令以允许在每个节点上尽可能快地执行,因为所有节点同时可用来应用配置的可能性较小。

  • 我添加了一个pre_task在之前执行并耗尽节点的代码:

  pre_tasks:
  - name:
    tags:
    - always
    delegate_to: 127.0.0.1
    shell: ssh -t user@slurm-head "srun -w {{ slurm_node_name}} sleep 3 && echo {{ ldap_passwd }} | sudo -S scontrol update NodeName={{ slurm_node_name }} State=Drain Reason=Maintenance"
    any_errors_fatal: true
  • 我添加了一个block捆绑所有任务的命令,并以一个部分结尾,always以确保即使某些任务失败,节点也会重新进入空闲状态。我在这里的假设是,未能应用配置不会破坏节点,最好让它再次可用,而不是阻止它,直到我有时间研究这个问题。
  tasks:
    - name: Configure node for Hardware Security course
      block:
      - name: Tasks 1
      ...
      - name: Task 2
      ...

      any_errors_fatal: true
      always:
      - name:
        tags:
        - always
        delegate_to: 127.0.0.1
        shell: ssh -t user@slurm-head "echo {{ ldap_password }} | sudo -S scontrol update NodeName={{ slurm_node_name }} State=RESUME"

相关内容