我想在运行 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"