<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ansible Training – 11. Event Driven Ansible</title><link>/docs/11/</link><description>Recent content in 11. Event Driven Ansible on Ansible Training</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><atom:link href="/docs/11/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: 11.1 Event Driven Ansible - Basics</title><link>/docs/11/01/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/11/01/</guid><description>
&lt;p>In this lab we are going to learn how to use Event Driven Ansible.
For the following tasks, server &lt;code>node1&lt;/code> and &lt;code>node2&lt;/code> act as webservers. You can use Lab 4.0 as a guideline.&lt;/p>
&lt;h3 id="task-1">Task 1&lt;/h3>
&lt;ul>
&lt;li>Point your webbrowser to the official documentation of &lt;code>ansible-rulebook&lt;/code>.&lt;/li>
&lt;li>Install and configure everything needed to run ansible-rulebook and source plugins.&lt;/li>
&lt;li>Check the version of &lt;code>ansible-rulebook&lt;/code>&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 1&lt;/summary>
&lt;p>&lt;a href="https://ansible-rulebook.readthedocs.io/">https://ansible-rulebook.readthedocs.io/&lt;/a>&lt;/p>
&lt;p>Fedora 36+:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf --assumeyes install java-17-openjdk python3-pip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>export JAVA_HOME&lt;span style="color:#f92672">=&lt;/span>/usr/lib/jvm/jre-17-openjdk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install ansible ansible-rulebook
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ansible-galaxy collection install ansible.eda
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Enterprise Linux 9:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo dnf install java-17-openjdk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>export JAVA_HOME&lt;span style="color:#f92672">=&lt;/span>/usr/lib/jvm/jre-17-openjdk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dnf install python3-pip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python3 -m venv ~/python
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>. ~/python/bin/activate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install --upgrade pip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install ansible ansible-rulebook
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ansible-galaxy collection install ansible.eda
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dnf install systemd-devel gcc python3-devel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pip install -r ~/.ansible/collections/ansible_collections/ansible/eda/requirements.txt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Output on EL9:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>version__ &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;1.0.0&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Executable location &lt;span style="color:#f92672">=&lt;/span> /home/ansible/python/bin/ansible-rulebook
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Drools_jpy version &lt;span style="color:#f92672">=&lt;/span> 0.3.4
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Java home &lt;span style="color:#f92672">=&lt;/span> /usr/lib/jvm/java-17-openjdk-17.0.7.0.7-3.el9.x86_64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Java version &lt;span style="color:#f92672">=&lt;/span> 17.0.7
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Python version &lt;span style="color:#f92672">=&lt;/span> 3.9.16 &lt;span style="color:#f92672">(&lt;/span>main, Dec &lt;span style="color:#ae81ff">8&lt;/span> 2022, 00:00:00&lt;span style="color:#f92672">)&lt;/span> &lt;span style="color:#f92672">[&lt;/span>GCC 11.3.1 &lt;span style="color:#ae81ff">20221121&lt;/span> &lt;span style="color:#f92672">(&lt;/span>Red Hat 11.3.1-4&lt;span style="color:#f92672">)]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-2">Task 2&lt;/h3>
&lt;ul>
&lt;li>Write a playbook &lt;code>webserver.yml&lt;/code> that installs the servers in group &lt;code>web&lt;/code> as webservers. See Lab 4.0 for guidelines.&lt;/li>
&lt;li>Ensure that the playbook also sets a webpage at &lt;code>/var/www/html/index.html&lt;/code>.&lt;/li>
&lt;li>Ensure that the inventory file &lt;code>hosts&lt;/code> in the folder inventory has the group &lt;code>web&lt;/code> with &lt;code>node1&lt;/code> and &lt;code>node2&lt;/code> as members.&lt;/li>
&lt;li>Run the playbook &lt;code>webserver.yml&lt;/code> and check that the webservers are up and running.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 2&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat webserver.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> become: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tasks:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: install httpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.dnf:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - httpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - firewalld
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state: installed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: start and enable httpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.systemd_service:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: httpd
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state: started
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> enabled: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: put default webpage
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.copy:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> content: &lt;span style="color:#e6db74">&amp;#34;Ansible Labs by Puzzle ITC&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> dest: /var/www/html/index.html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> owner: root
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> group: root
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> mode: &lt;span style="color:#e6db74">&amp;#34;0644&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: start and enable firewalld
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.systemd_service:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: firewalld
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state: started
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> enabled: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: open firewall &lt;span style="color:#66d9ef">for&lt;/span> http
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.posix.firewalld:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> service: http
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state: enabled
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> permanent: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> immediate: true
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat inventory/hosts
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>controller&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>control0 ansible_host&lt;span style="color:#f92672">=&lt;/span>&amp;lt;ip-of-control0&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">[&lt;/span>web&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>node1 ansible_host&lt;span style="color:#f92672">=&lt;/span>&amp;lt;ip-of-node1&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>node2 ansible_host&lt;span style="color:#f92672">=&lt;/span>&amp;lt;ip-of-node2&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-playbook -i inventory/hosts webserver.yml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo dnf install -y lynx
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lynx http://&amp;lt;ip-of-node1&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lynx http://&amp;lt;ip-of-node2&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-3">Task 3&lt;/h3>
&lt;ul>
&lt;li>Write a rulebook &lt;code>webserver_rulebook.yml&lt;/code> that checks if the webpages on &lt;code>node1&lt;/code> and &lt;code>node2&lt;/code> are up and running.&lt;/li>
&lt;li>If the webpages are not available anymore, the &lt;code>webserver.yml&lt;/code> playbook should be re-run.&lt;/li>
&lt;li>Use &lt;code>url_check&lt;/code> from the &lt;code>ansible.eda&lt;/code> collection as the source plugin in your rulebook.&lt;/li>
&lt;li>Check the availability of the websites every 8 seconds.&lt;/li>
&lt;/ul>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
If you don&amp;rsquo;t have the &lt;code>ansible.eda&lt;/code> collection installed yet,
&lt;code>ansible-rulebook&lt;/code> would start, but fail because the &lt;code>url_check&lt;/code> source plugin cannot be found.
&lt;/div>
&lt;details >
&lt;summary>Solution Task 3&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat webserver_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- name: rebuild webservers &lt;span style="color:#66d9ef">if&lt;/span> site down
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sources:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check webserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.eda.url_check:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> urls:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node1&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node2&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> delay: &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rules:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> condition: event.url_check.status &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> action:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> run_playbook:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: webserver.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-4">Task 4&lt;/h3>
&lt;ul>
&lt;li>Start &lt;code>webserver_rulebook.yml&lt;/code> in verbose mode.&lt;/li>
&lt;li>Stop the httpd service on &lt;code>node1&lt;/code> with ansible from another terminal on &lt;code>control0&lt;/code>
and see how the playbook &lt;code>webserver.yml&lt;/code> is re-run.
(You could also just stop the service directly on &lt;code>node1&lt;/code>.)&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 4&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --rulebook webserver_rulebook.yml -i inventory/hosts --verbose
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ansible node1 -i inventory/hosts -b -m ansible.builtin.systemd_service -a &lt;span style="color:#e6db74">&amp;#34;name=httpd state=stopped&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-5">Task 5&lt;/h3>
&lt;ul>
&lt;li>Write the rulebook &lt;code>webhook_rulebook.yml&lt;/code> that opens a webhook on port 5000 of the control node &lt;code>control0&lt;/code>.&lt;/li>
&lt;li>The rulebook should re-run the playbook &lt;code>webserver.yml&lt;/code>
if the webhook receives a message matching exactly the string &amp;ldquo;webservers down&amp;rdquo;.&lt;/li>
&lt;li>Use &lt;code>webhook&lt;/code> from the &lt;code>ansible.eda&lt;/code> collection as the source plugin in your rulebook.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 5&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat webhook_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">rebuild webserver if webhook receives message that matches rule condition&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">hosts&lt;/span>: &lt;span style="color:#ae81ff">web&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">sources&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">start webhook and listen for messages&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ansible.eda.webhook&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">0.0.0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">port&lt;/span>: &lt;span style="color:#ae81ff">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">rules&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">rebuild webserver if monitoring tool sends alert&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">condition&lt;/span>: &lt;span style="color:#ae81ff">event.payload.message == &amp;#34;webservers down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">action&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run_playbook&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">webserver.yml&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-6">Task 6&lt;/h3>
&lt;ul>
&lt;li>Run the rulebook &lt;code>webhook_rulebook.yml&lt;/code> in verbose mode.&lt;/li>
&lt;li>Send the string &amp;ldquo;webservers running&amp;rdquo; to the webhook.&lt;/li>
&lt;li>You can do this by issuing:
&lt;code>curl -H 'Content-Type: application/json' -d &amp;quot;{\&amp;quot;message\&amp;quot;: \&amp;quot;webservers running\&amp;quot;}&amp;quot; 127.0.0.1:5000/endpoint&lt;/code>&lt;/li>
&lt;li>See how the message is received, processed, but no actions are taken since the message doesn&amp;rsquo;t match the condition defined.&lt;/li>
&lt;li>Now send the message &amp;ldquo;webservers down&amp;rdquo; to the webhook. See how the playbook &lt;code>webserver.yml&lt;/code> is run.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 6&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --rulebook webhook_rulebook.yml -i inventory/hosts --verbose
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -H &lt;span style="color:#e6db74">&amp;#39;Content-Type: application/json&amp;#39;&lt;/span> -d &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;message\&amp;#34;: \&amp;#34;webservers running\&amp;#34;}&amp;#34;&lt;/span> 127.0.0.1:5000/endpoint
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -H &lt;span style="color:#e6db74">&amp;#39;Content-Type: application/json&amp;#39;&lt;/span> -d &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;message\&amp;#34;: \&amp;#34;webservers down\&amp;#34;}&amp;#34;&lt;/span> 127.0.0.1:5000/endpoint
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-7">Task 7&lt;/h3>
&lt;ul>
&lt;li>Write the rulebook &lt;code>complex_rulebook.yml&lt;/code>. It has to meet the following requirements:&lt;/li>
&lt;li>It should check for three things:
&lt;ul>
&lt;li>check if the website on one of the two webservers is down. (Same as Task 3 above)&lt;/li>
&lt;li>check if the message matches exactly the string &amp;ldquo;webservers down&amp;rdquo; (Same as Task 5 above)&lt;/li>
&lt;li>check if the message contains the string &amp;ldquo;ERROR&amp;rdquo; or &amp;ldquo;error&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>If one of the criteria above are met, do two things:
&lt;ol>
&lt;li>run the ansible shell module to print the string &amp;ldquo;WEBSERVER ISSUES, REMEDIATION IN PROGRESS.&amp;rdquo;
into the journald log. (Use the command &lt;code>systemd-cat echo &amp;quot;WEBSERVER ISSUES, REMEDIATION IN PROGRESS.&amp;quot;&lt;/code>)&lt;/li>
&lt;li>run playbook &lt;code>webservers.yml&lt;/code>&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>Start the rulebook &lt;code>complex_rulebook.yml&lt;/code> and send the message &amp;ldquo;webservers down&amp;rdquo; to the webhook again.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 7&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat complex_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- name: rebuild webserver &lt;span style="color:#66d9ef">if&lt;/span> webhook receives message that matches rule condition
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sources:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check webserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.eda.url_check:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> urls:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node1&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node2&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> delay: &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: start webhook and listen &lt;span style="color:#66d9ef">for&lt;/span> messages
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.eda.webhook:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> host: 0.0.0.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> port: &lt;span style="color:#ae81ff">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rules:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: rebuild webserver &lt;span style="color:#66d9ef">if&lt;/span> any source reports an alert
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> condition:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> any:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - event.url_check.status &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - event.payload.message &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;webservers down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - event.payload.message is search&lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#e6db74">&amp;#34;ERROR&amp;#34;&lt;/span>,ignorecase&lt;span style="color:#f92672">=&lt;/span>true&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> actions:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - run_module:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: ansible.builtin.shell
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> module_args:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cmd: &lt;span style="color:#e6db74">&amp;#34;systemd-cat echo \&amp;#34;WEBSERVER ISSUES, REMEDIATION IN PROGRESS.\&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - run_playbook:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: webserver.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --rulebook complex_rulebook.yml -i inventory/hosts --verbose
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -H &lt;span style="color:#e6db74">&amp;#39;Content-Type: application/json&amp;#39;&lt;/span> -d &lt;span style="color:#e6db74">&amp;#34;{\&amp;#34;message\&amp;#34;: \&amp;#34;webservers down\&amp;#34;}&amp;#34;&lt;/span> 127.0.0.1:5000/endpoint
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Note, that you would have to open port 5000 on the firewall if the curl command is not sent from the controller itself.&lt;/p>
&lt;/details>
&lt;h3 id="task-8">Task 8&lt;/h3>
&lt;ul>
&lt;li>What source plugins are available in the &lt;code>ansible.eda&lt;/code> collection?
&lt;a href="https://github.com/ansible/event-driven-ansible">Search the content of event-driven-ansible on GitHub.com&lt;/a>.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 8&lt;/summary>
&lt;p>&lt;a href="https://github.com/ansible/event-driven-ansible/tree/main/extensions/eda/plugins/event_source">Event Driven Ansible on GitHub&lt;/a>&lt;/p>
&lt;/details>
&lt;h3 id="all-done">All done?&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://ansible-rulebook.readthedocs.io/">Ansible-rulebook documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.youtube.com/@AnsibleAutomation/videos">AnsibleAutomates YouTube channel for more examples&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: 11.2. Event Driven Ansible - Events and Facts</title><link>/docs/11/02/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/11/02/</guid><description>
&lt;p>In this lab we will have a closer look at events and facts.&lt;/p>
&lt;h3 id="task-1">Task 1&lt;/h3>
&lt;ul>
&lt;li>Copy the rulebook from Lab 11.2 Task 3 to a new one with the name &lt;code>debug_event_rulebook.yml&lt;/code>.&lt;/li>
&lt;li>Substitute the &lt;code>run_playbook&lt;/code> action with a &lt;code>debug&lt;/code> action.&lt;/li>
&lt;li>That debug action should print out all information from the event.&lt;/li>
&lt;li>Stop the httpd service on node1.&lt;/li>
&lt;li>Run the rulebook in verbose mode. The debug action should show all information about the event.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 1&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat debug_event_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- name: show event json &lt;span style="color:#66d9ef">if&lt;/span> site down
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sources:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check webserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.eda.url_check:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> urls:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node1&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node2&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> delay: &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rules:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check &lt;span style="color:#66d9ef">if&lt;/span> site down and debug
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> condition: event.url_check.status &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> action:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> debug:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> var: event
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible node1 -i inventory/hosts -b -m ansible.builtin.systemd_service -a &lt;span style="color:#e6db74">&amp;#34;name=httpd state=stopped&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --rulebook debug_event_rulebook.yml -i inventory/hosts -vv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-26 15:04:55,381 - ansible_rulebook.rule_set_runner - INFO - call_action debug
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-26 15:04:55,381 - ansible_rulebook.rule_set_runner - INFO - substitute_variables &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;var&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;event&amp;#39;&lt;/span>&lt;span style="color:#f92672">}]&lt;/span> &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;event&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;url_check&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;error_msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Cannot connect to host 5.102.146.223:80 ssl:default [Connect call failed (&amp;#39;5.102.146.223&amp;#39;, 80)]&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;http://5.102.146.223/&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;status&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;down&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;meta&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;received_at&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;2023-06-26T13:04:55.379428Z&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;source&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;check webserver&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;ansible.eda.url_check&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;uuid&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;6710f9a8-c489-4699-a804-8e796855e290&amp;#39;&lt;/span>&lt;span style="color:#f92672">}}}]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-26 15:04:55,381 - ansible_rulebook.rule_set_runner - INFO - action args: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;var&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;event&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;url_check&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;error_msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Cannot connect to host 5.102.146.223:80 ssl:default [Connect call failed (&amp;#39;5.102.146.223&amp;#39;, 80)]&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;http://5.102.146.223/&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;status&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;down&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;meta&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;received_at&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;2023-06-26T13:04:55.379428Z&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;source&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;check webserver&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;ansible.eda.url_check&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;uuid&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;6710f9a8-c489-4699-a804-8e796855e290&amp;#39;&lt;/span>&lt;span style="color:#f92672">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-2">Task 2&lt;/h3>
&lt;ul>
&lt;li>Rewrite the rulebook &lt;code>debug_event_rulebook.yml&lt;/code>:&lt;/li>
&lt;li>Use a &lt;code>run_playbook&lt;/code> action to start a playbook named &lt;code>sos.yml&lt;/code>&lt;/li>
&lt;li>The playbook &lt;code>sos.yml&lt;/code> should create an unattended sos report labeled with the fully qualified collection
name of the source plugin used. Be sure to install the appropriate packages so that the sos report can be created.&lt;/li>
&lt;li>The name of the source plugin should be taken from the json output as a variable.&lt;/li>
&lt;li>The creation of the sos report takes quite some time.&lt;/li>
&lt;li>Ensure that the condition is throttled to run the action once within 5 minutes at most.&lt;/li>
&lt;li>The delay of the source check should stay at 8 seconds.&lt;/li>
&lt;li>Run the rulebook &lt;code>debug_event_rulebook.yml&lt;/code> and ensure the sos reports on the webservers have the needed label.&lt;/li>
&lt;/ul>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
There are good onlinetools to convert &lt;a href="https://jsonformatter.curiousconcept.com">one-line json to multiline json&lt;/a> as well as &lt;a href="https://jsonformatter.org/json-to-yaml">json to yaml converters&lt;/a>.
Note: The json copied from the output has sometimes single quotes, RFC 8259 demands double quotes.
Be sure that your converter fixes this as well.
These converters can come in handy for easier reading of the output.
&lt;/div>
&lt;details >
&lt;summary>Solution Task 2&lt;/summary>
&lt;p>See the documentation on how to &lt;a href="https://ansible.readthedocs.io/projects/rulebook/en/v1.1.6/conditions.html#throttle-actions-to-counter-event-storms-reactive">throttle event storms&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat debug_event_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- name: run sos playbook &lt;span style="color:#66d9ef">if&lt;/span> site down
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sources:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check webserver
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.eda.url_check:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> urls:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node1&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - http://&amp;lt;ip-of-node2&amp;gt;:80/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> delay: &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rules:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> condition: event.url_check.status &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> throttle:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> once_within: &lt;span style="color:#ae81ff">5&lt;/span> minutes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> group_by_attributes:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - event.meta.source.type
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> action:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> run_playbook:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name: sos.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat sos.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- hosts: web
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> become: true
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tasks:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: install sos package
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.dnf:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> name:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - sos
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> state: installed
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - name: create a sos report unattended containing no sensitive information
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ansible.builtin.command:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> cmd: &lt;span style="color:#e6db74">&amp;#34;sos report --clean --batch --label {{ ansible_eda.event.meta.source.type }}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-rulebook --rulebook debug_event_rulebook.yml -i inventory/hosts -vv
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-28 11:15:53,766 - ansible_rulebook.builtin - INFO - ruleset: show event &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> json &lt;span style="color:#66d9ef">if&lt;/span> site down, rule: check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-28 11:15:53,766 - ansible_rulebook.builtin - INFO - Calling Ansible runner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PLAY &lt;span style="color:#f92672">[&lt;/span>web&lt;span style="color:#f92672">]&lt;/span> *********************************************************************
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>TASK &lt;span style="color:#f92672">[&lt;/span>Gathering Facts&lt;span style="color:#f92672">]&lt;/span> *********************************************************
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ok: &lt;span style="color:#f92672">[&lt;/span>node1&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>TASK &lt;span style="color:#f92672">[&lt;/span>install sos package&lt;span style="color:#f92672">]&lt;/span> *****************************************************
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ok: &lt;span style="color:#f92672">[&lt;/span>node1&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>TASK &lt;span style="color:#f92672">[&lt;/span>create a sos report unattended containing no sensitive information&lt;span style="color:#f92672">]&lt;/span> ******
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>changed: &lt;span style="color:#f92672">[&lt;/span>node1&lt;span style="color:#f92672">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PLAY RECAP *********************************************************************
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>node1 : ok&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3&lt;/span> changed&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> unreachable&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span> failed&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>skipped&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span> rescued&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span> ignored&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-28 11:17:59,741 - ansible_rulebook.builtin - INFO - Ansible Runner &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> Queue task cancelled
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-06-28 11:17:59,742 - ansible_rulebook.builtin - INFO - Playbook rc: 0, &lt;span style="color:#ae81ff">\ &lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status: successful
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="all-done">All done?&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://www.youtube.com/watch?v=7i_EzHyrKQc&amp;amp;t=178s">Preview of AAP EDA-Controller GUI&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Docs: 11.3. EDA-Server</title><link>/docs/11/03/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>/docs/11/03/</guid><description>
&lt;p>In this lab we will learn how to use EDA-Server to run our rulebooks. Some tasks have to be done on Ascender.&lt;/p>
&lt;h3 id="task-1">Task 1&lt;/h3>
&lt;p>To connect your EDA-Server to your Ansible Controller,
you have to create an access token on Ascender and add it to EDA-Server&lt;/p>
&lt;ul>
&lt;li>On Ascender, create an access token for the user Ansible. Be sure to choose the write scope&lt;/li>
&lt;li>On EDA-Server add this controller token to the user Ansible&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 1&lt;/summary>
&lt;p>Go to the Ascender Web-GUI&lt;/p>
&lt;ul>
&lt;li>On the left hand side, chose &lt;code>Access&lt;/code>, then &lt;code>Users&lt;/code>&lt;/li>
&lt;li>Click on user &lt;code>ansible&lt;/code>, then chose the tab &lt;code>Tokens&lt;/code> and click on the blue button &lt;code>Add&lt;/code>&lt;/li>
&lt;li>Leave the &lt;code>Application&lt;/code> field empty, add a description and chose the write scope.&lt;/li>
&lt;li>Click the &lt;code>Save&lt;/code> button. Copy the Token from the popup window. This token is shown only once, so remember it.&lt;/li>
&lt;/ul>
&lt;p>Go to the EDA-Server Web-GUI&lt;/p>
&lt;ul>
&lt;li>On the left-hand side, chose &lt;code>User Access&lt;/code> and then &lt;code>Users&lt;/code>&lt;/li>
&lt;li>On the right, chose user &lt;code>ansible&lt;/code>&lt;/li>
&lt;li>Now to the tab &lt;code>Controller Tokens&lt;/code>&lt;/li>
&lt;li>Click on the button &lt;code>Create controller token&lt;/code>.
If you created already one, you have to delete it first to be able to create a new one.&lt;/li>
&lt;li>Enter a name, a description and paste in the token from Ascender in the &lt;code>Token&lt;/code> field&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h3 id="task-2">Task 2&lt;/h3>
&lt;p>Now we add a git repository with our rulebooks as a project to EDA-Server&lt;/p>
&lt;ul>
&lt;li>Be sure, your ansible rulebooks are residing in a top level folder &amp;ldquo;rulebooks&amp;rdquo; inside your git repository&lt;/li>
&lt;li>Add a Project to EDA-Server pointing to your git repository&lt;/li>
&lt;/ul>
&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">Note&lt;/h4>
After creation the status of the project will be &lt;code>failed&lt;/code> as long as you don&amp;rsquo;t have a directory
&lt;code>extensions/eda/rulebooks&lt;/code> or &lt;code>rulebooks&lt;/code> (relative to the root of the repository) present.
&lt;/div>
&lt;details >
&lt;summary>Solution Task 2&lt;/summary>
&lt;ul>
&lt;li>On the left side navigate to &lt;code>Resources&lt;/code> and then &lt;code>Projects&lt;/code>.&lt;/li>
&lt;li>On the right side click on the &lt;code>Create project&lt;/code> button.&lt;/li>
&lt;li>Enter a name, description, leave &lt;code>SCM Type&lt;/code> as &lt;code>Git&lt;/code>.&lt;/li>
&lt;li>As &lt;code>SCM URL&lt;/code> enter the path to your git repository on your Controller node
(&lt;code>https://&amp;lt;yourname&amp;gt;-controller.workshop.puzzle.ch:4000/ansible/techlab&lt;/code>). Remember to use port 4000.&lt;/li>
&lt;li>Leave the &lt;code>Credential&lt;/code> field empty.&lt;/li>
&lt;li>Clink on &lt;code>Create project&lt;/code> at the bottom of the page.&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h3 id="task-3">Task 3&lt;/h3>
&lt;p>The last step needed to be able to run rulebooks is creating a Decision Environment.&lt;/p>
&lt;ul>
&lt;li>Install &lt;code>ansible-builder&lt;/code> with pip on your &lt;code>&amp;lt;yourname&amp;gt;-edaserver&lt;/code>.
Be sure to install &lt;code>podman&lt;/code> as well since it&amp;rsquo;s the default container engine for &lt;code>ansible-builder&lt;/code>.&lt;/li>
&lt;li>Prepare a yaml file &lt;code>techlab-de.yml&lt;/code> with the definition for your Decision Environment.
Take the blueprint from
&lt;a href="https://github.com/ansible/ansible-rulebook/blob/main/minimal-decision-environment.yml">the ansible-rulebook GitHub project&lt;/a>
as your base.&lt;/li>
&lt;li>Build the Decision Environment, name the image &lt;code>techlab-de.yml&lt;/code> and tag it with &lt;code>latest&lt;/code>.&lt;/li>
&lt;li>Push it to the container registry provided by your teacher.&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 3&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip3 install -y ansible-builder podman
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat techlab-de.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;pre tabindex="0">&lt;code>---
version: 3
images:
base_image:
name: &amp;#39;registry.access.redhat.com/ubi9/python-311:latest&amp;#39;
dependencies:
galaxy:
collections:
- ansible.eda
python:
- azure-servicebus
- aiobotocore
- aiohttp
- aiokafka
- watchdog
- systemd-python
- dpath
- ansible-rulebook
ansible_core:
package_pip: ansible-core==2.14.4
ansible_runner:
package_pip: ansible-runner
system:
- java-17-openjdk-devel [platform:rpm]
&lt;/code>&lt;/pre>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>ansible-builder build -f techlab-de.yml -t techlab-de:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>podman login https://&amp;lt;registry_url&amp;gt; -u &amp;lt;username&amp;gt; -p &amp;lt;password&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>podman push techlab-de:latest &amp;lt;registry_url&amp;gt;/techlab-de:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-4">Task 4&lt;/h3>
&lt;ul>
&lt;li>Add the Decision Environment &lt;code>techlab-de&lt;/code> you just created to EDA-Server&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 4&lt;/summary>
&lt;ul>
&lt;li>On the left side of the EDA-Server Web-GUI navigate to &lt;code>Resources&lt;/code> then &lt;code>Decision Environments&lt;/code>.&lt;/li>
&lt;li>On the right side, click on &lt;code>Create decision environemnt&lt;/code>.&lt;/li>
&lt;li>Enter a name and description.&lt;/li>
&lt;li>In the &lt;code>Image&lt;/code> field enter the path with tag to your Decision Environment (&lt;code>&amp;lt;registry_url&amp;gt;/techlab-de:latest&lt;/code>)&lt;/li>
&lt;li>Leave the &lt;code>Credentials&lt;/code> field empty&lt;/li>
&lt;li>Click on &lt;code>Create decision environment&lt;/code> at the bottom of the page.&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h3 id="task-5">Task 5&lt;/h3>
&lt;p>Now have everything ready to run an ansible-rulebook.
Ensure you have a job template &lt;code>Provision_Webserver&lt;/code> in the Organization &lt;code>Techlab&lt;/code> of your Ascender server.
See the Ascender labs to set it up.&lt;/p>
&lt;p>Make the following changes to your &lt;code>webserver_rulebook.yml&lt;/code> rulebook (Lab 11.1):&lt;/p>
&lt;ul>
&lt;li>Change the action of the rulebook to start a job template &lt;code>Provision_Webserver&lt;/code> in the organization &lt;code>Techlab&lt;/code>.&lt;/li>
&lt;li>Be sure to push the changes into your git repository.&lt;/li>
&lt;li>On the EDA-Server create a &lt;code>Rulebook Activation&lt;/code>&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 5&lt;/summary>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat webserver_rulebook.yml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>---
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">rebuild webservers if site down&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">hosts&lt;/span>: &lt;span style="color:#ae81ff">web&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">sources&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">check webserver&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ansible.eda.url_check&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">urls&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">http://&amp;lt;yourname&amp;gt;-node1.workshop.puzzle.ch:80/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">http://&amp;lt;yourname&amp;gt;-node2.workshop.puzzle.ch:80/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">delay&lt;/span>: &lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">rules&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">check if site down and rebuild&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">condition&lt;/span>: &lt;span style="color:#ae81ff">event.url_check.status == &amp;#34;down&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">action&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run_job_template&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Provision_Webserver&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">organization&lt;/span>: &lt;span style="color:#ae81ff">Techlab&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>On the left side of the EDA-Server GUI, navigate to &lt;code>Views&lt;/code>, then &lt;code>Rulebook Activiations&lt;/code>&lt;/li>
&lt;li>On the right side click &lt;code>Create rulebook activation&lt;/code>&lt;/li>
&lt;li>Enter the name &lt;code>Webserver Provisioning&lt;/code>, add a description and chose the project &lt;code>Techlab Repo&lt;/code>.&lt;/li>
&lt;li>Chose &lt;code>webserver_rulebook.yml&lt;/code> in the &lt;code>Rulebook&lt;/code> field.&lt;/li>
&lt;li>(if no Rulebook shows up, sync the project)&lt;/li>
&lt;li>Chose &lt;code>techlab-de&lt;/code> in the &lt;code>Decision environment&lt;/code> field.&lt;/li>
&lt;li>Leave &lt;code>Restart policy&lt;/code> set to &lt;code>On failure&lt;/code>.&lt;/li>
&lt;li>Click &lt;code>Create rulebook activation&lt;/code> at the bottom of the page.&lt;/li>
&lt;/ul>
&lt;/details>
&lt;h3 id="task-6">Task 6&lt;/h3>
&lt;p>After a successful creation of the &lt;code>Rulebook Activation&lt;/code> you can follow its logs&lt;/p>
&lt;ul>
&lt;li>Navigate to &lt;code>Views&lt;/code>, then &lt;code>Rulebook Activations&lt;/code> on the left side
and then click on your &lt;code>Webserver Provisioning&lt;/code> Rulebook Activation.&lt;/li>
&lt;li>Click on the &lt;code>History&lt;/code> tab.&lt;/li>
&lt;li>Now click on the running instance ot the activation.&lt;/li>
&lt;li>In the &lt;code>Output&lt;/code> field have a look at the logs&lt;/li>
&lt;/ul>
&lt;details >
&lt;summary>Solution Task 6&lt;/summary>
&lt;p>Output filed of the activation:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:09,925 - ansible_rulebook.app - INFO - Starting worker mode
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:09,925 - ansible_rulebook.websocket - INFO - websocket ws://edaserver-app-daphne:8001/api/eda/ws/ansible-rulebook connecting
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:09,958 - ansible_rulebook.websocket - INFO - websocket ws://edaserver-app-daphne:8001/api/eda/ws/ansible-rulebook connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:09,996 - ansible_rulebook.job_template_runner - INFO - Attempting to connect to Controller https://puzzle-ascender.workshop.puzzle.ch
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,106 - ansible_rulebook.app - INFO - AAP Version 23.1.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,106 - ansible_rulebook.app - INFO - Starting sources
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,107 - ansible_rulebook.app - INFO - Starting rules
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,107 - ansible_rulebook.engine - INFO - run_ruleset
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,109 - drools.ruleset - INFO - Using jar: /usr/local/lib/python3.9/site-packages/drools/jars/drools-ansible-rulebook-integration-runtime-1.0.5-SNAPSHOT.jar
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10 &lt;span style="color:#ae81ff">669&lt;/span> &lt;span style="color:#f92672">[&lt;/span>main&lt;span style="color:#f92672">]&lt;/span> INFO org.drools.ansible.rulebook.integration.api.rulesengine.AbstractRulesEvaluator - Start automatic pseudo clock with a tick every &lt;span style="color:#ae81ff">100&lt;/span> milliseconds
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,673 - ansible_rulebook.engine - INFO - ruleset define: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;rebuild webservers if site down&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;hosts&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;web&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;sources&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;EventSource&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;check webserver&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;source_name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ansible.eda.url_check&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;source_args&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;urls&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[&lt;/span>&lt;span style="color:#e6db74">&amp;#34;http://puzzle-node1.workshop.puzzle.ch:80/&amp;#34;&lt;/span>&lt;span style="color:#f92672">]&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;delay&amp;#34;&lt;/span>: 8&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;source_filters&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[]}}]&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rules&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Rule&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;check if site down and rebuild&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;condition&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;AllCondition&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;EqualsExpression&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;lhs&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Event&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;url_check.status&amp;#34;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;rhs&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;String&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;down&amp;#34;&lt;/span>&lt;span style="color:#f92672">}}}]}&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;actions&amp;#34;&lt;/span>: &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Action&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;action&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;run_job_template&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;action_args&amp;#34;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Provision_Webserver&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;organization&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Puzzle&amp;#34;&lt;/span>&lt;span style="color:#f92672">}}}]&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;enabled&amp;#34;&lt;/span>: true&lt;span style="color:#f92672">}}]}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:10,690 - ansible_rulebook.engine - INFO - load source
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:11,166 - ansible_rulebook.engine - INFO - load source filters
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:11,167 - ansible_rulebook.engine - INFO - loading eda.builtin.insert_meta_info
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:11,586 - ansible_rulebook.engine - INFO - Calling main in ansible.eda.url_check
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:31:11,587 - ansible_rulebook.websocket - INFO - feedback websocket ws://edaserver-app-daphne:8001/api/eda/ws/ansible-rulebook connecting
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/details>
&lt;h3 id="task-7">Task 7&lt;/h3>
&lt;p>Now, we stop the webserver on node1 and see in the logs of the rulebook activation
how the rule triggers the action to start the job template on ascender and rebuild the webservers.&lt;/p>
&lt;details >
&lt;summary>Solution Task 7&lt;/summary>
&lt;p>On &lt;code>&amp;lt;yourname&amp;gt;-node1.workshop.puzzle.ch&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl stop httpd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>In the logs on EDA-Server (see the last task to navigate there):&lt;/p>
&lt;div class="highlight">&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;">&lt;tr>&lt;td style="vertical-align:top;padding:0;margin:0;border:0;">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
&lt;/span>&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>...
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:27 &lt;span style="color:#ae81ff">847&lt;/span> &lt;span style="color:#f92672">[&lt;/span>main&lt;span style="color:#f92672">]&lt;/span> INFO org.drools.ansible.rulebook.integration.api.rulesengine.RegisterOnlyAgendaFilter - Activation of effective rule &lt;span style="color:#e6db74">&amp;#34;check if site down and rebuild&amp;#34;&lt;/span> with facts: &lt;span style="color:#f92672">{&lt;/span>m&lt;span style="color:#f92672">={&lt;/span>url_check&lt;span style="color:#f92672">={&lt;/span>url&lt;span style="color:#f92672">=&lt;/span>http://puzzle-node1.workshop.puzzle.ch:80/, status&lt;span style="color:#f92672">=&lt;/span>down, error_msg&lt;span style="color:#f92672">=&lt;/span>Cannot connect to host puzzle-node1.workshop.puzzle.ch:80 ssl:default &lt;span style="color:#f92672">[&lt;/span>Connect call failed &lt;span style="color:#f92672">(&lt;/span>&lt;span style="color:#e6db74">&amp;#39;5.102.145.36&amp;#39;&lt;/span>, 80&lt;span style="color:#f92672">)]}&lt;/span>, meta&lt;span style="color:#f92672">={&lt;/span>source&lt;span style="color:#f92672">={&lt;/span>name&lt;span style="color:#f92672">=&lt;/span>check webserver, type&lt;span style="color:#f92672">=&lt;/span>ansible.eda.url_check&lt;span style="color:#f92672">}&lt;/span>, received_at&lt;span style="color:#f92672">=&lt;/span>2023-11-08T14:33:27.845005Z, uuid&lt;span style="color:#f92672">=&lt;/span>65c50f85-89af-4ab3-ac25-81a1f951c469&lt;span style="color:#f92672">}}}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:27,848 - ansible_rulebook.rule_generator - INFO - calling check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,545 - ansible_rulebook.rule_set_runner - INFO - Task action::run_job_template::rebuild webservers &lt;span style="color:#66d9ef">if&lt;/span> site down::check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild finished, active actions &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,550 - ansible_rulebook.rule_set_runner - INFO - call_action run_job_template
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,552 - ansible_rulebook.rule_set_runner - INFO - substitute_variables &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Provision_Webserver&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;organization&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Puzzle&amp;#39;&lt;/span>&lt;span style="color:#f92672">}]&lt;/span> &lt;span style="color:#f92672">[{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;event&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;url_check&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;http://puzzle-node1.workshop.puzzle.ch:80/&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;status&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;down&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;error_msg&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Cannot connect to host puzzle-node1.workshop.puzzle.ch:80 ssl:default [Connect call failed (&amp;#39;5.102.145.36&amp;#39;, 80)]&amp;#34;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;meta&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;source&amp;#39;&lt;/span>: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;check webserver&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;ansible.eda.url_check&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;received_at&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;2023-11-08T14:33:27.845005Z&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;uuid&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;65c50f85-89af-4ab3-ac25-81a1f951c469&amp;#39;&lt;/span>&lt;span style="color:#f92672">}}}]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,552 - ansible_rulebook.rule_set_runner - INFO - action args: &lt;span style="color:#f92672">{&lt;/span>&lt;span style="color:#e6db74">&amp;#39;name&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Provision_Webserver&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;organization&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Puzzle&amp;#39;&lt;/span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,552 - ansible_rulebook.action.run_job_template - INFO - running job template: Provision_Webserver, organization: Puzzle
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:33:40,552 - ansible_rulebook.action.run_job_template - INFO - ruleset: rebuild webservers &lt;span style="color:#66d9ef">if&lt;/span> site down, rule check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>2023-11-08 14:34:01,225 - ansible_rulebook.rule_set_runner - INFO - Task action::run_job_template::rebuild webservers &lt;span style="color:#66d9ef">if&lt;/span> site down::check &lt;span style="color:#66d9ef">if&lt;/span> site down and rebuild finished, active actions &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Check the webpage &lt;code>http://&amp;lt;yourname&amp;gt;-node1.workshop.puzzle.ch/&lt;/code> in your internet browser
and ensure the page is available again.&lt;/p>
&lt;/details></description></item></channel></rss>