Ansible
在劇本執行之前/之後更新 SLURM 節點狀態
我想在執行我的 Ansible 劇本之前/之後自動設置 SLURM 集群中節點的狀態(從空閒到耗盡以及在將劇本應用回空閒之後)。為此所需的
scontrol
命令僅在集群的頭節點上可用。然而,Ansible playbook 適用於集群的計算節點。有沒有辦法在目前連接的主機之外的另一台主機上執行遠端命令?我可以考慮只使用內置shell
模組,然後通過 SSH 連接到頭節點。但也許有更好的方法呢?我已經在尋找現成的 Ansible 模組,但找不到適合我的案例的模組。現有的都專注於安裝/配置 SLURM 集群。
然後我的想法是使用一個
do-until
循環來設置新的集群節點狀態,然後反複檢查節點是否已經切換到新狀態(因為仍然可能有正在執行的作業)。
我最終通過以下方式管理它:
- 請注意,我正在從本地客戶端(不是在頭節點本身)執行劇本。
- 我添加了一個
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"