<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <br>
    Olivier Mauras raised a very clear problem with Rudder. His use case
    is very simple, but impossible to implement with Rudder today:<br>
    <br>
    "How can I gradually change the configuration of an elastic search
    cluster with Rudder ?"<br>
    <br>
    To be clearer, the use general use case is as follow: we have a set
    of nodes which must do action only if some global properties is set,
    or if some other nodes of the pod^W(ok, kidding) defined set of
    nodes are in a certain state. <br>
    <br>
    Typically, what we want to do: We have 3 nodes in a elastic search
    cluster. We want to update elastic search version. WHEN load allow
    it, we want to have one node going out of the cluster, upgrading the
    version, starting again, doing some sanity check, saying that it is
    up again, being included in the cluster, wainting some time, and
    then have a second node taking the same step. <br>
    <br>
    Today, with Rudder, even with some randomisation of the datetime
    when node are checking their config, you are likelly to have: the
    three nodes see there is a new version, they update (perhaps within
    a couple of minute of interval) the config, restart the service
    => the whole cluster goes dark<br>
    <br>
    <br>
    The common answer to that, is of course having some kind of
    orchestration :)<br>
    <br>
    With the Rudder of today, we could imagine having ad-hoc groups
    created with specif rules, perhaps via API, so that the logic could
    be in some external script. Quite cunbersome and unreliable. <br>
    <br>
    So, we need to add something allowing to share states betweens nodes
    and global context, so that each node can coordinate (globally and
    with each other). <br>
    <br>
    <br>
    The challenges are:<br>
    <ul>
      <li>states may be updated more than every 5 minutes, so we can't
        rely on agent runs to check them, </li>
      <li>but in fact, the period it not the problem: we want to have
        the node REACT to changes, not wait for the next run</li>
      <li>of course, we don't want to check EVERYTHING on reaction, we
        only want to check/execute things related to the event</li>
      <ul>
        <li>imagine: "ho, I'm going to check the md5sum of everything in
          /etc (security policy) because I just got an event "load to
          higth on the cluster, make the app more prioritary!"</li>
      </ul>
      <li>we need to thing about coordination beyond network partitions
        (i.e relay servers, what happen if part of the tagets don't get
        an event, etc)</li>
      <li>the properties must easilly queriable (i.e: we must be able to
        get them without running the agent, so that integration in
        scripts is possible - or just debugging to understand what is
        happening). <br>
      </li>
      <li>we need to be able to define complexe condition and sequences
        of action for a node, so that things like that scenario are
        possible:</li>
      <ul>
        <li>when I get an "update version" rule, <br>
        </li>
        <ul>
          <li>if the global load of the cluster is beyond</li>
          <li>and if no other node of the cluster is currently
            upgrading, <br>
          </li>
          <ul>
            <li>try to get the semaphore for upgrading <br>
            </li>
            <li>and wait XX time before releasing</li>
            <li>of course, if something went wrong, don't keep the token
              for ever<br>
            </li>
          </ul>
        </ul>
      </ul>
    </ul>
    <br>
    The problem is hardly new, and whole part of our industry are
    dedicated to solve it. For example, consul manage most of the
    problems. We could integrate consul + Rudder in that way. <br>
    An other idea is to use cf-engine built-in server capacities to
    expose properties (promises state) to other nodes. <br>
    There is certainly a whole lot of other possibilites. <br>
    <br>
    So, community : is it a use case that ring a bell for you ? How do
    manage it ? What would be the best integration in Rudder ? <br>
    <br>
    Thanks !<br>
    <br>
    <div class="moz-signature">-- <br>
      <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
      <style type="text/css"><!--
    a.redlink:link { color: #1782E6; text-decoration: none; }
    a.redlink:visited { color: #1782E6; text-decoration: none; }
    .sig { font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; font-size: small; }
    .sigsmall { font-family: 'Century Gothic', CenturyGothic, AppleGothic, sans-serif; font-size: x-small; }
  --></style> <a href="https://www.normation.com/fr/"><img alt="Nouveau
          site web Normation"
          src="cid:part1.02030001.04080709@normation.com">
        <table border="0" cellpadding="0" cellspacing="2" width="380">
          <tbody>
            <tr>
              <td colspan="2">
                <hr></td>
            </tr>
            <tr>
              <td colspan="2"><b><img alt=""
                    src="cid:part2.08020006.06080806@normation.com"
                    align="left" height="50" hspace="10" width="50"> <span
                    class="sig">François ARMAND</span></b><br>
                <span class="sig"><i>Co-founder & CTO</i></span><br>
                <span class="sig"><a class="redlink"
                    href="http://www.normation.com">Normation</a></span>
              </td>
            </tr>
            <tr>
              <td colspan="2">
                <hr></td>
            </tr>
            <tr>
              <td colspan="2"><span class="sigsmall"><b>87 rue de
                    Turbigo, 75003 Paris, France</b></span></td>
            </tr>
            <tr>
              <td><span class="sigsmall">Telephone:</span></td>
              <td><span class="sigsmall">+33 (0)1 83 62 99 23</span></td>
            </tr>
            <tr>
              <td><span class="sigsmall">Mobile:</span></td>
              <td><span class="sigsmall">+33 (0)6 63 37 60 55</span></td>
            </tr>
            <tr>
              <td colspan="2">
                <hr></td>
            </tr>
          </tbody>
        </table>
      </a></div>
  </body>
</html>