<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>article Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts! in General Articles</title>
    <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/ta-p/1252412</link>
    <description>&lt;DIV class="lia-message-template-content-zone"&gt;
&lt;P&gt;This article is a continuation of my previous one, &lt;STRONG data-index-in-node="53" data-path-to-node="5,0"&gt;'&lt;A href="https://live.paloaltonetworks.com/t5/general-articles/automating-the-palo-alto-ngfw-s-process-deamon-restarts/ta-p/529328#M602" target="_blank" rel="noopener"&gt;Automating the Palo Alto NGFW's Process/Deamon Restarts&lt;/A&gt;'.&lt;/STRONG&gt;&amp;nbsp; While using &lt;STRONG data-index-in-node="124" data-path-to-node="5,0"&gt;TCL Expect&lt;/STRONG&gt; is one of the classic methods for automating legacy devices, modern infrastructure demands more robust solutions like &lt;STRONG data-index-in-node="253" data-path-to-node="5,0"&gt;Ansible AWX&lt;/STRONG&gt; for better scalability and management.&lt;/P&gt;
&lt;DIV class="QzGOQd" data-processed="true" data-sfc-cb="" data-sfc-root="c"&gt;
&lt;DIV class="PwvzCf WEeWWe" data-processed="true" data-subtree="aimfl,mfl" data-sfc-cb="" data-wiz-uids="KN4Qmb_h,KN4Qmb_i" data-sfc-root="c"&gt;
&lt;DIV id="ic-Op0-ErcbbnDc5M" class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;&amp;nbsp;1. Overview&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;2.&amp;nbsp; AWX ansible installation&amp;nbsp;&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;3. GUI access to AWX&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;4. Creating the AWX playbook in a repo and pulling to AWX&amp;nbsp;&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;5. Create and trigger Ansible AWX automation&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;6. Ansible AWX API and Terraform Integration&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;EM&gt;&lt;U&gt;7. Palo Alto API module example (bonus!)&lt;/U&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;Summary&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;STRONG&gt;&amp;nbsp;1. Overview&lt;/STRONG&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG data-index-in-node="1" data-path-to-node="5,0"&gt;Ansible&lt;/STRONG&gt; is &lt;MARK class="HxTRcb" data-sfc-root="c" data-sfc-cb="" data-processed="true"&gt;an open-source, agentless IT automation engine used for configuration management, application deployment, and task orchestration&lt;/MARK&gt;. It uses human-readable &lt;STRONG data-index-in-node="165" data-path-to-node="5,0"&gt;YAML playbooks&lt;/STRONG&gt; to define infrastructure states, making complex workflows simple and repeatable. &lt;STRONG data-index-in-node="261" data-path-to-node="5,0"&gt;AWX&lt;/STRONG&gt; is the open-source upstream project for &lt;STRONG data-index-in-node="305" data-path-to-node="5,0"&gt;Red Hat Ansible Automation Platform (AAP)&lt;/STRONG&gt;—formerly known as Ansible Tower. It provides the &lt;STRONG data-index-in-node="396" data-path-to-node="5,0"&gt;Automation Controller&lt;/STRONG&gt; (the GUI and API) that standard CLI-based Ansible lacks, enabling easier collaboration and scaling.&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_3-1776425825137.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71237i76FCA4C44C459CB6/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_3-1776425825137.png" alt="nikoolayy1_3-1776425825137.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;While the official &lt;A href="https://paloaltonetworks.github.io/pan-os-ansible/" target="_self"&gt;&lt;STRONG data-index-in-node="20" data-path-to-node="5,0"&gt;Palo Alto Networks Ansible Collection&lt;/STRONG&gt;&lt;/A&gt; is excellent for configuration management, it is primarily &lt;STRONG data-index-in-node="117" data-path-to-node="5,0"&gt;XML API-based&lt;/STRONG&gt;. As I discussed in my previous article, restarting specific system daemons is a low-level operation that requires direct CLI access. Since the API can't perform these restarts, we pivot to Ansible's native &lt;STRONG data-index-in-node="337" data-path-to-node="5,0"&gt;&lt;CODE data-index-in-node="337" data-path-to-node="5,0"&gt;expect&lt;/CODE&gt;&lt;/STRONG&gt; functionality. This allows us to automate interactive SSH sessions and issue the exact CLI commands needed to kick-start a hanging process.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&amp;nbsp;2.&amp;nbsp; AWX ansible installation&amp;nbsp;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;To get started, you'll need to install AWX. Since AWX is comprised of several containers, &lt;STRONG data-index-in-node="91" data-path-to-node="5,0"&gt;Kubernetes (K8s)&lt;/STRONG&gt; is the preferred choice for production. For a home lab, I recommend two paths: &lt;STRONG data-index-in-node="187" data-path-to-node="5,0"&gt;Docker Compose&lt;/STRONG&gt;&amp;nbsp;(&lt;A href="https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md" target="_blank" rel="noopener"&gt;https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md&lt;/A&gt;) or &lt;STRONG data-index-in-node="205" data-path-to-node="5,0"&gt;AWX on a Kind cluster&lt;/STRONG&gt; (Kubernetes in Docker)(&lt;A href="https://docs.ansible.com/projects/awx-operator/en/latest/installation/kind-install.html" target="_blank" rel="noopener"&gt;https://docs.ansible.com/projects/awx-operator/en/latest/installation/kind-install.html&lt;/A&gt;) .&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;I chose the Kind cluster approach as it’s the standard for testing the &lt;STRONG data-index-in-node="322" data-path-to-node="5,0"&gt;AWX Operator&lt;/STRONG&gt; and provided a great opportunity to get hands-on with K8s.&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;I recommend using a &lt;STRONG data-index-in-node="20" data-path-to-node="5,1"&gt;40GB Ubuntu VM&lt;/STRONG&gt;. A common pitfall is finding that only 20GB is actually allocated to the filesystem. If your automation job pods fail with a 'DiskFull' error (check this with &lt;CODE data-index-in-node="194" data-path-to-node="5,1"&gt;kubectl describe pods [pod-name] -n awx&lt;/CODE&gt;), you’ll likely need to resize your Logical Volume.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Here is the quick workflow to expand your space:&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="1" data-path-to-node="5,3"&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,0,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,0,0"&gt;Resize the Physical Volume:&lt;/STRONG&gt; &lt;CODE data-index-in-node="28" data-path-to-node="5,3,0,0"&gt;pvresize /dev/sda3&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,1,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,1,0"&gt;Extend the Logical Volume:&lt;/STRONG&gt; &lt;CODE data-index-in-node="27" data-path-to-node="5,3,1,0"&gt;lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,2,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,2,0"&gt;Resize the Filesystem:&lt;/STRONG&gt; &lt;CODE data-index-in-node="23" data-path-to-node="5,3,2,0"&gt;resize2fs /dev/ubuntu-vg/ubuntu-lv&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;kubectl get pods -A
NAMESPACE            NAME                                              READY   STATUS              RESTARTS   AGE
awx                  automation-job-20-dndqn                           0/1     ContainerCreating   0          2s
awx                  awx-demo-migration-24.6.1-8f5fh                   0/1     Completed           0          140m
awx                  awx-demo-postgres-15-0                            1/1     Running             0          142m
awx                  awx-demo-task-7f7665864-qbwtf                     4/4     Running             0          141m
awx                  awx-demo-web-75b9757c57-mhlsd                     3/3     Running             0          141m
awx                  awx-operator-controller-manager-7ddd859f8-s88nb   2/2     Running             0          146m
ingress-nginx        ingress-nginx-controller-f5784567-cfvm6           1/1     Running             0          146m
kube-system          coredns-66bc5c9577-6r4tp                          1/1     Running             0          146m
kube-system          coredns-66bc5c9577-x42qr                          1/1     Running             0          146m
kube-system          etcd-kind-control-plane                           1/1     Running             0          146m
kube-system          kindnet-5kzlp                                     1/1     Running             0          146m
kube-system          kindnet-75l77                                     1/1     Running             0          146m
kube-system          kube-apiserver-kind-control-plane                 1/1     Running             0          146m
kube-system          kube-controller-manager-kind-control-plane        1/1     Running             0          146m
kube-system          kube-proxy-4fsxz                                  1/1     Running             0          146m
kube-system          kube-proxy-s7xw2                                  1/1     Running             0          146m
kube-system          kube-scheduler-kind-control-plane                 1/1     Running             0          146m
local-path-storage   local-path-provisioner-7b8c8ddbd6-wjjxg           1/1     Running             0          146m
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Because the official AWX documentation for &lt;STRONG data-index-in-node="44" data-path-to-node="5,0"&gt;Kind&lt;/STRONG&gt; deployments isn't updated frequently, I had to create a custom &lt;CODE data-index-in-node="112" data-path-to-node="5,0"&gt;kustomization.yaml&lt;/CODE&gt;. Currently, the official docs reference a repository for the &lt;STRONG data-index-in-node="192" data-path-to-node="5,0"&gt;kube-rbac-proxy&lt;/STRONG&gt; where the manifest is no longer available. Below is the custom configuration I used to bypass this broken dependency and ensure a successful deployment.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=2.19.1

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 2.19.1

  - name: gcr.io/kubebuilder/kube-rbac-proxy
    newName: registry.k8s.io/kubebuilder/kube-rbac-proxy
    newTag: v0.15.0

# Specify a custom namespace in which to install AWX
namespace: awx
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;&amp;nbsp;3. GUI access to AWX&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Once the deployment is up, you can retrieve the auto-generated admin password with the following command:&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&lt;CODE data-index-in-node="0" data-path-to-node="5,1"&gt;kubectl get secret awx-demo-admin-password -n awx -o jsonpath="{.data.password}" | base64 -d&lt;/CODE&gt;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;You can then access the GUI via your VM’s IP address on &lt;STRONG data-index-in-node="56" data-path-to-node="5,2"&gt;port 32000&lt;/STRONG&gt; (NodePort). Interestingly, I encountered an issue where the auto-generated secret stopped working over time. If you find yourself locked out, you can manually reset the admin password by exec-ing into the web container:&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,3"&gt;&lt;CODE data-index-in-node="0" data-path-to-node="5,3"&gt;kubectl exec -it deployment/awx-demo-web -n awx -- awx-manage changepassword admin&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776430115994.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71248i39C3546C43B2BBBC/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776430115994.png" alt="nikoolayy1_0-1776430115994.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;4. Creating the AWX playbook in a repo and pulling to AWX&amp;nbsp;&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Once your AWX instance is running, you need to sync your playbooks. The most efficient way is to create an &lt;STRONG data-index-in-node="108" data-path-to-node="5,0"&gt;AWX Project&lt;/STRONG&gt; linked to a Git repository.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;While AWX &lt;I data-index-in-node="10" data-path-to-node="5,1"&gt;can&lt;/I&gt; host playbooks locally (using the 'Manual' SCM type), it is difficult to configure with a &lt;STRONG data-index-in-node="104" data-path-to-node="5,1"&gt;Kind&lt;/STRONG&gt; deployment. Unlike Docker Compose or production Kubernetes, where you can easily mount host volumes directly into containers, Kind’s architecture (running Kubernetes &lt;I data-index-in-node="275" data-path-to-node="5,1"&gt;inside&lt;/I&gt; a Docker container) makes local volume mounting much more cumbersome. For this reason, I recommend pushing your playbooks to a Git repository (like GitHub or GitLab) for seamless synchronization.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776427311767.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71239iD0897C87AEDD7477/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776427311767.png" alt="nikoolayy1_0-1776427311767.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776427340257.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71240iBAC9D9DEA1E5B63C/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776427340257.png" alt="nikoolayy1_1-1776427340257.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;- name: Palo Alto SSH with expect
  hosts: all
  gather_facts: false
  tasks:
    - name: Restart Service
      ansible.builtin.expect:
        command: &amp;gt;-
          ssh -tt
          -o StrictHostKeyChecking=no
          -o UserKnownHostsFile=/dev/null
          -o PubkeyAuthentication=no
          -o PreferredAuthentications=keyboard-interactive,password
          -o IdentitiesOnly=yes
          -p 22
          admin@{{ ansible_host | default(inventory_hostname) }}
        responses:
          'Are you sure you want to continue connecting \(yes/no/\[fingerprint\]\)\?': "yes"
          '(?i)(\|\s*)?password:': "{{ cli_pass }}"
          'admin@.*[&amp;gt;#]\s*$': "set cli scripting-mode on\nset cli pager off\ndebug software restart process web-server\nexit\n"
          'press RETURN': "\n"
        timeout: 90
        echo: true
      register: out
      changed_when: false
    - name: Print output
      ansible.builtin.debug:
        msg: "{{ out.stdout }}"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,0"&gt;You can find the full code and example playbooks in my GitHub repository:&lt;/P&gt;
&lt;P data-path-to-node="3,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,1"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="3,1"&gt;&lt;A href="https://github.com/Nikoolayy1/awx-example-playbooks/blob/main/awx-palo-alto-restart-service.yml" target="_blank" rel="noopener"&gt;awx-example-playbooks/awx-palo-alto-restart-service.yml at main · Nikoolayy1/awx-example-playbooks&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-path-to-node="3,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,2"&gt;&lt;SPAN class="citation-13"&gt;This specific playbook uses the &lt;/SPAN&gt;&lt;STRONG data-index-in-node="32" data-path-to-node="3,2"&gt;&lt;CODE data-index-in-node="32" data-path-to-node="3,2"&gt;&lt;SPAN class="citation-13"&gt;ansible.builtin.expect&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/STRONG&gt;&lt;SPAN class="citation-13 citation-end-13"&gt; module to handle the interactive CLI prompts required for service restarts—a task that standard API-based modules cannot perform.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;U&gt;&lt;STRONG&gt;5. Create and trigger Ansible AWX automation&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Next, create an &lt;STRONG data-index-in-node="17" data-path-to-node="5,0"&gt;Inventory&lt;/STRONG&gt; in AWX using the variables provided below. While you can attach these variables directly to the host, I recommend creating a &lt;STRONG data-index-in-node="152" data-path-to-node="5,0"&gt;Group&lt;/STRONG&gt; and placing the variables there—this makes it much easier to scale if you have multiple firewalls.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;For the 'Host' field, you can use the firewall's IP address or its &lt;STRONG data-index-in-node="67" data-path-to-node="5,1"&gt;FQDN&lt;/STRONG&gt;. If your Kind cluster or Docker host is configured with the correct DNS server, using the FQDN is the preferred method for long-term management.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Once the Inventory is set, create your &lt;STRONG data-index-in-node="39" data-path-to-node="5,2"&gt;Job Template&lt;/STRONG&gt;, link it to your project and inventory, and run it to see the magic happen!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_3-1776427650468.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71242i4EC38674CAC6F8F5/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_3-1776427650468.png" alt="nikoolayy1_3-1776427650468.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;---
ansible_connection: local
cli_user: admin
cli_pass: xxxx
cli_port: 22
ssh_opts: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PubkeyAuthentication=no -o PreferredAuthentications=keyboard-interactive,password -o IdentitiesOnly=yes"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776427856727.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71243i3234553EA4B52BE1/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776427856727.png" alt="nikoolayy1_0-1776427856727.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776427894618.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71244i0A38FAC97DD5C54B/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776427894618.png" alt="nikoolayy1_1-1776427894618.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776427406108.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71241i551010E2377E2054/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776427406108.png" alt="nikoolayy1_2-1776427406108.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;&amp;nbsp;6. Ansible AWX API and Terraform Integration.&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Ansible AWX also provides a robust &lt;STRONG data-index-in-node="36" data-path-to-node="5,0"&gt;REST API&lt;/STRONG&gt;, which allows it to integrate seamlessly with other tools like &lt;STRONG data-index-in-node="108" data-path-to-node="5,0"&gt;Terraform&lt;/STRONG&gt;. In a modern 'Best of Breed' stack, Terraform handles the &lt;STRONG data-index-in-node="176" data-path-to-node="5,0"&gt;Infrastructure as Code (IaC)&lt;/STRONG&gt;—provisioning the public or private cloud resources—while Ansible takes over for granular &lt;STRONG data-index-in-node="294" data-path-to-node="5,0"&gt;Configuration Management&lt;/STRONG&gt;.&amp;nbsp; Because Terraform is declarative and relies on a &lt;STRONG data-index-in-node="49" data-path-to-node="5,1"&gt;state file&lt;/STRONG&gt;, it is designed to maintain a persistent environment. This makes it difficult to use for 'procedural' operational tasks, such as restarting a specific service, as these actions don't represent a change in the infrastructure's permanent state.&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Historically, triggering Ansible from Terraform required using &lt;STRONG data-index-in-node="63" data-path-to-node="5,2"&gt;local or remote provisioners&lt;/STRONG&gt; on the same machine. However, this 'old way' is difficult to scale and maintain due to the complex SSH requirements and tight coupling. By using the &lt;STRONG data-index-in-node="241" data-path-to-node="5,2"&gt;AWX API&lt;/STRONG&gt;, you can decouple these tools: Terraform provisions the firewall, and then issues a simple API call to AWX to trigger the necessary configuration or restart playbooks.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&lt;A href="https://developer.hashicorp.com/packer/integrations/hashicorp/ansible/latest/components/provisioner/ansible" target="_blank" rel="noopener"&gt;Ansible Provisioner | Integrations | Packer | HashiCorp Developer&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776425217015.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71234i1E2626CB2662B303/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776425217015.png" alt="nikoolayy1_1-1776425217015.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776425239275.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71235iEF64B928353668D2/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776425239275.png" alt="nikoolayy1_2-1776425239275.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776429105471.png" style="width: 400px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71246i56B4174D3F18A271/image-size/medium?v=v2&amp;amp;px=400" role="button" title="nikoolayy1_0-1776429105471.png" alt="nikoolayy1_0-1776429105471.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;resource "null_resource" "awx_launch" {
  provisioner "local-exec" {
    command = &amp;lt;&amp;lt;EOT
curl -ks -u '${var.user}:${var.pass}' \
  -H 'Content-Type: application/json' \
  -X POST \
  https://awx.local/api/v2/job_templates/${var.job_template_id}/launch/ \
  -d '{"limit":"palo"}'
EOT
  }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;U&gt;7. Palo Alto API module example (bonus!)&lt;/U&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;A common issue with the default &lt;STRONG data-index-in-node="32" data-path-to-node="5,1"&gt;Execution Environment (EE)&lt;/STRONG&gt; in AWX is that the standard job container often lacks the specific Python packages (like &lt;CODE data-index-in-node="148" data-path-to-node="5,1"&gt;pan-os-python&lt;/CODE&gt;) required for Palo Alto’s native API modules. To solve this,&amp;nbsp;you can make your own container or use mine, which I've hosted here:&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&lt;CODE data-index-in-node="70" data-path-to-node="6,0"&gt;ghcr.io/nikoolayy1/custom-awx-ee:latest&lt;/CODE&gt;.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;Just add this as an &lt;STRONG data-index-in-node="131" data-path-to-node="6,0"&gt;Execution Environment&lt;/STRONG&gt; in AWX the settings and select it in your &lt;STRONG data-index-in-node="89" data-path-to-node="5,3"&gt;Job Template&amp;nbsp;&lt;/STRONG&gt;and you're ready to go!&lt;/P&gt;
&lt;P data-path-to-node="5,3"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,4"&gt;I also enabled an &lt;STRONG data-index-in-node="18" data-path-to-node="5,4"&gt;AWX Survey&lt;/STRONG&gt; in the template. This provides a user-friendly prompt where you can enter &lt;I data-index-in-node="103" data-path-to-node="5,4"&gt;any&lt;/I&gt; operational command to be executed, making the template versatile for more than just service restarts.&lt;/P&gt;
&lt;P data-path-to-node="5,4"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,5"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,5"&gt;Important Note on Variables:&lt;/STRONG&gt; Don't forget that the connection variables for API-based modules differ from the SSH ones. Ensure your &lt;STRONG data-index-in-node="132" data-path-to-node="5,5"&gt;Inventory&lt;/STRONG&gt; or &lt;STRONG data-index-in-node="145" data-path-to-node="5,5"&gt;Group variables&lt;/STRONG&gt; include the correct API credentials.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776444353495.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71259i974A9F71603DCB93/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776444353495.png" alt="nikoolayy1_0-1776444353495.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;FROM quay.io/ansible/awx-ee:24.6.1

USER root

RUN python3 -m pip install --no-cache-dir \
    pan-python \
    pandevice \
    xmltodict

RUN ansible-galaxy collection install paloaltonetworks.panos

USER 1000
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776443811117.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71258i0CC0C460F6E00D3F/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776443811117.png" alt="nikoolayy1_1-1776443811117.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;- name: Palo Alto dynamic command
  hosts: all
  connection: local
  gather_facts: false
  vars:
    device:
      ip_address: "{{ ansible_host }}"
      username: "{{ palo_user }}"
      password: "{{ palo_pass }}"
  tasks:
    - name: Run dynamic command
      paloaltonetworks.panos.panos_op:
        provider: "{{ device }}"
        cmd: "{{ pa_cmd }}"
      register: result
    - debug:
        msg: "{{ result.stdout }}"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;U&gt;If you plan to use Ansible AWX also with the general palo alto api modules then you will need to pull the collections as well as mentioned in&amp;nbsp;&lt;A href="https://github.com/ansible/awx/blob/devel/docs/collections.md" target="_blank" rel="noopener"&gt;awx/docs/collections.md at devel · ansible/awx&lt;/A&gt;&amp;nbsp;&lt;/U&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="tinyMceEditornikoolayy1_0" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776429115682.png" style="width: 400px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71247i8411677119ED6406/image-size/medium?v=v2&amp;amp;px=400" role="button" title="nikoolayy1_1-1776429115682.png" alt="nikoolayy1_1-1776429115682.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Again links to my playbooks repo:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/Nikoolayy1/awx-example-playbooks/blob/main/README.md" target="_blank" rel="noopener"&gt;awx-example-playbooks/README.md at main · Nikoolayy1/awx-example-playbooks&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;Summary:&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;The benefits of this setup extend into high-level security operations. &lt;STRONG data-index-in-node="71" data-path-to-node="5,1"&gt;Cortex XSOAR&lt;/STRONG&gt; natively supports the &lt;STRONG data-index-in-node="106" data-path-to-node="5,1"&gt;Ansible Automation Platform (AAP) API&lt;/STRONG&gt;, meaning the playbooks we’ve discussed for process and daemon restarts can be triggered automatically by XSOAR as part of an incident response or self-healing workflow. You can find more on that integration here: &lt;A class="ng-star-inserted" href="https://xsoar.pan.dev/docs/reference/integrations/ansible-tower" target="_self"&gt;Ansible Automation Platform | Cortex XSOAR&lt;/A&gt;.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;I hope you enjoyed reading this article as much as I enjoyed building the lab! Stay tuned—my next playground will likely involve &lt;STRONG data-index-in-node="129" data-path-to-node="5,2"&gt;GitHub Actions CI/CD&lt;/STRONG&gt;, with a potential article on that coming soon&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776428874050.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71245i3BF799B73B138A47/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776428874050.png" alt="nikoolayy1_2-1776428874050.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;</description>
    <pubDate>Fri, 08 May 2026 23:56:39 GMT</pubDate>
    <dc:creator>nikoolayy1</dc:creator>
    <dc:date>2026-05-08T23:56:39Z</dc:date>
    <item>
      <title>Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/ta-p/1252412</link>
      <description>&lt;DIV class="lia-message-template-content-zone"&gt;
&lt;P&gt;This article is a continuation of my previous one, &lt;STRONG data-index-in-node="53" data-path-to-node="5,0"&gt;'&lt;A href="https://live.paloaltonetworks.com/t5/general-articles/automating-the-palo-alto-ngfw-s-process-deamon-restarts/ta-p/529328#M602" target="_blank" rel="noopener"&gt;Automating the Palo Alto NGFW's Process/Deamon Restarts&lt;/A&gt;'.&lt;/STRONG&gt;&amp;nbsp; While using &lt;STRONG data-index-in-node="124" data-path-to-node="5,0"&gt;TCL Expect&lt;/STRONG&gt; is one of the classic methods for automating legacy devices, modern infrastructure demands more robust solutions like &lt;STRONG data-index-in-node="253" data-path-to-node="5,0"&gt;Ansible AWX&lt;/STRONG&gt; for better scalability and management.&lt;/P&gt;
&lt;DIV class="QzGOQd" data-processed="true" data-sfc-cb="" data-sfc-root="c"&gt;
&lt;DIV class="PwvzCf WEeWWe" data-processed="true" data-subtree="aimfl,mfl" data-sfc-cb="" data-wiz-uids="KN4Qmb_h,KN4Qmb_i" data-sfc-root="c"&gt;
&lt;DIV id="ic-Op0-ErcbbnDc5M" class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;&amp;nbsp;1. Overview&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;2.&amp;nbsp; AWX ansible installation&amp;nbsp;&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;3. GUI access to AWX&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;4. Creating the AWX playbook in a repo and pulling to AWX&amp;nbsp;&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;5. Create and trigger Ansible AWX automation&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;6. Ansible AWX API and Terraform Integration&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;EM&gt;&lt;U&gt;7. Palo Alto API module example (bonus!)&lt;/U&gt;&lt;/EM&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;EM&gt;Summary&lt;/EM&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&lt;U&gt;&lt;STRONG&gt;&amp;nbsp;1. Overview&lt;/STRONG&gt;&lt;/U&gt;&lt;/DIV&gt;
&lt;DIV class="QwWKjd" tabindex="0" role="button" data-im="[0,&amp;quot;Op0-ErcbbnDc5M&amp;quot;,[&amp;quot;https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR39ZIzQg-V7c_08w3jfk1rSjovRdtG221kf2mIBwe-wRm70kAR&amp;quot;,170,297],[&amp;quot;https://www.devopsschool.com/blog/wp-content/uploads/2023/08/image-367-1024x586.png&amp;quot;,586,1024],{&amp;quot;2003&amp;quot;:[null,&amp;quot;RZn7iuJEeIcl0M&amp;quot;,&amp;quot;https://www.devopsschool.com/blog/what-is-ansible-and-how-its-works/&amp;quot;,&amp;quot;What is Ansible and How its works? -&amp;quot;,null,null,null,null,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;,null,null,null,null,&amp;quot;www.devopsschool.com&amp;quot;]}]" data-sv-cpt="4" data-ep-type="src" data-ssid="svim" data-sve="" data-processed="true" data-ved="2ahUKEwjo7f2K3_STAxVthv0HHX8NOdgQn7IPegQIARAB" data-visible="1"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;STRONG data-index-in-node="1" data-path-to-node="5,0"&gt;Ansible&lt;/STRONG&gt; is &lt;MARK class="HxTRcb" data-sfc-root="c" data-sfc-cb="" data-processed="true"&gt;an open-source, agentless IT automation engine used for configuration management, application deployment, and task orchestration&lt;/MARK&gt;. It uses human-readable &lt;STRONG data-index-in-node="165" data-path-to-node="5,0"&gt;YAML playbooks&lt;/STRONG&gt; to define infrastructure states, making complex workflows simple and repeatable. &lt;STRONG data-index-in-node="261" data-path-to-node="5,0"&gt;AWX&lt;/STRONG&gt; is the open-source upstream project for &lt;STRONG data-index-in-node="305" data-path-to-node="5,0"&gt;Red Hat Ansible Automation Platform (AAP)&lt;/STRONG&gt;—formerly known as Ansible Tower. It provides the &lt;STRONG data-index-in-node="396" data-path-to-node="5,0"&gt;Automation Controller&lt;/STRONG&gt; (the GUI and API) that standard CLI-based Ansible lacks, enabling easier collaboration and scaling.&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_3-1776425825137.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71237i76FCA4C44C459CB6/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_3-1776425825137.png" alt="nikoolayy1_3-1776425825137.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;While the official &lt;A href="https://paloaltonetworks.github.io/pan-os-ansible/" target="_self"&gt;&lt;STRONG data-index-in-node="20" data-path-to-node="5,0"&gt;Palo Alto Networks Ansible Collection&lt;/STRONG&gt;&lt;/A&gt; is excellent for configuration management, it is primarily &lt;STRONG data-index-in-node="117" data-path-to-node="5,0"&gt;XML API-based&lt;/STRONG&gt;. As I discussed in my previous article, restarting specific system daemons is a low-level operation that requires direct CLI access. Since the API can't perform these restarts, we pivot to Ansible's native &lt;STRONG data-index-in-node="337" data-path-to-node="5,0"&gt;&lt;CODE data-index-in-node="337" data-path-to-node="5,0"&gt;expect&lt;/CODE&gt;&lt;/STRONG&gt; functionality. This allows us to automate interactive SSH sessions and issue the exact CLI commands needed to kick-start a hanging process.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&amp;nbsp;2.&amp;nbsp; AWX ansible installation&amp;nbsp;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;To get started, you'll need to install AWX. Since AWX is comprised of several containers, &lt;STRONG data-index-in-node="91" data-path-to-node="5,0"&gt;Kubernetes (K8s)&lt;/STRONG&gt; is the preferred choice for production. For a home lab, I recommend two paths: &lt;STRONG data-index-in-node="187" data-path-to-node="5,0"&gt;Docker Compose&lt;/STRONG&gt;&amp;nbsp;(&lt;A href="https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md" target="_blank" rel="noopener"&gt;https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md&lt;/A&gt;) or &lt;STRONG data-index-in-node="205" data-path-to-node="5,0"&gt;AWX on a Kind cluster&lt;/STRONG&gt; (Kubernetes in Docker)(&lt;A href="https://docs.ansible.com/projects/awx-operator/en/latest/installation/kind-install.html" target="_blank" rel="noopener"&gt;https://docs.ansible.com/projects/awx-operator/en/latest/installation/kind-install.html&lt;/A&gt;) .&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;I chose the Kind cluster approach as it’s the standard for testing the &lt;STRONG data-index-in-node="322" data-path-to-node="5,0"&gt;AWX Operator&lt;/STRONG&gt; and provided a great opportunity to get hands-on with K8s.&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;I recommend using a &lt;STRONG data-index-in-node="20" data-path-to-node="5,1"&gt;40GB Ubuntu VM&lt;/STRONG&gt;. A common pitfall is finding that only 20GB is actually allocated to the filesystem. If your automation job pods fail with a 'DiskFull' error (check this with &lt;CODE data-index-in-node="194" data-path-to-node="5,1"&gt;kubectl describe pods [pod-name] -n awx&lt;/CODE&gt;), you’ll likely need to resize your Logical Volume.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Here is the quick workflow to expand your space:&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="1" data-path-to-node="5,3"&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,0,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,0,0"&gt;Resize the Physical Volume:&lt;/STRONG&gt; &lt;CODE data-index-in-node="28" data-path-to-node="5,3,0,0"&gt;pvresize /dev/sda3&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,1,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,1,0"&gt;Extend the Logical Volume:&lt;/STRONG&gt; &lt;CODE data-index-in-node="27" data-path-to-node="5,3,1,0"&gt;lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P data-path-to-node="5,3,2,0"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,3,2,0"&gt;Resize the Filesystem:&lt;/STRONG&gt; &lt;CODE data-index-in-node="23" data-path-to-node="5,3,2,0"&gt;resize2fs /dev/ubuntu-vg/ubuntu-lv&lt;/CODE&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;kubectl get pods -A
NAMESPACE            NAME                                              READY   STATUS              RESTARTS   AGE
awx                  automation-job-20-dndqn                           0/1     ContainerCreating   0          2s
awx                  awx-demo-migration-24.6.1-8f5fh                   0/1     Completed           0          140m
awx                  awx-demo-postgres-15-0                            1/1     Running             0          142m
awx                  awx-demo-task-7f7665864-qbwtf                     4/4     Running             0          141m
awx                  awx-demo-web-75b9757c57-mhlsd                     3/3     Running             0          141m
awx                  awx-operator-controller-manager-7ddd859f8-s88nb   2/2     Running             0          146m
ingress-nginx        ingress-nginx-controller-f5784567-cfvm6           1/1     Running             0          146m
kube-system          coredns-66bc5c9577-6r4tp                          1/1     Running             0          146m
kube-system          coredns-66bc5c9577-x42qr                          1/1     Running             0          146m
kube-system          etcd-kind-control-plane                           1/1     Running             0          146m
kube-system          kindnet-5kzlp                                     1/1     Running             0          146m
kube-system          kindnet-75l77                                     1/1     Running             0          146m
kube-system          kube-apiserver-kind-control-plane                 1/1     Running             0          146m
kube-system          kube-controller-manager-kind-control-plane        1/1     Running             0          146m
kube-system          kube-proxy-4fsxz                                  1/1     Running             0          146m
kube-system          kube-proxy-s7xw2                                  1/1     Running             0          146m
kube-system          kube-scheduler-kind-control-plane                 1/1     Running             0          146m
local-path-storage   local-path-provisioner-7b8c8ddbd6-wjjxg           1/1     Running             0          146m
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Because the official AWX documentation for &lt;STRONG data-index-in-node="44" data-path-to-node="5,0"&gt;Kind&lt;/STRONG&gt; deployments isn't updated frequently, I had to create a custom &lt;CODE data-index-in-node="112" data-path-to-node="5,0"&gt;kustomization.yaml&lt;/CODE&gt;. Currently, the official docs reference a repository for the &lt;STRONG data-index-in-node="192" data-path-to-node="5,0"&gt;kube-rbac-proxy&lt;/STRONG&gt; where the manifest is no longer available. Below is the custom configuration I used to bypass this broken dependency and ensure a successful deployment.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # Find the latest tag here: https://github.com/ansible/awx-operator/releases
  - github.com/ansible/awx-operator/config/default?ref=2.19.1

# Set the image tags to match the git version from above
images:
  - name: quay.io/ansible/awx-operator
    newTag: 2.19.1

  - name: gcr.io/kubebuilder/kube-rbac-proxy
    newName: registry.k8s.io/kubebuilder/kube-rbac-proxy
    newTag: v0.15.0

# Specify a custom namespace in which to install AWX
namespace: awx
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;&amp;nbsp;3. GUI access to AWX&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Once the deployment is up, you can retrieve the auto-generated admin password with the following command:&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&lt;CODE data-index-in-node="0" data-path-to-node="5,1"&gt;kubectl get secret awx-demo-admin-password -n awx -o jsonpath="{.data.password}" | base64 -d&lt;/CODE&gt;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;You can then access the GUI via your VM’s IP address on &lt;STRONG data-index-in-node="56" data-path-to-node="5,2"&gt;port 32000&lt;/STRONG&gt; (NodePort). Interestingly, I encountered an issue where the auto-generated secret stopped working over time. If you find yourself locked out, you can manually reset the admin password by exec-ing into the web container:&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,3"&gt;&lt;CODE data-index-in-node="0" data-path-to-node="5,3"&gt;kubectl exec -it deployment/awx-demo-web -n awx -- awx-manage changepassword admin&lt;/CODE&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776430115994.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71248i39C3546C43B2BBBC/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776430115994.png" alt="nikoolayy1_0-1776430115994.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;4. Creating the AWX playbook in a repo and pulling to AWX&amp;nbsp;&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Once your AWX instance is running, you need to sync your playbooks. The most efficient way is to create an &lt;STRONG data-index-in-node="108" data-path-to-node="5,0"&gt;AWX Project&lt;/STRONG&gt; linked to a Git repository.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;While AWX &lt;I data-index-in-node="10" data-path-to-node="5,1"&gt;can&lt;/I&gt; host playbooks locally (using the 'Manual' SCM type), it is difficult to configure with a &lt;STRONG data-index-in-node="104" data-path-to-node="5,1"&gt;Kind&lt;/STRONG&gt; deployment. Unlike Docker Compose or production Kubernetes, where you can easily mount host volumes directly into containers, Kind’s architecture (running Kubernetes &lt;I data-index-in-node="275" data-path-to-node="5,1"&gt;inside&lt;/I&gt; a Docker container) makes local volume mounting much more cumbersome. For this reason, I recommend pushing your playbooks to a Git repository (like GitHub or GitLab) for seamless synchronization.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776427311767.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71239iD0897C87AEDD7477/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776427311767.png" alt="nikoolayy1_0-1776427311767.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776427340257.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71240iBAC9D9DEA1E5B63C/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776427340257.png" alt="nikoolayy1_1-1776427340257.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;- name: Palo Alto SSH with expect
  hosts: all
  gather_facts: false
  tasks:
    - name: Restart Service
      ansible.builtin.expect:
        command: &amp;gt;-
          ssh -tt
          -o StrictHostKeyChecking=no
          -o UserKnownHostsFile=/dev/null
          -o PubkeyAuthentication=no
          -o PreferredAuthentications=keyboard-interactive,password
          -o IdentitiesOnly=yes
          -p 22
          admin@{{ ansible_host | default(inventory_hostname) }}
        responses:
          'Are you sure you want to continue connecting \(yes/no/\[fingerprint\]\)\?': "yes"
          '(?i)(\|\s*)?password:': "{{ cli_pass }}"
          'admin@.*[&amp;gt;#]\s*$': "set cli scripting-mode on\nset cli pager off\ndebug software restart process web-server\nexit\n"
          'press RETURN': "\n"
        timeout: 90
        echo: true
      register: out
      changed_when: false
    - name: Print output
      ansible.builtin.debug:
        msg: "{{ out.stdout }}"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,0"&gt;You can find the full code and example playbooks in my GitHub repository:&lt;/P&gt;
&lt;P data-path-to-node="3,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,1"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="3,1"&gt;&lt;A href="https://github.com/Nikoolayy1/awx-example-playbooks/blob/main/awx-palo-alto-restart-service.yml" target="_blank" rel="noopener"&gt;awx-example-playbooks/awx-palo-alto-restart-service.yml at main · Nikoolayy1/awx-example-playbooks&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-path-to-node="3,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="3,2"&gt;&lt;SPAN class="citation-13"&gt;This specific playbook uses the &lt;/SPAN&gt;&lt;STRONG data-index-in-node="32" data-path-to-node="3,2"&gt;&lt;CODE data-index-in-node="32" data-path-to-node="3,2"&gt;&lt;SPAN class="citation-13"&gt;ansible.builtin.expect&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/STRONG&gt;&lt;SPAN class="citation-13 citation-end-13"&gt; module to handle the interactive CLI prompts required for service restarts—a task that standard API-based modules cannot perform.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;U&gt;&lt;STRONG&gt;5. Create and trigger Ansible AWX automation&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Next, create an &lt;STRONG data-index-in-node="17" data-path-to-node="5,0"&gt;Inventory&lt;/STRONG&gt; in AWX using the variables provided below. While you can attach these variables directly to the host, I recommend creating a &lt;STRONG data-index-in-node="152" data-path-to-node="5,0"&gt;Group&lt;/STRONG&gt; and placing the variables there—this makes it much easier to scale if you have multiple firewalls.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;For the 'Host' field, you can use the firewall's IP address or its &lt;STRONG data-index-in-node="67" data-path-to-node="5,1"&gt;FQDN&lt;/STRONG&gt;. If your Kind cluster or Docker host is configured with the correct DNS server, using the FQDN is the preferred method for long-term management.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Once the Inventory is set, create your &lt;STRONG data-index-in-node="39" data-path-to-node="5,2"&gt;Job Template&lt;/STRONG&gt;, link it to your project and inventory, and run it to see the magic happen!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_3-1776427650468.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71242i4EC38674CAC6F8F5/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_3-1776427650468.png" alt="nikoolayy1_3-1776427650468.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;---
ansible_connection: local
cli_user: admin
cli_pass: xxxx
cli_port: 22
ssh_opts: "-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o PubkeyAuthentication=no -o PreferredAuthentications=keyboard-interactive,password -o IdentitiesOnly=yes"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776427856727.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71243i3234553EA4B52BE1/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776427856727.png" alt="nikoolayy1_0-1776427856727.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776427894618.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71244i0A38FAC97DD5C54B/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776427894618.png" alt="nikoolayy1_1-1776427894618.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776427406108.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71241i551010E2377E2054/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776427406108.png" alt="nikoolayy1_2-1776427406108.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;&amp;nbsp;6. Ansible AWX API and Terraform Integration.&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;Ansible AWX also provides a robust &lt;STRONG data-index-in-node="36" data-path-to-node="5,0"&gt;REST API&lt;/STRONG&gt;, which allows it to integrate seamlessly with other tools like &lt;STRONG data-index-in-node="108" data-path-to-node="5,0"&gt;Terraform&lt;/STRONG&gt;. In a modern 'Best of Breed' stack, Terraform handles the &lt;STRONG data-index-in-node="176" data-path-to-node="5,0"&gt;Infrastructure as Code (IaC)&lt;/STRONG&gt;—provisioning the public or private cloud resources—while Ansible takes over for granular &lt;STRONG data-index-in-node="294" data-path-to-node="5,0"&gt;Configuration Management&lt;/STRONG&gt;.&amp;nbsp; Because Terraform is declarative and relies on a &lt;STRONG data-index-in-node="49" data-path-to-node="5,1"&gt;state file&lt;/STRONG&gt;, it is designed to maintain a persistent environment. This makes it difficult to use for 'procedural' operational tasks, such as restarting a specific service, as these actions don't represent a change in the infrastructure's permanent state.&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;Historically, triggering Ansible from Terraform required using &lt;STRONG data-index-in-node="63" data-path-to-node="5,2"&gt;local or remote provisioners&lt;/STRONG&gt; on the same machine. However, this 'old way' is difficult to scale and maintain due to the complex SSH requirements and tight coupling. By using the &lt;STRONG data-index-in-node="241" data-path-to-node="5,2"&gt;AWX API&lt;/STRONG&gt;, you can decouple these tools: Terraform provisions the firewall, and then issues a simple API call to AWX to trigger the necessary configuration or restart playbooks.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&lt;A href="https://developer.hashicorp.com/packer/integrations/hashicorp/ansible/latest/components/provisioner/ansible" target="_blank" rel="noopener"&gt;Ansible Provisioner | Integrations | Packer | HashiCorp Developer&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776425217015.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71234i1E2626CB2662B303/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776425217015.png" alt="nikoolayy1_1-1776425217015.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776425239275.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71235iEF64B928353668D2/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776425239275.png" alt="nikoolayy1_2-1776425239275.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776429105471.png" style="width: 400px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71246i56B4174D3F18A271/image-size/medium?v=v2&amp;amp;px=400" role="button" title="nikoolayy1_0-1776429105471.png" alt="nikoolayy1_0-1776429105471.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;resource "null_resource" "awx_launch" {
  provisioner "local-exec" {
    command = &amp;lt;&amp;lt;EOT
curl -ks -u '${var.user}:${var.pass}' \
  -H 'Content-Type: application/json' \
  -X POST \
  https://awx.local/api/v2/job_templates/${var.job_template_id}/launch/ \
  -d '{"limit":"palo"}'
EOT
  }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;U&gt;7. Palo Alto API module example (bonus!)&lt;/U&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-path-to-node="5,0"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;A common issue with the default &lt;STRONG data-index-in-node="32" data-path-to-node="5,1"&gt;Execution Environment (EE)&lt;/STRONG&gt; in AWX is that the standard job container often lacks the specific Python packages (like &lt;CODE data-index-in-node="148" data-path-to-node="5,1"&gt;pan-os-python&lt;/CODE&gt;) required for Palo Alto’s native API modules. To solve this,&amp;nbsp;you can make your own container or use mine, which I've hosted here:&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&lt;CODE data-index-in-node="70" data-path-to-node="6,0"&gt;ghcr.io/nikoolayy1/custom-awx-ee:latest&lt;/CODE&gt;.&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;Just add this as an &lt;STRONG data-index-in-node="131" data-path-to-node="6,0"&gt;Execution Environment&lt;/STRONG&gt; in AWX the settings and select it in your &lt;STRONG data-index-in-node="89" data-path-to-node="5,3"&gt;Job Template&amp;nbsp;&lt;/STRONG&gt;and you're ready to go!&lt;/P&gt;
&lt;P data-path-to-node="5,3"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,4"&gt;I also enabled an &lt;STRONG data-index-in-node="18" data-path-to-node="5,4"&gt;AWX Survey&lt;/STRONG&gt; in the template. This provides a user-friendly prompt where you can enter &lt;I data-index-in-node="103" data-path-to-node="5,4"&gt;any&lt;/I&gt; operational command to be executed, making the template versatile for more than just service restarts.&lt;/P&gt;
&lt;P data-path-to-node="5,4"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,5"&gt;&lt;STRONG data-index-in-node="0" data-path-to-node="5,5"&gt;Important Note on Variables:&lt;/STRONG&gt; Don't forget that the connection variables for API-based modules differ from the SSH ones. Ensure your &lt;STRONG data-index-in-node="132" data-path-to-node="5,5"&gt;Inventory&lt;/STRONG&gt; or &lt;STRONG data-index-in-node="145" data-path-to-node="5,5"&gt;Group variables&lt;/STRONG&gt; include the correct API credentials.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_0-1776444353495.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71259i974A9F71603DCB93/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_0-1776444353495.png" alt="nikoolayy1_0-1776444353495.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BR /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;FROM quay.io/ansible/awx-ee:24.6.1

USER root

RUN python3 -m pip install --no-cache-dir \
    pan-python \
    pandevice \
    xmltodict

RUN ansible-galaxy collection install paloaltonetworks.panos

USER 1000
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776443811117.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71258i0CC0C460F6E00D3F/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_1-1776443811117.png" alt="nikoolayy1_1-1776443811117.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;- name: Palo Alto dynamic command
  hosts: all
  connection: local
  gather_facts: false
  vars:
    device:
      ip_address: "{{ ansible_host }}"
      username: "{{ palo_user }}"
      password: "{{ palo_pass }}"
  tasks:
    - name: Run dynamic command
      paloaltonetworks.panos.panos_op:
        provider: "{{ device }}"
        cmd: "{{ pa_cmd }}"
      register: result
    - debug:
        msg: "{{ result.stdout }}"&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;U&gt;If you plan to use Ansible AWX also with the general palo alto api modules then you will need to pull the collections as well as mentioned in&amp;nbsp;&lt;A href="https://github.com/ansible/awx/blob/devel/docs/collections.md" target="_blank" rel="noopener"&gt;awx/docs/collections.md at devel · ansible/awx&lt;/A&gt;&amp;nbsp;&lt;/U&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV id="tinyMceEditornikoolayy1_0" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_1-1776429115682.png" style="width: 400px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71247i8411677119ED6406/image-size/medium?v=v2&amp;amp;px=400" role="button" title="nikoolayy1_1-1776429115682.png" alt="nikoolayy1_1-1776429115682.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Again links to my playbooks repo:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/Nikoolayy1/awx-example-playbooks/blob/main/README.md" target="_blank" rel="noopener"&gt;awx-example-playbooks/README.md at main · Nikoolayy1/awx-example-playbooks&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;U&gt;&lt;STRONG&gt;Summary:&lt;/STRONG&gt;&lt;/U&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,1"&gt;The benefits of this setup extend into high-level security operations. &lt;STRONG data-index-in-node="71" data-path-to-node="5,1"&gt;Cortex XSOAR&lt;/STRONG&gt; natively supports the &lt;STRONG data-index-in-node="106" data-path-to-node="5,1"&gt;Ansible Automation Platform (AAP) API&lt;/STRONG&gt;, meaning the playbooks we’ve discussed for process and daemon restarts can be triggered automatically by XSOAR as part of an incident response or self-healing workflow. You can find more on that integration here: &lt;A class="ng-star-inserted" href="https://xsoar.pan.dev/docs/reference/integrations/ansible-tower" target="_self"&gt;Ansible Automation Platform | Cortex XSOAR&lt;/A&gt;.&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-path-to-node="5,2"&gt;I hope you enjoyed reading this article as much as I enjoyed building the lab! Stay tuned—my next playground will likely involve &lt;STRONG data-index-in-node="129" data-path-to-node="5,2"&gt;GitHub Actions CI/CD&lt;/STRONG&gt;, with a potential article on that coming soon&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="nikoolayy1_2-1776428874050.png" style="width: 999px;"&gt;&lt;img src="https://live.paloaltonetworks.com/t5/image/serverpage/image-id/71245i3BF799B73B138A47/image-size/large?v=v2&amp;amp;px=999" role="button" title="nikoolayy1_2-1776428874050.png" alt="nikoolayy1_2-1776428874050.png" /&gt;&lt;/span&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;</description>
      <pubDate>Fri, 08 May 2026 23:56:39 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/ta-p/1252412</guid>
      <dc:creator>nikoolayy1</dc:creator>
      <dc:date>2026-05-08T23:56:39Z</dc:date>
    </item>
    <item>
      <title>Re: Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253519#M852</link>
      <description>&lt;P&gt;Great work on this ! Automation is a top priority for so many of us right now, and this AWX deep-dive is exactly the kind of content our members need. Thanks for the contribution! &lt;span class="lia-unicode-emoji" title=":clapping_hands:"&gt;👏&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 06 May 2026 10:10:08 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253519#M852</guid>
      <dc:creator>kiwi</dc:creator>
      <dc:date>2026-05-06T10:10:08Z</dc:date>
    </item>
    <item>
      <title>Re: Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253539#M853</link>
      <description>&lt;P&gt;Great work&lt;span class="lia-unicode-emoji" title=":clapping_hands:"&gt;👏&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 06 May 2026 16:04:58 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253539#M853</guid>
      <dc:creator>banand</dc:creator>
      <dc:date>2026-05-06T16:04:58Z</dc:date>
    </item>
    <item>
      <title>Re: Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253543#M854</link>
      <description>&lt;P&gt;Thanks for sharing&amp;nbsp;&lt;a href="https://live.paloaltonetworks.com/t5/user/viewprofilepage/user-id/153031"&gt;@nikoolayy1&lt;/a&gt;&amp;nbsp;!&lt;/P&gt;</description>
      <pubDate>Wed, 06 May 2026 17:45:55 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253543#M854</guid>
      <dc:creator>JayGolf</dc:creator>
      <dc:date>2026-05-06T17:45:55Z</dc:date>
    </item>
    <item>
      <title>Re: Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253639#M855</link>
      <description>&lt;P&gt;Really appreciate the content here&amp;nbsp;&lt;a href="https://live.paloaltonetworks.com/t5/user/viewprofilepage/user-id/153031"&gt;@nikoolayy1&lt;/a&gt;&amp;nbsp;! Great read.&lt;/P&gt;</description>
      <pubDate>Thu, 07 May 2026 15:56:23 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253639#M855</guid>
      <dc:creator>crasmussen</dc:creator>
      <dc:date>2026-05-07T15:56:23Z</dc:date>
    </item>
    <item>
      <title>Re: Use Ansible AWX to automate the Palo Alto NGFW's management and even Process/Deamon Restarts!</title>
      <link>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253640#M856</link>
      <description>&lt;P&gt;Awesome automation insights. Thanks!&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":clapping_hands:"&gt;👏&lt;/span&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 07 May 2026 15:58:19 GMT</pubDate>
      <guid>https://live.paloaltonetworks.com/t5/general-articles/use-ansible-awx-to-automate-the-palo-alto-ngfw-s-management-and/tac-p/1253640#M856</guid>
      <dc:creator>rjukanti</dc:creator>
      <dc:date>2026-05-07T15:58:19Z</dc:date>
    </item>
  </channel>
</rss>

