Ansible

在劇本執行之前/之後更新 SLURM 節點狀態

  • January 13, 2021

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

引用自:https://serverfault.com/questions/1044375