Rulebook Flow Control
If-then-else¶
Rules can contain if
ops that execute conditional statements.
do: - res = shell: curl http://myserver - if: "{{ res.rc > 0 && res.rc < 128 }}" then: - fail: invalid server - if: "{{ /resolve/.exec( res.output ) }}" then: - echo: "a DNS error maybe?" else: - echo: 'something else then'
Foreach Loops¶
Foreach loops are meant to run a do
block over data or the contents of an
array variable using the foreach
statement.
do: - foreach: var: server in: - server1 - server2 do: - curl -LO http://${server1}/test_url
The same can be accomplished with variables:
vars: - servers: - server1 - server2 do: - foreach: var: server in: ${servers} do: - curl -LO http://${server1}/test_url
Note that the var
argument, which holds the name of the variable that's
receiving each of the values in the in
array, is a simple string, without any
variable template markers such as ${ }
or {{ }}
, while the contents of the
in
arguments need to be resolved.
Anonymous Foreach loops¶
You can also use a quicker notation for Foreach loops, without defining an
assigment variable. In that case, the special it
variable will be set with
the looping value.
do: - foreach: [ 'server1', 'server2' ] do: - curl -LO http://${it}/test_url
While loops¶
You can also build loops using inline ClaJS code. This is useful for complex loop validation.
do: - ok =: false - while: "{{ ! ok }}" do: - res = shell: curl -LO http://${server1}/test_url - ok =: "{{ res.rc == 0 }}"
You can use while
loops to loop through a counter:
do: - ok =: '{{ 0 }}' # yaml values are not numeric, use JS to assign as Int - while: "{{ ok < 100 }}" do: - echo: ${ok} - ok =: "{{ ok + 1 }}"
Return¶
The return
op exits the current do
block. You can nest do
blocks inside do
blocks for better flow control, or better, use def
to define clearly scoped
functions.
Make sure to use a bare return:
(followed by colon) if no return value supplied,
otherwise it will be executed as a local shell command in a Docker container.
do: - echo: lets try something - do: - res = shell: curl http://myserver - echo: "Exit code was ${res.rc}" - if: '{{ res.rc > 0 }}' then: - echo: 'we are out of here' - return: - echo: "everything looks good, so continue"
Fail¶
To exit the current program, you can also call fail:
.
This will throw an error up the scope, and can only be caught by a
try-catch
.