并行运行作业池,每个作业仅执行一次

时间:2020-09-16 21:51:14

标签: rundeck

我有一个(powershell,如果重要的话)脚本,我希望为每个状态运行一次。这项工作在每个州花费的时间是可变的(不是基于州的人口或类似的事情,这是不可预测的),所以我想做的是创建一个以50个工作为步骤的流程,然后告诉Rundeck在5个线程中运行这50个作业。也许每个线程10个线程,但是可能不行,因为其中一些线程比其他线程更快。但是让Rundeck来管理它,所以如果在那个特定时间结束时是8-9-12-10-11,那就太好了。我了解如何使用Rundeck API创建这50个步骤并将其添加到工作流程中。

但是,我似乎看不到Rundeck如何完全按照我的意愿进行管理。工作流的策略似乎都假设您要在所有节点上运行所有作业(这意味着,如果我有50个步骤和5个节点,它将总共运行250件事,每个状态5次)-我不想要那个;我希望每个作业仅在一个节点上运行,但是我不在乎哪个节点是可用的任何节点。基本上,只是充当负载平衡器。

Rundeck是否支持此功能,还是我必须构建自己的负载平衡脚本?

1 个答案:

答案 0 :(得分:1)

我做了一个使用三个节点,三个作业和一个父作业的示例,以通过Job Reference Step将这三个作业分配给每个节点(一次)。

首先,使用并行策略调用子作业的父作业(意味着每个步骤(每个作业参考))同时运行,协调器作为一组节点的“随机子集”运行(在我的示例中为三个),将“计数”设置为“ 1”(每个作业参考步骤指向单个节点)。

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
      <threadcount>3</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>17aad193-1e2c-45dc-b736-901c1de00954</id>
    <loglevel>INFO</loglevel>
    <name>ParentJobRemoteParallel</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node.*</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <orchestrator>
      <configuration>
        <count>3</count>
      </configuration>
      <type>subset</type>
    </orchestrator>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='parallel'>
      <command>
        <jobref name='HelloWorldONE' nodeStep='true'>
          <uuid>e1ec6d2c-62d9-4de4-af6d-7e03f59cc4e5</uuid>
        </jobref>
      </command>
      <command>
        <jobref name='HelloWorldTWO' nodeStep='true'>
          <uuid>a57e74f2-050d-4a13-841a-3a4552d8227b</uuid>
        </jobref>
      </command>
      <command>
        <jobref name='HelloWorldTHREE' nodeStep='true'>
          <uuid>47067c03-da25-43e1-83cc-9fe0492f0797</uuid>
        </jobref>
      </command>
    </sequence>
    <uuid>17aad193-1e2c-45dc-b736-901c1de00954</uuid>
  </job>
</joblist>

现在,“子作业”将这些作业配置为指向一组具有随机子集编排器和“ 1”的节点,类似于“父作业”。

HelloWorldONE:

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>true</successOnEmptyNodeFilter>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>e1ec6d2c-62d9-4de4-af6d-7e03f59cc4e5</id>
    <loglevel>INFO</loglevel>
    <name>HelloWorldONE</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node.*</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <orchestrator>
      <configuration>
        <count>1</count>
      </configuration>
      <type>subset</type>
    </orchestrator>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <exec>echo "i am the first job"</exec>
      </command>
    </sequence>
    <uuid>e1ec6d2c-62d9-4de4-af6d-7e03f59cc4e5</uuid>
  </job>
</joblist>

HelloWorldTWO:

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>a57e74f2-050d-4a13-841a-3a4552d8227b</id>
    <loglevel>INFO</loglevel>
    <name>HelloWorldTWO</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node.*</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <orchestrator>
      <configuration>
        <count>1</count>
      </configuration>
      <type>subset</type>
    </orchestrator>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='sequential'>
      <command>
        <exec>echo "i am the second job"</exec>
      </command>
    </sequence>
    <uuid>a57e74f2-050d-4a13-841a-3a4552d8227b</uuid>
  </job>
</joblist>

HelloWorldTHREE:

<joblist>
  <job>
    <defaultTab>nodes</defaultTab>
    <description></description>
    <dispatch>
      <excludePrecedence>true</excludePrecedence>
      <keepgoing>false</keepgoing>
      <rankOrder>ascending</rankOrder>
      <successOnEmptyNodeFilter>false</successOnEmptyNodeFilter>
      <threadcount>1</threadcount>
    </dispatch>
    <executionEnabled>true</executionEnabled>
    <id>47067c03-da25-43e1-83cc-9fe0492f0797</id>
    <loglevel>INFO</loglevel>
    <name>HelloWorldTHREE</name>
    <nodeFilterEditable>false</nodeFilterEditable>
    <nodefilters>
      <filter>node.*</filter>
    </nodefilters>
    <nodesSelectedByDefault>true</nodesSelectedByDefault>
    <orchestrator>
      <configuration>
        <count>1</count>
      </configuration>
      <type>subset</type>
    </orchestrator>
    <plugins />
    <scheduleEnabled>true</scheduleEnabled>
    <sequence keepgoing='false' strategy='node-first'>
      <command>
        <exec>echo "i am the third job"</exec>
      </command>
    </sequence>
    <uuid>47067c03-da25-43e1-83cc-9fe0492f0797</uuid>
  </job>
</joblist>

Here,您可以看到结果。

这也适用于步骤,作业参考步骤是命令步骤或脚本步骤之类的步骤。