{"id":16868,"date":"2024-02-20T12:06:03","date_gmt":"2024-02-20T06:36:03","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=16868"},"modified":"2024-02-20T12:08:58","modified_gmt":"2024-02-20T06:38:58","slug":"nifi-and-zookeeper-cluster-setup-with-terraform","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2024\/02\/20\/nifi-and-zookeeper-cluster-setup-with-terraform\/","title":{"rendered":"Nifi and Zookeeper Cluster Setup with Terraform"},"content":{"rendered":"\n<p class=\"has-text-align-justify\">Recently while trying to set up Apache Nifi in cluster mode manually, I faced the challenge of performing same tasks on all nodes manually. In addition configuring the right cluster configurations was not easy. In my last blog <a href=\"https:\/\/opstree.com\/blog\/\/2023\/11\/21\/nifi-cluster-setup-with-external-zookeeper\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>here<\/em><\/a>, I have covered the advantages of having nifi cluster over standalone and the manual steps to configure a Nifi cluster with external zookeeper. <br> In this article, I will show you how you can set up a three-node Zookeeper and Nifi cluster with terraform which will minimize the steps we have to perform with manual setup.<\/p>\n\n\n\n<p class=\"has-text-align-justify\" style=\"font-size:16px\"><strong>Apache NiFi<\/strong> is an open-source data integration and automation tool that enables the automation of data flow between different systems. NiFi provides a user-friendly interface to design, control, and manage the flow of data between various sources and destinations. The tool is particularly useful in handling data from different sources, applying transformations, and routing it to different systems in real-time.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Advantage of Using Terraform for Nifi<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-justify is-style-default\" style=\"font-size:16px\">Terraform allows you to define your NiFi cluster infrastructure as code, making it easily versioned, shareable, and easy to understand. This ensures that your infrastructure is consistent across different environments. This helps in maintaining consistency and reducing the chances of configuration drift. As your NiFi cluster requirements evolve, Terraform makes it simple to scale your infrastructure up or down by adjusting the configuration.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Setting Up Apache Nifi Cluster with External Zookeeper<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"3368\" height=\"1924\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2024\/01\/image-1.png?w=1024\" alt=\"\" class=\"wp-image-16874\" style=\"width:628px;height:auto\"\/><\/figure>\n\n\n\n<p>As shown in the diagram above we will setup a highly available zookeeper and nifi cluster across availability zones in AWS.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Three Node Zookeeper Cluster Setup<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Prerequisites<\/strong><\/p>\n\n\n\n<p style=\"font-size:16px\">Before you begin this installation, you will need the following:<\/p>\n\n\n\n<ul>\n<li style=\"font-size:16px\">An AWS account and IAM user with required privileges.<\/li>\n\n\n\n<li style=\"font-size:16px\">VPC and three private subnets.<\/li>\n\n\n\n<li style=\"font-size:16px\">Terraform is installed on your machine.<\/li>\n<\/ul>\n\n\n\n<p>Now let\u2019s break down the steps involved in setting up our Zookeeper cluster.<\/p>\n\n\n\n<p><strong>Step 1<\/strong> &#8211; Clone the zookeeper module.<\/p>\n\n\n\n<p>Zookeeper module can be found\u2002<a href=\"https:\/\/github.com\/moksh7822\/terraform-aws-zookeeper.git\" target=\"_blank\" rel=\"noopener\"><strong><em>here<\/em><\/strong><\/a> <\/p>\n\n\n\n<p><strong>Step 2<\/strong> &#8211; Have a look at <strong>ec2-int.sh<\/strong> and <strong>terraform.tfvars<\/strong> and modify it according to your requirements.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<br>sudo apt-get update -y<br>sudo apt-get upgrade -y<br><br>#Install Java<br>sudo apt install openjdk-17-jdk openjdk-17-jre -y<br>echo 'export JAVA_HOME=\/usr\/lib\/jvm\/java-17-openjdk-amd64' | sudo tee -a \/etc\/profile<br>echo 'PATH=$PATH:$JAVA_HOME\/bin' | sudo tee -a \/etc\/profile<br>source \/etc\/profile<br><br>cd \/home\/ubuntu &amp;&amp; wget http:\/\/archive.apache.org\/dist\/zookeeper\/zookeeper-3.8.0\/apache-zookeeper-3.8.0-bin.tar.gz<br>cd \/home\/ubuntu &amp;&amp; tar -xvzf apache-zookeeper-3.8.0-bin.tar.gz<br>cp -R \/home\/ubuntu\/apache-zookeeper-3.8.0-bin \/home\/ubuntu\/zookeeper<br>cd \/home\/ubuntu\/zookeeper\/conf &amp;&amp; touch zoo.cfg<br>chown -R ubuntu: \/home\/ubuntu\/*<br><br>cat &lt;&lt;EOT &gt;&gt; \/home\/ubuntu\/zookeeper\/conf\/zoo.cfg<br>dataDir=\/var\/lib\/zookeeper<br>clientPort=2181<br>initLimit=5<br>syncLimit=2<br>server.1=&lt;zookeeper-hostname&gt;:2888:3888<br>server.2=&lt;zookeeper-hostname&gt;:2888:3888<br>server.3=&lt;zookeeper-hostname&gt;:2888:3888<br>EOT<br><br>sudo mkdir \/var\/lib\/zookeeper<br>sudo touch \/var\/lib\/zookeeper\/myid<br>sudo sh -c \"echo 'zk-id' &gt; \/var\/lib\/zookeeper\/myid\"<br>sudo \/home\/ubuntu\/zookeeper\/bin\/zkServer.sh restart<\/code><\/pre>\n\n\n\n<p>This bash script performs the following actions:<\/p>\n\n\n\n<ul>\n<li>Installing and Configuring  Java 17 as it is required for Zookeeper.<\/li>\n\n\n\n<li>Installing and Extracting Apache-Zookeeper-3.8.0.<\/li>\n\n\n\n<li>Creating and Updating Zookeeper configuration file.<\/li>\n<\/ul>\n\n\n\n<p><strong>Step <\/strong>3- After modifying the values as per your requirement, run terraform commands to provision zookeeper cluster.<\/p>\n\n\n\n<p><strong>Note:<\/strong> Please go through <strong>README<\/strong> carefully for more details.<\/p>\n\n\n\n<p>After following the steps above if you check the status of the zookeeper on each node, you will one server elected as leader and the other two as followers. Once the zookeeper cluster is up and we have the NLB DNS we will proceed for Nifi Cluster setup.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"73\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2024\/01\/image-2.png?w=697\" alt=\"\" class=\"wp-image-16876\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Three Node Nifi Cluster Setup<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Prerequisites<\/strong><\/p>\n\n\n\n<p style=\"font-size:16px\">Before you begin this installation, you will need the following:<\/p>\n\n\n\n<ul>\n<li style=\"font-size:16px\">An AWS account and IAM user with required privileges.<\/li>\n\n\n\n<li style=\"font-size:16px\">VPC and three private subnets.<\/li>\n\n\n\n<li style=\"font-size:16px\">Terraform is installed on your machine.<\/li>\n\n\n\n<li style=\"font-size:16px\">Understanding of how nifi works with external zookeeper.<\/li>\n<\/ul>\n\n\n\n<p><strong>Step 1<\/strong> &#8211; Clone the Nifi-Autoscaling module.<\/p>\n\n\n\n<p>Nifi module can be found <a href=\"https:\/\/github.com\/moksh7822\/terraform-aws-nifi.git\" target=\"_blank\" rel=\"noopener\">here<\/a><\/p>\n\n\n\n<p><strong>Step 2<\/strong> &#8211; Have a look at <strong>ec2-int.sh<\/strong> and <strong>terraform.tfvars<\/strong> and modify it according to your requirements.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash<br>sudo apt-get update -y<br>sudo apt-get upgrade -y<br><br>#Install Java<br>sudo apt install openjdk-17-jdk openjdk-17-jre -y<br>echo 'export JAVA_HOME=\/usr\/lib\/jvm\/java-17-openjdk-amd64' | sudo tee -a \/etc\/profile<br>echo 'PATH=$PATH:$JAVA_HOME\/bin' | sudo tee -a \/etc\/profile<br>source \/etc\/profile<br><br>function prop_replace() {<br>    local filepath=$1<br>    local propname=$2<br>    local propvalue=$3<br>    local delim=\"=\"<br>    <br>    #Check if file exists<br>    if &#91; ! -f \"${filepath}\" ]; then<br>       echo \"File '${filepath}' does not exist\"<br>       return 1<br>    fi<br>    <br>    #Escape forward slashes in property value<br>    propvalue=${propvalue\/\/\\\/\/\\\\\/}<br>    <br>    #Replace property in file<br>    sed -i -e \"s|^${propname}${delim}.*|${propname}${delim}${propvalue}|\" \"${filepath}\"<br>    <br>    return 0<br>  }<br> # Install unzip<br>sudo apt-get install unzip -y<br> <br>#Install nifi<br>cd \/home\/ubuntu &amp;&amp; wget https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-1.19.1-bin.zip<br>unzip \/home\/ubuntu\/nifi-1.19.1-bin.zip<br>mv \/home\/ubuntu\/nifi-1.19.1 \/home\/ubuntu\/nifi <br><br># Install toolkit<br>wget https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-toolkit-1.19.1-bin.zip<br>unzip \/home\/ubuntu\/nifi-toolkit-1.19.1-bin.zip<br>mv \/home\/ubuntu\/nifi-toolkit-1.19.1 \/home\/ubuntu\/nifi-toolkit<br>chown -R ubuntu: \/home\/ubuntu\/*<br><br>#Configure nifi cluster<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.web.http.port\" \"8443\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.web.http.host\" \"&lt;nifi-hostname&gt;\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.content.claim.max.appendable.size\" \"1MB\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.provenance.repository.max.storage.time\" \"24 hours\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.remote.input.socket.port\" \"9997\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.remote.input.host\" \"&lt;nifi-hostname&gt;\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.remote.input.secure\" \"false\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.cluster.is.node\" \"true\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.cluster.node.address\" \"&lt;nifi-hostname&gt;\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.cluster.node.protocol.port\" \"9998\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.cluster.node.protocol.max.threads\" \"10\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.cluster.flow.election.max.wait.time\" \"2 mins\"<br>prop_replace \/home\/ubuntu\/nifi\/conf\/nifi.properties \"nifi.zookeeper.connect.string\" \"&lt;zookeeper-hostname&gt;:2181\"<br>#Restart nifi<br>\/home\/ubuntu\/nifi\/bin\/nifi.sh restart<\/code><\/pre>\n\n\n\n<p>This bash script performs the following actions:<\/p>\n\n\n\n<ul>\n<li>Installing and Configuring  Java 17 as it is required for Nifi.<\/li>\n\n\n\n<li>Installing and Extracting Nifi-1.19.1 .<\/li>\n\n\n\n<li>Installing and Extracting Nifi -toolkit-1.19.1 , which is useful for security configurations.<\/li>\n\n\n\n<li>Updating <strong>nifi.properties<\/strong> file with required values.<\/li>\n<\/ul>\n\n\n\n<p><strong>Step <\/strong>3- After modifying the values as per your requirement, run the terraform commands.<\/p>\n\n\n\n<p><strong>Note:<\/strong> Please go through <strong>README<\/strong> carefully for more details.<\/p>\n\n\n\n<p>After following the steps above, we should see a cluster being formed if we access nifi on <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;&lt;hostname&gt;:8443\/nifi<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"77\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2024\/01\/image-3.png?w=800\" alt=\"\" class=\"wp-image-16887\"\/><\/figure>\n\n\n\n<p><br><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Conclusion<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-justify\">So in this blog, I have shared the terraform code and steps to minimize the time to provision a highly available nifi cluster with external zookeeper. If you guys have any ideas or suggestions about my approach, please comment in the comment section. I would really appreciate your suggestions and feedback. Thanks for reading.<\/p>\n\n\n\n<p><strong>Blog Pundits: <strong><a href=\"https:\/\/opstree.com\/blog\/\/author\/pankajkumar1301\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Pankaj Kumar<\/strong><\/a><\/strong> and <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\">Sandeep Rawat<\/a><\/strong><\/p>\n\n\n\n<p><strong>OpsTree is an End-to-End <a href=\"https:\/\/opstree.com\/services\/\" target=\"_blank\" rel=\"noreferrer noopener\">DevOps Solution<\/a> Provider.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=Nifi+and+Zookeeper+Cluster+Setup+with+Terraform\" target=\"_blank\" rel=\"noreferrer noopener\">Contact Us<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect with Us<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-twitter  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/twitter.com\/opstreedevops\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Recently while trying to set up Apache Nifi in cluster mode manually, I faced the challenge of performing same tasks on all nodes manually. In addition configuring the right cluster configurations was not easy. In my last blog here, I have covered the advantages of having nifi cluster over standalone and the manual steps to &hellip; <a href=\"https:\/\/opstree.com\/blog\/2024\/02\/20\/nifi-and-zookeeper-cluster-setup-with-terraform\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Nifi and Zookeeper Cluster Setup with Terraform&#8221;<\/span><\/a><\/p>\n","protected":false},"author":217204634,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[319067111,768739308,3021235,425781],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-4o4","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/16868"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/217204634"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=16868"}],"version-history":[{"count":40,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/16868\/revisions"}],"predecessor-version":[{"id":17467,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/16868\/revisions\/17467"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=16868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=16868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=16868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}