<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cinc – Blog</title><link>https://cinc.sh/blog/</link><description>Recent content in Blog on Cinc</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 13 Jun 2026 10:00:00 -0700</lastBuildDate><atom:link href="https://cinc.sh/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Cinc Server: forking for the long haul</title><link>https://cinc.sh/blog/2026/06/cinc_server_forking/</link><pubDate>Sat, 13 Jun 2026 10:00:00 -0700</pubDate><guid>https://cinc.sh/blog/2026/06/cinc_server_forking/</guid><description>
&lt;p>In November 2025, Progress &lt;a href="https://www.chef.io/blog/chef-infra-server-transitions-to-chef-360-platform" target="_blank" rel="noopener">announced&lt;/a> that the open-source Chef Infra Server is being retired in favor of the Chef 360 platform. The community edition will receive no new code, features, or security fixes after October 2026, and will reach formal end-of-life in November 2026. Existing repositories will go read-only at that point.&lt;/p>
&lt;p>This is similar in spirit to the upstream move to Habitat-only Workstation builds that triggered our &lt;a href="https://gitlab.com/cinc-project/distribution/cinc-workstation" target="_blank" rel="noopener">Cinc Workstation fork&lt;/a> earlier this year. And, like with Workstation, the Cinc Project intends to keep producing omnibus binary builds of Cinc Server for the foreseeable future — Chef 360 is Progress&amp;rsquo;s proprietary product, not something we&amp;rsquo;re going to chase.&lt;/p>
&lt;h2>Our plan&lt;span class="hx-absolute -hx-mt-20" id="our-plan">&lt;/span>
&lt;a href="#our-plan" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>There are two parallel tracks:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>Keep shipping 15.x for as long as it makes sense.&lt;/strong> We&amp;rsquo;ll continue to rebuild any 15.x releases Progress produces until their EOL in November 2026. Existing users on the 15.x line don&amp;rsquo;t need to change anything.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>In parallel, start work on a proper fork.&lt;/strong> We&amp;rsquo;ve created a new consolidated repository at &lt;a href="https://gitlab.com/cinc-project/distribution/cinc-server" target="_blank" rel="noopener">gitlab.com/cinc-project/distribution/cinc-server&lt;/a> and are doing the early work to make Cinc Server self-sufficient. The first independent release will be &lt;strong>Cinc Server 16.0.0&lt;/strong>, targeted to land around the upstream EOL. The current WIP can be followed on &lt;a href="https://gitlab.com/cinc-project/distribution/cinc-server/-/merge_requests/1" target="_blank" rel="noopener">merge request !1&lt;/a>.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>The fork is intended to keep Cinc Server in &lt;strong>maintenance mode&lt;/strong>. No major feature changes are planned. We&amp;rsquo;ll cherry-pick upstream commits that benefit the project for as long as the Chef GitHub repos remain readable, and we&amp;rsquo;ll continue to do the boring-but-important work after that: security updates, platform support, dependency upgrades.&lt;/p>
&lt;h2>What&amp;rsquo;s already in flight&lt;span class="hx-absolute -hx-mt-20" id="whats-already-in-flight">&lt;/span>
&lt;a href="#whats-already-in-flight" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>A fair amount of the groundwork is already done in the new repository:&lt;/p>
&lt;ul>
&lt;li>The consolidated &lt;code>cinc-server&lt;/code> repo now contains the service source (oc_erchef, bookshelf, oc_bifrost, oc-id, chef-server-ctl), the omnibus build configuration, integration tests, and CI pipeline — all in one place&lt;/li>
&lt;li>Erlang dependencies that previously lived under &lt;code>github.com/chef/&lt;/code> are being mirrored to &lt;code>gitlab.com/cinc-project/upstream/&lt;/code> and pinned to known-good commits, so we don&amp;rsquo;t lose the ability to build when those repos go read-only&lt;/li>
&lt;li>Gecode 6.x compatibility patches and libffi / runit updates for Enterprise Linux 10 and Debian 13 are already merged&lt;/li>
&lt;li>Telemetry to Progress Chef can be disabled; it will be removed entirely post-fork&lt;/li>
&lt;li>Initial version is set to 16.0.0; CI is being restructured for the fork workflow&lt;/li>
&lt;/ul>
&lt;p>The maintenance plan — including the full list of upstream dependencies we&amp;rsquo;re mirroring, our security update policy, and the planned Ruby / PostgreSQL / Erlang upgrade roadmap — is published in the repository: &lt;a href="https://gitlab.com/cinc-project/distribution/cinc-server/-/blob/main/CINC_MAINTENANCE_PLAN.md" target="_blank" rel="noopener">CINC_MAINTENANCE_PLAN.md&lt;/a>.&lt;/p>
&lt;h2>What this means if you run Cinc Server today&lt;span class="hx-absolute -hx-mt-20" id="what-this-means-if-you-run-cinc-server-today">&lt;/span>
&lt;a href="#what-this-means-if-you-run-cinc-server-today" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>In short: nothing changes immediately, and your migration plan is &amp;ldquo;keep running Cinc Server.&amp;rdquo;&lt;/p>
&lt;ul>
&lt;li>Your existing 15.x installs keep getting rebuilds for the rest of 2026&lt;/li>
&lt;li>Cookbooks, knife configurations, &lt;code>chef-server-ctl&lt;/code> automation — all continue to work unchanged&lt;/li>
&lt;li>When 16.0.0 lands, it will be a drop-in continuation of the 15.x line. There are no planned breaking changes at the fork point&lt;/li>
&lt;li>Configuration paths (&lt;code>/etc/cinc-project/cinc-server.rb&lt;/code>) and binary names (&lt;code>cinc-server-ctl&lt;/code>) stay the same&lt;/li>
&lt;/ul>
&lt;p>If you&amp;rsquo;ve been considering Chef 360, that&amp;rsquo;s between you and Progress; this post isn&amp;rsquo;t about that. But if you&amp;rsquo;d rather not switch to a commercial platform, Cinc Server will be there.&lt;/p>
&lt;h2>How to help&lt;span class="hx-absolute -hx-mt-20" id="how-to-help">&lt;/span>
&lt;a href="#how-to-help" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This is a meaningful expansion of the maintenance surface for the Cinc Project. We&amp;rsquo;d particularly welcome:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Erlang experience&lt;/strong> — the three core services (oc_erchef, bookshelf, oc_bifrost) are battle-tested but the long tail of Erlang dependencies needs care&lt;/li>
&lt;li>&lt;strong>Testing on more platforms&lt;/strong> — the build matrix already covers 12 platforms; expanding to ARM and more distros would be useful&lt;/li>
&lt;li>&lt;strong>Security review&lt;/strong> — extra eyes on the upgrade plan for OpenSSL, PostgreSQL, Ruby, and Erlang/OTP versions&lt;/li>
&lt;/ul>
&lt;p>Come find us in &lt;code>#community-distros&lt;/code> on the &lt;a href="https://chefcommunity.slack.com/signup#/domain-signup" target="_blank" rel="noopener">Chef Community Slack&lt;/a>, or open an issue / MR on &lt;a href="https://gitlab.com/cinc-project/distribution/cinc-server" target="_blank" rel="noopener">GitLab&lt;/a>.&lt;/p></description></item><item><title>Cinc as highly available cluster</title><link>https://cinc.sh/blog/2024/12/cinc-as-highly-available-cluster/</link><pubDate>Fri, 06 Dec 2024 22:00:33 +0100</pubDate><guid>https://cinc.sh/blog/2024/12/cinc-as-highly-available-cluster/</guid><description>
&lt;h2>Introduction&lt;span class="hx-absolute -hx-mt-20" id="introduction">&lt;/span>
&lt;a href="#introduction" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>For most use cases a single instance of CINC will cover all your needs. It is a tool after all, and not a service that processes client traffic.&lt;/p>
&lt;p>But, if for some of you out there, having a single instance of anything is not acceptable, or if in your infrastructure CINC plays a crucial role, there is a way to have CINC in a highly available clustered setup.&lt;/p>
&lt;p>In this article we will go through setting up this on VM&amp;rsquo;s in your private cloud or with some cloud provider. We will need 6 to 10 VM&amp;rsquo;s. I will be setting it up on Rocky Linux 8.&lt;/p>
&lt;h2>Architecture&lt;span class="hx-absolute -hx-mt-20" id="architecture">&lt;/span>
&lt;a href="#architecture" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>In order to achieve a highly available setup we&amp;rsquo;ll need to separate all services with persistent data to dedicated clusters.&lt;/p>
&lt;p>We will move Opensearch to its own cluster.&lt;/p>
&lt;p>PostgreSQL will also be an external cluster, with additional installations of etcd and Patroni for cluster management and failover.&lt;/p>
&lt;p>Bookshelf service which stores Cinc cookbooks will be replaced with another object storage service, MinIO.&lt;/p>
&lt;p>If you have your infrastructure in AWS cloud, you can use S3 bucket for this purpose as well. In this article we will be using MinIO.&lt;/p>
&lt;p>Every cinc-client will need to be able to connect to your Cinc server to authenticate and upload data at the end of the run, as well as your object storage service to download cookbooks (MinIO/S3).&lt;/p>
&lt;p>The cluster service schema looks something like this.&lt;/p>
&lt;p>&lt;img src="https://cinc.sh/images/cinc_ha_cluster_schema.png" alt="Cinc HA cluster schema" loading="lazy" />&lt;/p>
&lt;h3>Frontend servers&lt;span class="hx-absolute -hx-mt-20" id="frontend-servers">&lt;/span>
&lt;a href="#frontend-servers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>On frontend we will be installing services without persistent data with &lt;code>cinc-server-ctl&lt;/code> command on 2 servers.&lt;/p>
&lt;p>&lt;strong>Services: nginx, oc_bifrost, oc_id, opscode-erchef, redis_lb&lt;/strong>&lt;/p>
&lt;p>frontend-1&lt;br>
frontend-2&lt;/p>
&lt;h3>Backend servers&lt;span class="hx-absolute -hx-mt-20" id="backend-servers">&lt;/span>
&lt;a href="#backend-servers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Backend servers will host services with persistent data, each in clustered setup. We will install all of them on 4 servers, so each service cluster will have 4 members.&lt;/p>
&lt;p>&lt;strong>Services: opensearch, postgresql(+ etcd, patroni), minio&lt;/strong>&lt;/p>
&lt;p>backend-1&lt;br>
backend-2&lt;br>
backend-3&lt;br>
backend-4&lt;/p>
&lt;h3>Balancers&lt;span class="hx-absolute -hx-mt-20" id="balancers">&lt;/span>
&lt;a href="#balancers" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>If you are not running this in a public cloud you can use keepalived and haproxy.&lt;/p>
&lt;p>If you are in a public cloud, you can replace this with cloud native balancers. So 4 servers less.
If you&amp;rsquo;ll be using them, the first order of business is to deploy them and configure a virtual IP on keepaliveds to point to haproxies.&lt;/p>
&lt;p>I won&amp;rsquo;t go into the details of haproxy and keepalived setup to keep the article focused, I will only go through relevant information for service balancing.
Check references for details on balancers.&lt;/p>
&lt;p>keepalived-1&lt;br>
keepalived-2&lt;br>
haproxy-1&lt;br>
haproxy-2&lt;/p>
&lt;h2>Certificates&lt;span class="hx-absolute -hx-mt-20" id="certificates">&lt;/span>
&lt;a href="#certificates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>In this setup we will make sure all communication inside the cluster of each service is encrypted.
Each server will have a fully qualified domain name. If you don&amp;rsquo;t have a DNS server, you can add servers to &lt;code>/etc/hosts&lt;/code> file.&lt;/p>
&lt;p>Use openssl to generate your certificates from the same self-signed root CA and you can use the same ones for all your service clusters.&lt;/p>
&lt;p>Make sure you add this root certificate to your servers trust store in order for certificates to be trusted.&lt;/p>
&lt;p>If you don&amp;rsquo;t want to add this root certificate to all of your servers in infrastructure, you can use these self-signed certificates only for inside-cluster communication.&lt;/p>
&lt;p>TLS termination for traffic from cinc-clients can happen on haproxy service, with publicly trusted certificates hosted there.&lt;/p>
&lt;h2>Opensearch&lt;span class="hx-absolute -hx-mt-20" id="opensearch">&lt;/span>
&lt;a href="#opensearch" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Installation&lt;span class="hx-absolute -hx-mt-20" id="installation">&lt;/span>
&lt;a href="#installation" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>We will first start setting up our backend (data persistent) services.&lt;/p>
&lt;p>Add opensearch repo. Currently supported &lt;a href="https://docs.chef.io/release_notes_server/" target="_blank" rel="noopener">version&lt;/a> of Opensearch is &lt;code>1.x.&lt;/code> in &lt;code>Cinc 15.9.38&lt;/code> version. Before proceeding, check which one is supported in the version you will be using. In this setup we will be using &lt;code>1.3.18&lt;/code>.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/1.x/opensearch-1.x.repo -o /etc/yum.repos.d/opensearch-1.x.repo &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> dnf install opensearch -y&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once installed create a separate &lt;code>/data&lt;/code> partition to make sure that data cannot fill out the root partition. We will use &lt;code>/data&lt;/code> for all backend services. Then setup &lt;code>/data/opensearch&lt;/code> dir and adjust ownership:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir /data/opensearch &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> chown opensearch:opensearch /data/opensearch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Configuration&lt;span class="hx-absolute -hx-mt-20" id="configuration">&lt;/span>
&lt;a href="#configuration" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Once service is installed, we need to set up certificates. Here I will be using the ones we generated for server fqdns. You need to have 3 seperate files, one for full certificate chain, private key and root-ca certificate.&lt;/p>
&lt;p>Additionally, you could generate one more certificate to be used for admin user authentication if you wish to do that. Referenced by &lt;code>admin_dn&lt;/code> part of the configuration.&lt;/p>
&lt;p>Put them in &lt;code>/etc/opensearch/&lt;/code> and make sure the opensearch user has permissions to read them.&lt;/p>
&lt;p>Use this configuration as a template for configuring your opensearch cluster. Configure all 4 servers.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>cluster.name: cinc-opensearch
node.name: backend-1.example.com
path.data: /data/opensearch
path.logs: /var/log/opensearch
network.host: 0.0.0.0
discovery.seed_hosts: [ &amp;#34;backend-1.example.com&amp;#34;, &amp;#34;backend-2.example.com&amp;#34;, &amp;#34;backend-3.example.com&amp;#34;, &amp;#34;backend-4.example.com&amp;#34; ]
cluster.initial_master_nodes: [ &amp;#34;backend-1.example.com&amp;#34;, &amp;#34;backend-2.example.com&amp;#34;, &amp;#34;backend-3.example.com&amp;#34;, &amp;#34;backend-4.example.com&amp;#34; ]
node.master: true
plugins.security.allow_default_init_securityindex: true
plugins.security.ssl.transport.pemcert_filepath: full-chain.crt
plugins.security.ssl.transport.pemkey_filepath: private.key
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.transport.enabled_protocols:
- &amp;#34;TLSv1.2&amp;#34;
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.restapi.roles_enabled: [&amp;#34;all_access&amp;#34;, &amp;#34;security_rest_api_access&amp;#34;]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.indices: [&amp;#34;.opendistro-alerting-config&amp;#34;, &amp;#34;.opendistro-alerting-alert*&amp;#34;, &amp;#34;.opendistro-anomaly-results*&amp;#34;, &amp;#34;.opendistro-anomaly-detector*&amp;#34;, &amp;#34;.opendistro-anomaly-checkpoints&amp;#34;, &amp;#34;.opendistro-anomaly-detection-state&amp;#34;, &amp;#34;.opendistro-reports-*&amp;#34;, &amp;#34;.opendistro-notifications-*&amp;#34;, &amp;#34;.opendistro-notebooks&amp;#34;, &amp;#34;.opendistro-asynchronous-search-response*&amp;#34;, &amp;#34;.replication-metadata-store&amp;#34;]
plugins.security.authcz.admin_dn:
- &amp;#34;CN=A,OU=MyOrganizationalUnit,O=MyCompany,L=MyCity,ST=MyState,C=US&amp;#34;
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: full-chain.crt
plugins.security.ssl.http.pemkey_filepath: private.key
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.http.enabled_protocols:
- &amp;#34;TLSv1.2&amp;#34;
plugins.security.nodes_dn:
- &amp;#34;CN=backend-1.example.com,OU=MyOrganizationalUnit,O=MyCompany,L=MyCity,ST=MyState,C=US&amp;#34;
- &amp;#34;CN=backend-2.example.com,OU=MyOrganizationalUnit,O=MyCompany,L=MyCity,ST=MyState,C=US&amp;#34;
- &amp;#34;CN=backend-3.example.com,OU=MyOrganizationalUnit,O=MyCompany,L=MyCity,ST=MyState,C=US&amp;#34;
- &amp;#34;CN=backend-4.example.com,OU=MyOrganizationalUnit,O=MyCompany,L=MyCity,ST=MyState,C=US&amp;#34;
http.max_content_length: 1024mb&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then, not to have password for admin be admin(default), export the environment variable of initial password and start and enable service:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">export&lt;/span> &lt;span class="nv">OPENSEARCH_INITIAL_ADMIN_PASSWORD&lt;/span>&lt;span class="o">=&lt;/span>newpassword &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl start opensearch &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl &lt;span class="nb">enable&lt;/span> opensearch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I will be using this Opensearch cluster dedicated to Cinc only. If you were to share this cluster among multiple services best practice would be to have multiple users with granulated roles.&lt;/p>
&lt;p>Let&amp;rsquo;s check the health of the cluster to make sure we have no issues.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -XGET -u &lt;span class="nv">$user&lt;/span>:&lt;span class="nv">$pass&lt;/span> -H &lt;span class="s2">&amp;#34;Content-Type: application/json&amp;#34;&lt;/span> &lt;span class="s1">&amp;#39;https://backend-1.example.com:9200/_cluster/health?pretty&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Additionally, if you have more than 10 000 nodes, you will need to expand &lt;code>max_result_window&lt;/code>. More on this shortly.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -XPUT -u &lt;span class="nv">$user&lt;/span>:&lt;span class="nv">$pass&lt;/span> -H &lt;span class="s2">&amp;#34;Content-Type: application/json&amp;#34;&lt;/span> https://backend-1.example.com:9200/chef/_settings -d &lt;span class="s1">&amp;#39;{ &amp;#34;index&amp;#34; : { &amp;#34;max_result_window&amp;#34; : 100000 } }&amp;#39;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Balancing&lt;span class="hx-absolute -hx-mt-20" id="balancing">&lt;/span>
&lt;a href="#balancing" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For balancing we will be using L4 balancing on keepalived forwarded to L7 balancing on haproxy.
Here will also resolve an Opensearch optimization that shows up if you have more than 10 000 servers in your infrastructure.
Knife search will return only 10k results.
Opensearch, in order to speed up searches, capped all results to 10 000.
If you want more results, you need to send &lt;code>track_total_hits=true&lt;/code> with each request, and expand &lt;code>max_result_window&lt;/code> as we did in the previous step.&lt;/p>
&lt;p>You can fix this for now, until fixed permanently, by rewriting the search path on balancer.&lt;/p>
&lt;p>We will also be using in all of our balancing configs Layer 7 checks to make sure each node is in ready state to receive traffic.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>frontend cinc-opensearch-cluster
mode http
bind 10.0.0.100:9200 ssl crt /etc/ssl/haproxy
# Workaround of Opensearch limit of 10k search
acl is_search path_reg ^/chef/_search$
http-request set-path /chef/_search?track_total_hits=true if is_search
default_backend cinc-opensearch
backend cinc-opensearch
balance roundrobin
option httpchk GET /_plugins/_security/health
http-check expect status 200
server backend-1 backend-1.example.com:9200 check-ssl check ssl verify none
server backend-2 backend-2.example.com:9200 check-ssl check ssl verify none
server backend-3 backend-3.example.com:9200 check-ssl check ssl verify none
server backend-4 backend-4.example.com:9200 check-ssl check ssl verify none&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>PostgreSQL&lt;span class="hx-absolute -hx-mt-20" id="postgresql">&lt;/span>
&lt;a href="#postgresql" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Installation&lt;span class="hx-absolute -hx-mt-20" id="installation-1">&lt;/span>
&lt;a href="#installation-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For cluster management of PostgreSQL we will be using etcd and patroni.&lt;/p>
&lt;p>Always check the Chef release notes which &lt;a href="https://docs.chef.io/release_notes_server/" target="_blank" rel="noopener">version&lt;/a> of PostgreSQL is supported.&lt;/p>
&lt;p>First you will need to download etcd binaries named &lt;code>etcd&lt;/code> and &lt;code>etcdctl&lt;/code> and place them in &lt;code>/usr/local/bin/&lt;/code> and give them proper permissions as well as create data and config dirs.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">chown root:root /usr/local/bin/etcd* &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>chmod &lt;span class="m">755&lt;/span> /usr/local/bin/etcd* &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>mkdir -p /var/lib/etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>mkdir -p /etc/etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>groupadd --system etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>useradd -s /sbin/nologin --system -g etcd etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>chown -R etcd:etcd /var/lib/etcd /etc/etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>chmod &lt;span class="m">700&lt;/span> /var/lib/etcd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then you will need to download the repo and run the installation.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>dnf -qy module disable postgresql &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>dnf install -y postgresql13-server-13.14 patroni patroni-etcd&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Configuration&lt;span class="hx-absolute -hx-mt-20" id="configuration-1">&lt;/span>
&lt;a href="#configuration-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Once installed, create &lt;code>/data/postgresql&lt;/code> dir and adjust ownership:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir /data/postgresql &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> chown postgres:postgres /data/postgresql &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> chmod &lt;span class="m">700&lt;/span> /data/postgresql&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Next, we will configure the systemd file &lt;code>/etc/systemd/system/etcd.service&lt;/code> for etcd, edit the values to reflect your setup for each server in the cluster. Here is an example of it:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>[Unit]
Description=etcd
Documentation=https://github.com/etcd-io/etcd
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
User=etcd
ExecStart=/usr/local/bin/etcd \
--name backend-1.example.com \
--data-dir=/var/lib/etcd \
--initial-advertise-peer-urls https://10.0.0.1:2380 \
--listen-peer-urls https://10.0.0.1:2380 \
--listen-client-urls https://10.0.0.1:2379,http://127.0.0.1:2379 \
--advertise-client-urls https://10.0.0.1:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster backend-1.example.com=https://backend-1.example.com:2380,backend-2.example.com=https://backend-2.example.com:2380,backend-3.example.com=https://backend-3.example.com:2380,backend-4.example.com=https://backend-4.example.com:2380 \
--initial-cluster-state new --auto-tls --peer-auto-tls
[Install]
WantedBy=multi-user.target&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then configure patroni and postgresql inside it. Use the following configuration as template.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>scope: cinc_pgsql_cluster
namespace: /service/
name: backend-1
restapi:
listen: 10.0.0.1:8008
connect_address: 10.0.0.1:8008
allowlist_include_members: true
certfile: /etc/ssl/server-cert.pem
keyfile: /etc/ssl/private.key
cafile: /etc/ssl/root-ca.pem
ctl:
insecure: true
etcd3:
hosts: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379,10.0.0.4:2379
protocol: https
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
max_connections: 400
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
- host replication replicator 127.0.0.1/32 md5
- host replication replicator 10.0.0.1/32 md5
- host replication replicator 10.0.0.2/32 md5
- host replication replicator 10.0.0.3/32 md5
- host replication replicator 10.0.0.4/32 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: $pass
options:
- createrole
- createdb
postgresql:
listen: 0.0.0.0:5432
connect_address: 10.0.0.1:5432
data_dir: /data/postgresql/
bin_dir: /usr/pgsql-13/bin
pgpass: /tmp/pgpass
authentication:
replication:
username: replicator
password: &amp;#34;$pass&amp;#34;
superuser:
username: postgres
password: &amp;#34;$pass&amp;#34;
parameters:
max_connections: 400
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>That is it, make sure to enable etcd and partoni to start on boot. Patroni will be the one managing PostgreSQL, starting and stopping it. Run this on all nodes.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">systemctl start etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl start patroni &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl &lt;span class="nb">enable&lt;/span> etcd &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl &lt;span class="nb">enable&lt;/span> patroni&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Check that data is properly placed and that there is elected leader:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># patronictl -c /etc/patroni/patroni.yml list&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+ Cluster: cinc_pgsql_cluster &lt;span class="o">(&lt;/span>7416721032775114149&lt;span class="o">)&lt;/span> -+----+-----------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> Member &lt;span class="p">|&lt;/span> Host &lt;span class="p">|&lt;/span> Role &lt;span class="p">|&lt;/span> State &lt;span class="p">|&lt;/span> TL &lt;span class="p">|&lt;/span> Lag in MB &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+----------------+-------------+---------+-----------+----+-----------+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> backend-1 &lt;span class="p">|&lt;/span> 10.0.0.1 &lt;span class="p">|&lt;/span> Leader &lt;span class="p">|&lt;/span> running &lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> backend-2 &lt;span class="p">|&lt;/span> 10.0.0.2 &lt;span class="p">|&lt;/span> Replica &lt;span class="p">|&lt;/span> streaming &lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> backend-3 &lt;span class="p">|&lt;/span> 10.0.0.3 &lt;span class="p">|&lt;/span> Replica &lt;span class="p">|&lt;/span> streaming &lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">|&lt;/span> backend-4 &lt;span class="p">|&lt;/span> 10.0.0.4 &lt;span class="p">|&lt;/span> Replica &lt;span class="p">|&lt;/span> streaming &lt;span class="p">|&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="p">|&lt;/span> &lt;span class="m">0&lt;/span> &lt;span class="p">|&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+----------------+-------------+---------+-----------+----+-----------+&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Balancing&lt;span class="hx-absolute -hx-mt-20" id="balancing-1">&lt;/span>
&lt;a href="#balancing-1" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>For PostgreSQL we will be using L4 balancing on keepalived with L7 checks, checking for leader and sending it r/w requests. As mentioned before, you could use cloud native network balancer as well.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>###########################
# cinc-postgresql-cluster #
###########################
virtual_server 10.0.0.100 5432 {
delay_loop 2
lb_algo rr
lb_kind DR
protocol TCP
real_server 10.0.0.1 5432 {
weight 1
SSL_GET {
connect_timeout 2
connect_port 8008
url {
path /read-write
status_code 200
}
}
}
real_server 10.0.0.2 5432 {
weight 1
SSL_GET {
connect_timeout 2
connect_port 8008
url {
path /read-write
status_code 200
}
}
}
real_server 10.0.0.3 5432 {
weight 1
SSL_GET {
connect_timeout 2
connect_port 8008
url {
path /read-write
status_code 200
}
}
}
real_server 10.0.0.4 5432 {
weight 1
SSL_GET {
connect_timeout 2
connect_port 8008
url {
path /read-write
status_code 200
}
}
}
}&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>MinIO&lt;span class="hx-absolute -hx-mt-20" id="minio">&lt;/span>
&lt;a href="#minio" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>MinIO replaces Bookshelf service as another object storage. Here you could also use S3 bucket for this. We will choose Minio as an on-premise solution.
Bookshelf stores cookbooks and if you don&amp;rsquo;t have some shared disk between frontend servers, you need to have all the info in one place so all frontends can have consistent responses.&lt;/p>
&lt;h3>Installation&lt;span class="hx-absolute -hx-mt-20" id="installation-2">&lt;/span>
&lt;a href="#installation-2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>First we will need to install the service on all servers and create a user and disk. Consult &lt;a href="https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html" target="_blank" rel="noopener">official docs&lt;/a>.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20240913202602.0.0-1.x86_64.rpm -O minio.rpm &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>dnf install minio.rpm -y &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>groupadd -r minio-user &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>useradd -M -r -g minio-user minio-user &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>mkdir -p /data/minio/dir&lt;span class="o">{&lt;/span>1..4&lt;span class="o">}&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>chown -R minio-user:minio-user /data/minio&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Configuration&lt;span class="hx-absolute -hx-mt-20" id="configuration-2">&lt;/span>
&lt;a href="#configuration-2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>MinIO in clustered setup requires each server to have 4 disks. You could configure them using LVM or simply use 4 directories. I&amp;rsquo;ve chosen the second option as coobook data is also stored on git and is not critical.&lt;/p>
&lt;p>As a consequence of using directories, the minio command (&lt;code>mc&lt;/code>) might not show proper disk usage.&lt;/p>
&lt;p>The configuration will be done on &lt;code>/etc/default/minio&lt;/code> through env variables and should look something like this:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>MINIO_VOLUMES=&amp;#34;https://backend-{1...4}.example.com:9900/data/minio/dir{1...4}&amp;#34;
MINIO_OPTS=&amp;#34;--console-address :9001 --address 0.0.0.0:9900&amp;#34;
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=$pass
MINIO_PROMETHEUS_AUTH_TYPE=public&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Here we are using a dedicated MinIO cluster so we can use admin user. In case you have more buckets for other services, you will need to granulate role access per bucket.&lt;/p>
&lt;p>Then let&amp;rsquo;s configure certificates. We will be using the same self-signed ones. By default it uses path &lt;code>/home/minio-user/.minio/certs/CAs&lt;/code>, but this can be overridden with environment variables. We&amp;rsquo;ll use the default, so let&amp;rsquo;s create directory:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mkdir -p /home/minio-user/.minio/certs/CAs &lt;span class="o">&amp;amp;&amp;amp;&lt;/span>&lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span>chown -R minio-user:minio-user /home/minio-user/&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Your file structure should look something like this and minio-user should own all these files:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code># ll /home/minio-user/.minio/certs/
CAs
private.key
public.crt
# ll /home/minio-user/.minio/certs/CAs
backend-1.crt
backend-2.crt
backend-3.crt
backend-4.crt
root-ca.crt&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I will use admin user in Minio since there will be no other users or buckets in this cluster, just CINC. Make sure cert file ownership is correct.&lt;/p>
&lt;p>Start and enable the service:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">systemctl start minio &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> systemctl &lt;span class="nb">enable&lt;/span> minio&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>You will need to create a bucket at the end of the setup, once you have the entire setup complete and you have created the organization. You can configure MC(minio client) to do this or login to your server URL on port 9001(https) in the browser and add it there.&lt;/p>
&lt;p>The bucket name you will need to create is organization-$org-id, for example &lt;code>organization-928a25c3cce4bc623572df8a7764c185&lt;/code>.&lt;/p>
&lt;p>The ID is the guid under which organization was created in Cinc, so you will need to look that up with command after you create your organization:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># knife org show my-org&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">full_name: My Organization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">guid: 928a25c3cce4bc623572df8a7764c185
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">name: my-org&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Another important thing to note: When you specify in settings that the AWS S3 bucket is replacing the Bookshelf, it will follow the AWS bucket naming convention. So in cinc-server.rb below the following 2 settings will point to url &lt;code>cinc-minio-cluster.example.com&lt;/code>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>bookshelf[&amp;#39;external_url&amp;#39;] = &amp;#39;https://example.com&amp;#39;
opscode_erchef[&amp;#39;s3_bucket&amp;#39;] = &amp;#39;cinc-minio-cluster&amp;#39;&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Balancing&lt;span class="hx-absolute -hx-mt-20" id="balancing-2">&lt;/span>
&lt;a href="#balancing-2" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Use L4/L7 balancing, and configure on haproxy L7 healthcheck like this:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>frontend cinc-minio-cluster
mode http
bind 10.0.0.100:443 ssl crt /etc/ssl/haproxy
default_backend cinc-minio
backend cinc-minio
balance roundrobin
option httpchk /minio/health/live
http-check expect status 200
server backend-1 backend-1.example.com:9900 check-ssl check ssl verify none
server backend-2 backend-2.example.com:9900 check-ssl check ssl verify none
server backend-3 backend-3.example.com:9900 check-ssl check ssl verify none
server backend-4 backend-4.example.com:9900 check-ssl check ssl verify none&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>CINC frontend services&lt;span class="hx-absolute -hx-mt-20" id="cinc-frontend-services">&lt;/span>
&lt;a href="#cinc-frontend-services" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Installation and configuration&lt;span class="hx-absolute -hx-mt-20" id="installation-and-configuration">&lt;/span>
&lt;a href="#installation-and-configuration" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Run the omnitruck script to perform initial installation.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -L https://omnitruck.cinc.sh/install.sh &lt;span class="p">|&lt;/span> sudo bash -s -- -P cinc-server&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We can use here for nginx certificates we generated in &lt;code>/etc/cinc-project&lt;/code> or we can have them be auto-generated during install.&lt;/p>
&lt;p>Then using &lt;a href="https://docs.chef.io/server/config_rb_server_optional_settings/" target="_blank" rel="noopener">official docs&lt;/a> we will compose config &lt;code>/etc/cinc-project/cinc-server.rb&lt;/code> for our usecase:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>#PostgreSQL
postgresql[&amp;#39;external&amp;#39;] = true
postgresql[&amp;#39;vip&amp;#39;] = &amp;#39;cinc-postgresql-cluster.example.com&amp;#39;
postgresql[&amp;#39;db_superuser&amp;#39;] = &amp;#39;$user&amp;#39;
postgresql[&amp;#39;db_superuser_password&amp;#39;] = &amp;#39;$pass&amp;#39;
#Opensearch
opensearch[&amp;#39;external&amp;#39;] = true
opensearch[&amp;#39;external_url&amp;#39;] = &amp;#39;https://cinc-opensearch-cluster.example.com:9200&amp;#39;
opscode_erchef[&amp;#39;search_auth_username&amp;#39;] = &amp;#39;$user&amp;#39;
opscode_erchef[&amp;#39;search_auth_password&amp;#39;] = &amp;#39;$pass&amp;#39;
opscode_erchef[&amp;#39;search_ssl_verify&amp;#39;] = false
#MinIO
bookshelf[&amp;#39;enable&amp;#39;] = false
bookshelf[&amp;#39;vip&amp;#39;] = &amp;#39;cinc-minio-cluster.example.com&amp;#39;
bookshelf[&amp;#39;external_url&amp;#39;] = &amp;#39;https://example.com&amp;#39;
bookshelf[&amp;#39;access_key_id&amp;#39;] = &amp;#39;$user&amp;#39;
bookshelf[&amp;#39;secret_access_key&amp;#39;] = &amp;#39;$pass&amp;#39;
opscode_erchef[&amp;#39;s3_bucket&amp;#39;] = &amp;#39;cinc-minio-cluster&amp;#39;
#Nginx certificates in case you don&amp;#39;t want to use auto-generated(optional)
nginx[&amp;#39;ssl_certificate&amp;#39;] = &amp;#39;/etc/cinc-project/server.pem&amp;#39;
nginx[&amp;#39;ssl_certificate_key&amp;#39;] = &amp;#39;/etc/cinc-project/server.key&amp;#39;
#Nginx optimizations
nginx[&amp;#39;client_max_body_size&amp;#39;] = &amp;#39;500m&amp;#39;
nginx[&amp;#39;worker_processes&amp;#39;] = 10
nginx[&amp;#39;worker_connections&amp;#39;] = 10240
nginx[&amp;#39;keepalive_requests&amp;#39;] = 200
nginx[&amp;#39;keepalive_timeout&amp;#39;] = &amp;#39;60s&amp;#39;&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then run the command to deploy and configure local services and configure backend services:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cinc-server-ctl reconfigure&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>That will install local services, connect to opensearch and postgresql, create databases, users, indexes etc.&lt;/p>
&lt;p>In case you use your own certificates make sure they are owned by user cinc after this step.&lt;/p>
&lt;p>First frontend node has been added.&lt;/p>
&lt;h3>Add more frontend VM&amp;rsquo;s&lt;span class="hx-absolute -hx-mt-20" id="add-more-frontend-vms">&lt;/span>
&lt;a href="#add-more-frontend-vms" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>In order to bootstrap another frontend node, you will need to first run the omnitruck script on the new node, then after that is done you will need to transfer the following files from bootstrapped node to new node on the same location:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>/etc/cinc-project/cinc-server.rb
/etc/cinc-project/dark_launch_features.json
/etc/cinc-project/pivotal.pem
/etc/cinc-project/pivotal.rb
/etc/cinc-project/private-chef.sh
/etc/cinc-project/private-cinc-secrets.json
/etc/cinc-project/webui_priv.pem
/etc/cinc-project/webui_pub.pem
/var/opt/cinc-project/bootstrapped
/var/opt/cinc-project/upgrades/migration-level&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Then run the &lt;code>cinc-server-ctl reconfigure&lt;/code> and this way it will skip creating users and it will have their credentials and see they are already created. More nodes can be added this way.&lt;/p>
&lt;p>Create balancing for the nodes on Haproxy.&lt;/p>
&lt;h3>Balancing&lt;span class="hx-absolute -hx-mt-20" id="balancing-3">&lt;/span>
&lt;a href="#balancing-3" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>The balancing is very simple as well to configure. You could use directly keepalived or if you want some more logging or traffic manipulation features, haproxy is a very easy software to do this with. I will be using it here as well.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>frontend cinc-server-cluster
mode http
bind 10.0.0.101:443 ssl crt /etc/ssl/haproxy
default_backend cinc-server
backend cinc-server
balance roundrobin
server frontend-1 frontend-1.example.com:443 check ssl verify none
server frontend-2 frontend-1.example.com:443 check ssl verify none&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Conclusion&lt;span class="hx-absolute -hx-mt-20" id="conclusion">&lt;/span>
&lt;a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Additionally you can deploy Prometheus exporters and monitor the whole cluster with Prometheus/Grafana.
You are now ready to create your organization or restore data from existing.
Before uploading cookbooks don&amp;rsquo;t forget to also create buckets in MinIO with proper naming as discussed before.
Your Cinc is now a highly available cluster.
Check out references for additional information.&lt;/p>
&lt;h2>Additional resources&lt;span class="hx-absolute -hx-mt-20" id="additional-resources">&lt;/span>
&lt;a href="#additional-resources" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://min.io/docs/minio/linux/operations/install-deploy-manage/deploy-minio-multi-node-multi-drive.html" target="_blank" rel="noopener">MinIO Multi-Node Multi-Drive&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://opensearch.org/docs/latest/about/" target="_blank" rel="noopener">Opensearch Getting Started&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.crunchydata.com/blog/patroni-etcd-in-high-availability-environments" target="_blank" rel="noopener">PostgreSQL+Patroni+etcd&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.redhat.com/en/blog/keepalived-basics" target="_blank" rel="noopener">Keepalived basics&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://www.haproxy.com/documentation/haproxy-configuration-manual/2-6r1/intro/" target="_blank" rel="noopener">Haproxy Docs&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://docs.chef.io/server/config_rb_server_optional_settings/" target="_blank" rel="noopener">Config.rb optional settings&lt;/a>&lt;/p></description></item><item><title>Migrating from Chef to Cinc</title><link>https://cinc.sh/blog/2024/02/migrating-from-chef-to-cinc/</link><pubDate>Mon, 05 Feb 2024 10:42:00 +1000</pubDate><guid>https://cinc.sh/blog/2024/02/migrating-from-chef-to-cinc/</guid><description>
&lt;h1>Intro&lt;/h1>&lt;p>Many users already in the Chef ecosystem may have reason to migrate from Chef Infra Server to Cinc server. Thankfully, this is a relatively painless process and all cookbooks, users, data bags, roles, environments, etc. can be retained during the migration process. This blog post documents the migration process from Chef Infra Server to Cinc Server in Red Hat Enterprise Linux 8.&lt;/p>
&lt;h1>Cinc Server Setup&lt;/h1>&lt;p>In order to create your new Cinc Server, stand up a new server on your OS of choice by following the steps detailed at &lt;a href="https://cinc.sh/start/server/" target="_blank" rel="noopener">Server Installation&lt;/a>.&lt;/p>
&lt;p>Once the Cinc server has been configured, you must configure the admin user:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>cinc-server-ctl user-create #{username} #{first_name} #{last_name} #{email} #{password} --filename #{output_file_name}&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>for example&amp;hellip;&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>cinc-server-ctl user-create cincadmin cinc admin cincadmin@dev.local thisisasecret --filename /tmp/cincadmin.pem&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h1>Workstation Setup&lt;/h1>&lt;p>Backup / Restore operations are performed via a 3rd machine rather than on the source or destination servers. This machine will be used as a workstation on which Chef object-based backups can be created. I deployed an RHEL8 server for this purpose with enough disk space to store the backup. For reference purposes, our server with 17 users, 63 environments, 481 roles, and 539 cookbooks (each with many versions) consumed 9.2GB for the backup. This is a relatively small environment - others may require far more storage to create the backup.&lt;/p>
&lt;p>After deployment of the workstation, the following tasks were completed:&lt;/p>
&lt;h2>Install Cinc Workstation, knife-ec-backup, knife-tidy, and pre-reqs&lt;span class="hx-absolute -hx-mt-20" id="install-cinc-workstation-knife-ec-backup-knife-tidy-and-pre-reqs">&lt;/span>
&lt;a href="#install-cinc-workstation-knife-ec-backup-knife-tidy-and-pre-reqs" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Use the commands below to install the required tools:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>curl -L https://omnitruck.cinc.sh/install.sh | sudo bash -s -- -P cinc-workstation -v 22
sudo yum -y install gcc postgresql-devel
chef gem install knife-ec-backup
chef gem install knife-tidy&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>The following files were then created on the server:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code># /chef_backups/conf/knife_src_server.rb (Source Server Knife Config)
log_level :info
log_location STDOUT
client_key &amp;#39;/chef_backups/conf/knife_src.pem&amp;#39;
chef_server_url &amp;#39;https://chef.domain.local&amp;#39;
node_name &amp;#39;berks&amp;#39;&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code># /chef_backups/conf/knife_dst_server.rb (Destination Server Knife Config)
log_level :info
log_location STDOUT
client_key &amp;#39;/chef_backups/conf/knife_dst.pem&amp;#39;
chef_server_url &amp;#39;https://cinc.domain.local&amp;#39;
node_name &amp;#39;cincadmin&amp;#39;
ssl_verify_mode :verify_none&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Copy the Destination Server client_key&lt;span class="hx-absolute -hx-mt-20" id="copy-the-destination-server-client_key">&lt;/span>
&lt;a href="#copy-the-destination-server-client_key" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Copy &lt;code>/tmp/cincadmin.pem&lt;/code> from the Cinc Server to &lt;code>/chef_backups/conf/knife_dst.pem&lt;/code> on the Workstation.&lt;/p>
&lt;h3>Copy the Source Server WebUI Private Key&lt;span class="hx-absolute -hx-mt-20" id="copy-the-source-server-webui-private-key">&lt;/span>
&lt;a href="#copy-the-source-server-webui-private-key" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Copy &lt;code>/etc/opscode/webui_priv.pem&lt;/code> from the source Chef Infra Server to &lt;code>/chef_backups/conf/webui_priv_src.pem&lt;/code> on the Workstation.&lt;/p>
&lt;h3>Destination Server WebUI Private Key&lt;span class="hx-absolute -hx-mt-20" id="destination-server-webui-private-key">&lt;/span>
&lt;a href="#destination-server-webui-private-key" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Copy &lt;code>/etc/cinc-project/webui_priv.pem&lt;/code> from the destination Chef Infra Server to &lt;code>/chef_backups/conf/webui_priv_dst.pem&lt;/code> on the Workstation.&lt;/p>
&lt;h3>Source Certificate Trust&lt;span class="hx-absolute -hx-mt-20" id="source-certificate-trust">&lt;/span>
&lt;a href="#source-certificate-trust" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Run the following command to trust SSL certificates for the source Chef server. &lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>knife ssl -c knife_src_server.rb fetch&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>I was not able to do this for the destination server in my environment since it was configured to use the same FQDN as my source server and DNS was still pointing at the source server. If you are in the same position, then SSL checks for the destination server can be disabled in &lt;code>/chef_backups/conf/knife_dst_server.rb&lt;/code> by setting &lt;code>ssl_verify_mode&lt;/code> to &lt;code>:verify_none&lt;/code>.&lt;/p>
&lt;h1>Backing Up Chef Infra Server&lt;/h1>&lt;p>OK, assuming everything above has gone well, it is now time to backup your Chef server! From your Workstation, run the command below to start the backup:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>knife ec -c /chef_backups/conf/knife_src_server.rb backup /chef_backups/ --webui-key /chef_backups/conf/webui_priv_src.pem --concurrency 10&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Set concurrency to whatever your source server can handle. I have seen some people recommend 5, but we had enough overhead to go with 10 and honestly, I could have probably gone higher. This took several hours the first time. Subsequent backup runs seem to capture the deltas and took 30-45 mins each time.&lt;/p>
&lt;h1>Knife Tidy&lt;/h1>&lt;p>Theoretically, you should be able to use &lt;code>knife tidy&lt;/code> at this point to remove unused cookbook versions, clients, etc, however this didn&amp;rsquo;t work in my testing and frankly, I didn&amp;rsquo;t feel comfortable doing this at the same time as the server migration. See the &lt;a href="https://github.com/chef/knife-tidy" target="_blank" rel="noopener">knife-tidy&lt;/a> git repo for more information on this utility.&lt;/p>
&lt;h1>Data Restoration&lt;/h1>&lt;p>Once the backup is done, run the following command to perform a dry-run of the backup to the destination server.  The dry-run will still create the Chef Organization on the destination server, but will not copy nodes, clients, roles, environments, acls, cookbooks, etc.&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>knife ec -c /chef_backups/conf/knife_dst_server.rb restore /chef_backups/ --webui-key /chef_backups/conf/webui_priv_dst.pem --dry-run&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Once that has been done, run the following command on the destination Cinc server to associate the &lt;code>cincadmin&lt;/code> user with the newly created organization:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>cinc-server-ctl org-user-add myOrgName cincadmin&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now you can restore the data to the destination server:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>knife ec -c /chef_backups/conf/knife_dst_server.rb restore /chef_backups/ --webui-key /chef_backups/conf/webui_priv_dst.pem&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h1>Local Testing&lt;/h1>&lt;p>Cinc offers a build in method for running automated tests against the server.  The following was done on the Cinc server:&lt;/p>
&lt;ol>
&lt;li>If DNS does not yet resolve the intended FQDN to the IP address of the Cinc server, then update &lt;code>/etc/hosts&lt;/code> so that your desired FQDN resolves to the IP address of the Cinc server.&lt;/li>
&lt;li>Run &lt;code>cinc-server-ctl test&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>The following output was observed:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>Pending: (Failures listed here are expected and do not affect your suite&amp;#39;s status)
1) opscode-account user association user not in org can be invited to the org by an admin when the inviting admin is removed from the org, invites issued by that admin cannot be accepted
# Known failure: passes w/ 200 b/c no USAG cleanup performed for deleted user
# ./spec/api/account/account_association_spec.rb:662
2) opscode-account user association user not in org can be invited to the org by an admin when the inviting admin is removed from the system, invites issued by that admin can&amp;#39;t by accepted
# Known failure: passes w/ 200 b/c no USAG or other group cleanup performed for deleted user
# ./spec/api/account/account_association_spec.rb:671
Finished in 54.85 seconds (files took 3.85 seconds to load)
173 examples, 0 failures, 2 pending&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>In our case, I built our new Cinc server using a cookbook on our Chef server, so I was able to run &lt;code>chef-client&lt;/code> on the Cinc server to ensure that the server was able to execute a Chef client run against itself (remember, we previously updated &lt;code>/etc/hosts&lt;/code> to make this possible).&lt;/p>
&lt;h1>Remote Testing&lt;/h1>&lt;p>The following remote tests were performed to ensure other existing clients were able to connect and execute their Chef runs against the Cinc server&amp;hellip;&lt;/p>
&lt;ol>
&lt;li>If necessary, update &lt;code>/etc/hosts&lt;/code> on an existing machine so that the FQDN of the Cinc server resolves to the IP address of the Cinc server.&lt;/li>
&lt;li>If the FQDN of your Cinc server is different than that of the existing Chef server, then update client.rb and knife.rb accordingly.&lt;/li>
&lt;li>Run chef-client&lt;/li>
&lt;li>Run the following to ensure the Cinc server saw the test client run:  &lt;code>knife status --run-list&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>To ensure our pipelines for Roles, Environments, Cookbooks, etc were still working, I temporarily modified the jobs to update &lt;code>/etc/hosts&lt;/code> so that chef.domain.local resolved to the Cinc server IP, and then executed each job to ensure they were successfully able to create and update their respective objects.&lt;/p>
&lt;p>I then executed &lt;code>knife&lt;/code> commands with the option &lt;code>-c /chef_backups/conf/knife_dst_server.rb&lt;/code> to ensure I could see the updates on the destination Cinc server.&lt;/p>
&lt;p>For example&amp;hellip;&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code># knife role show myUpdatedRole -c /chef_backups/conf/knife_dst_server.rb
# knife cookbook show myUpdatedCookbook -c /chef_backups/conf/knife_dst_server.rb
# knife environment show myUpdatedEnvironment -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h1>Examining the New Environment&lt;/h1>&lt;p>The following commands can be used to examine the new environment and ensure it matches the source environment. If you receive errors regarding the &lt;code>cincadmin&lt;/code> user not having access to the org, just re-run the following command on the destination server:&lt;/p>
&lt;p>&lt;code>cinc-server-ctl org-user-add orgName cincadmin&lt;/code>&lt;/p>
&lt;h3>List all cookbooks (and versions)&lt;span class="hx-absolute -hx-mt-20" id="list-all-cookbooks-and-versions">&lt;/span>
&lt;a href="#list-all-cookbooks-and-versions" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>knife cookbook list -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/p>
&lt;h3>List all nodes&lt;span class="hx-absolute -hx-mt-20" id="list-all-nodes">&lt;/span>
&lt;a href="#list-all-nodes" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>knife node list -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/p>
&lt;h3>Show details for a single node&lt;span class="hx-absolute -hx-mt-20" id="show-details-for-a-single-node">&lt;/span>
&lt;a href="#show-details-for-a-single-node" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>knife node show myNodeName -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/p>
&lt;h3>List all nodes and their last checkin date&lt;span class="hx-absolute -hx-mt-20" id="list-all-nodes-and-their-last-checkin-date">&lt;/span>
&lt;a href="#list-all-nodes-and-their-last-checkin-date" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>knife status -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/p>
&lt;h3>Get last checkin date for a specific node&lt;span class="hx-absolute -hx-mt-20" id="get-last-checkin-date-for-a-specific-node">&lt;/span>
&lt;a href="#get-last-checkin-date-for-a-specific-node" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>&lt;code>knife status &amp;quot;hostname:anyExistingServerName&amp;quot; -c /chef_backups/conf/knife_dst_server.rb&lt;/code>&lt;/p>
&lt;h1>Node Migration&lt;/h1>&lt;p>Migrating nodes is a simple operation since the newly built server has retained client keys for each node.  If the new Cinc server has the same FQDN as the Chef server that it is replacing then all that needs to be done is a DNS update so that the FQDN now resolved to the IP address of the Cinc server. If the Cinc server has a new FQDN, then you must update client.rb and knife.rb on each client machine to perform the migration.&lt;/p>
&lt;h1>References&lt;/h1>&lt;p>See the following links for more information on the above process:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.chef.io/blog/migrating-chef-server-knife-ec-backup-knife-tidy" target="_blank" rel="noopener">https://www.chef.io/blog/migrating-chef-server-knife-ec-backup-knife-tidy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://jeremymv2.github.io/chef-ha-migration/" target="_blank" rel="noopener">https://jeremymv2.github.io/chef-ha-migration/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/chef/knife-ec-backup" target="_blank" rel="noopener">https://github.com/chef/knife-ec-backup&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/chef/knife-tidy" target="_blank" rel="noopener">https://github.com/chef/knife-tidy&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.chef.io/workstation/knife/" target="_blank" rel="noopener">https://docs.chef.io/workstation/knife/&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Free products</title><link>https://cinc.sh/blog/2023/11/free-products/</link><pubDate>Thu, 02 Nov 2023 21:48:55 -0400</pubDate><guid>https://cinc.sh/blog/2023/11/free-products/</guid><description>
&lt;p>Here’s the short list of changes people migrating solutions can expect to look into (updated 2023-11-02):&lt;/p>
&lt;ul>
&lt;li>Chef Infra™ client –&amp;gt; Cinc-client&lt;/li>
&lt;li>Chef Infra™ server –&amp;gt; Cinc-server or Goiardi&lt;/li>
&lt;li>Chef Inspec™ –&amp;gt; Cinc-auditor&lt;/li>
&lt;li>Chef Habitat™ –&amp;gt; see Cinc-project friends biome.sh
&lt;ul>
&lt;li>Cinc’s own Habitat distro is considered low priority by the project in the presence of such a great alternative.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Chef Workstation –&amp;gt; Cinc-Workstation&lt;/li>
&lt;li>Chef Automate -&amp;gt; Looking for contributors to help building it.
&lt;ul>
&lt;li>Alternative to get an overview of a cinc server: &lt;a href="https://github.com/drewhammond/chefbrowser" target="_blank" rel="noopener">chefbrowser&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Cinc Server is now Stable</title><link>https://cinc.sh/blog/2022/04/cinc-server-is-now-stable/</link><pubDate>Wed, 20 Apr 2022 14:07:31 -0700</pubDate><guid>https://cinc.sh/blog/2022/04/cinc-server-is-now-stable/</guid><description>
&lt;p>Thanks to our various contributors, we are excited to announce that Cinc Server
14.14.1 is the first release that is now considered stable! You can find additional information on how to install and
use Cinc Server &lt;a href="https://cinc.sh/start/server" >here&lt;/a>.&lt;/p></description></item><item><title>Cinc and Kitchen Dokken</title><link>https://cinc.sh/blog/2021/12/cinc-and-kitchen-dokken/</link><pubDate>Wed, 01 Dec 2021 14:44:33 +0800</pubDate><guid>https://cinc.sh/blog/2021/12/cinc-and-kitchen-dokken/</guid><description>
&lt;h1>Why use Kitchen Dokken?&lt;/h1>&lt;p>In a word, &lt;em>speed&lt;/em>. The kitchen-dokken plugin is designed to make testing your Cinc/Chef code as fast as possible. As you can probably determine from the name, the plugin uses containers to speed up the process, both for the OS being provisioned and for the Cinc/Chef client.&lt;/p>
&lt;p>There are of course some trade-offs required to achieve this speed, firstly the plugin is Chef/Cinc specific (not really an issue if you are reading this!). Second, the OS containers are not like for like when compared to a full VM installation, so there may be some things you can&amp;rsquo;t test properly in the container.&lt;/p>
&lt;p>You can read more about the project here: &lt;a href="https://github.com/test-kitchen/kitchen-dokken" target="_blank" rel="noopener">https://github.com/test-kitchen/kitchen-dokken&lt;/a>&lt;/p>
&lt;h1>Configuring Kitchen Dokken for Cinc&lt;/h1>&lt;p>Configuring Test Kitchen to work with Cinc was covered in the &lt;a href="../cooking_with_cinc/" >Cooking with Cinc&lt;/a> post, here just the provisioner needed to updated to get it to work. For kitchen-dokken however, we will also need to update the driver as this references the client container to use.&lt;/p>
&lt;p>The basic configuration for Dokken when using Chef is:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">transport&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">verifier&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inspec&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">platforms&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rockylinux-8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken/rockylinux-8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">suites&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run_list&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">recipe[testing::default]&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>To change the client container that&amp;rsquo;s used, we need to update both the image and the tag that are pulled. As an example to use the latest &lt;code>17&lt;/code> version of the official Cinc container we would change the driver section to be:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cincproject/cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">17&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Next we need to update the provisioner so that it knows how to run the Cinc client. This differs from the settings used in &lt;a href="..cooking_with_cinc" >Cooking with Cinc&lt;/a> in that the client is not downloaded as part of the provisioner any more, that was handled by the driver in this case, so we just need to update the product and client binary names:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">product_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_binary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/opt/cinc/bin/cinc-client&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And that&amp;rsquo;s it! Our completed example now looks like this:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cincproject/cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">17&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">transport&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">product_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_binary&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/opt/cinc/bin/cinc-client&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">verifier&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inspec&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">platforms&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rockylinux-8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">driver&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">dokken/rockylinux-8&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">suites&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">default&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run_list&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">recipe[testing::default]&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Running &lt;code>kitchen converge&lt;/code> will pull any missing containers the first time it&amp;rsquo;s run and from then on will be considerably faster.&lt;/p></description></item><item><title>Breaking changes for redistributors</title><link>https://cinc.sh/blog/2020/05/breaking-changes-for-redistributors/</link><pubDate>Sun, 10 May 2020 12:41:55 -0400</pubDate><guid>https://cinc.sh/blog/2020/05/breaking-changes-for-redistributors/</guid><description>
&lt;h2>The short version&lt;span class="hx-absolute -hx-mt-20" id="the-short-version">&lt;/span>
&lt;a href="#the-short-version" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>This blog post is intended specifically for other folks that are building their own distributions of Chef Software&amp;rsquo;s product, and folks leveraging the tip from my &lt;a href="https://cinc.sh/blog/2020/01/cooking-with-cinc/" >previous blog&lt;/a> in their cookbooks.&lt;/p>
&lt;p>We&amp;rsquo;re preparing to completely rewrite the current implementation of &lt;code>dist.rb&lt;/code> in both &lt;a href="https://github.com/chef/chef" target="_blank" rel="noopener">Chef Infra&lt;/a> and &lt;a href="https://github.com/inspec/inspec" target="_blank" rel="noopener">Chef Inspec&lt;/a>. The short version is that we&amp;rsquo;re moving all the constants like &lt;code>Chef::Dist::PRODUCT&lt;/code> to a new namespace and gem, respectively &lt;code>ChefUtils::Dist&lt;/code> in the &lt;code>chef-utils&lt;/code> gem. By moving dist.rb in there, we can effectively maintain all the trademark constants in a single, central gem.&lt;/p>
&lt;p>Do note this only applies to Ruby-based tools. Go-based tools will continue using the &lt;a href="https://github.com/chef/go-libs/tree/master/distgen" target="_blank" rel="noopener">code generator&lt;/a>.&lt;/p>
&lt;h2>The long version&lt;span class="hx-absolute -hx-mt-20" id="the-long-version">&lt;/span>
&lt;a href="#the-long-version" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>One of the Cinc Project&amp;rsquo;s defined &lt;a href="https://cinc.sh/goals/" >goals&lt;/a> is to make Chef Software Inc&amp;rsquo;s products easily distributable under a configurable name. We&amp;rsquo;ve dubbed the feature simply &amp;ldquo;dist&amp;rdquo; for short. The initial dist implementation was done a little bit haphazardly as both the project and Chef&amp;rsquo;s product teams were exploring this new reality of trademark compliance. When we started, as most projects do, we didn&amp;rsquo;t quite know how this would all turn out.&lt;/p>
&lt;p>As a result, there was a lack of coherence in naming and each repo had it&amp;rsquo;s own implementation of the dist constants that we use to substitute Chef&amp;rsquo;s trademarks. In chef/chef, we even ended up with 2 distinct implementations of dist.rb. In short, it had slowly evolved into something difficult to maintain, both for us as main contributors on the feature and for the maintainers, despite the concept&amp;rsquo;s simplicity.&lt;/p>
&lt;p>&lt;code>chef-utils&lt;/code> is a fairly recent addition to the Chef Infra codebase. While it&amp;rsquo;s source lives in chef/chef, it is a distinct rubygem published alongside &lt;code>chef&lt;/code>. It&amp;rsquo;s intended to be a &amp;ldquo;foundations&amp;rdquo; ruby library use by Chef Software for low level helpers that are common in the ecosystem like &lt;code>.windows?&lt;/code>. That made it the perfect place to unify all our constants.&lt;/p>
&lt;p>Thankfully, we&amp;rsquo;d already done the work of substituting all references in code to trademarks with unique constants. This allowed aggressive strategies in migrating to the new implementation. I used &lt;a href="https://github.com/facebook/codemod" target="_blank" rel="noopener">codemod&lt;/a>, a mass refactor CLI tool, to accomplish this quickly while still getting a human&amp;rsquo;s attention on each change.&lt;/p>
&lt;p>The resulting unified implementation can be seen here: &lt;a href="https://github.com/chef/chef/pull/9834" target="_blank" rel="noopener">https://github.com/chef/chef/pull/9834&lt;/a>&lt;/p>
&lt;p>As I&amp;rsquo;m writing this, that PR is marked as WIP to prevent it being merged before this blog post has a chance to be read by our intended audience. Once we have it merged (That should happen before Chef Infra 16.1 is released upstream), we&amp;rsquo;ll proceed to modifying every other ruby Chef Software repo where we&amp;rsquo;ve implemented dist to use &lt;code>chef-utils&lt;/code>, so be aware that there may be more breaking changes in the dist implementation of other products Cinc redistributes. This should all be confined to a short time span, and we hope this will be the final implementation of dist.&lt;/p>
&lt;p>This of course doesn&amp;rsquo;t mean that we&amp;rsquo;re done with upstream contributions! We still find the occasional wordmark that slipped by, or was erroneously introduced since we first did all this, so we have to remain vigilant.&lt;/p>
&lt;p>I sincerely hope this won&amp;rsquo;t cause any issues for anyone, but if so please visit the PR I linked above and make it known.&lt;/p></description></item><item><title>April 2020 update</title><link>https://cinc.sh/blog/2020/04/april-2020-update/</link><pubDate>Fri, 03 Apr 2020 21:48:55 -0400</pubDate><guid>https://cinc.sh/blog/2020/04/april-2020-update/</guid><description>
&lt;h2>What&amp;rsquo;s new with Cinc?&lt;span class="hx-absolute -hx-mt-20" id="whats-new-with-cinc">&lt;/span>
&lt;a href="#whats-new-with-cinc" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>We&amp;rsquo;ve been busy! Since my last &lt;a href="https://cinc.sh/blog/2020/01/cooking-with-cinc/" >post in january&lt;/a>, the team has not only kept up with releases of Cinc-Client and Cinc-Auditor but also improved many aspects of the project.&lt;/p>
&lt;p>With the release of Chef Infra 16 approaching fast, we&amp;rsquo;ve started getting Cinc-Client 16 builds ready. There&amp;rsquo;s also been significant work on our Cinc-Workstation pipeline, which now outputs artifacts of all but Windows builds, and those are in progress too.&lt;/p>
&lt;p>Our pipelines have been significantly refactored to simplify the way we manage our patching process and allow easily embedding our gems into otherwise standard Omnibus packages. We now use a &lt;code>git merge&lt;/code> based strategy as opposed to maintaining patch files. If you were maintaining your own distribution based on our work you&amp;rsquo;ll want to have a look at the new format for our pipelines.&lt;/p>
&lt;p>You may also notice some improvements on this very website: We have the first implementation of our RSS feed that went live recently. We&amp;rsquo;re interested in feedback on the format and content of the feed. Another less noticeable change is the addition of a robots.txt and sitemap.&lt;/p>
&lt;p>You may also be interested to know that work has begun on Cinc-Server. While there isn&amp;rsquo;t much more to report on that topic yet we have a very motivated contributor who&amp;rsquo;s picked it up and is actively working on it.&lt;/p>
&lt;p>In related news, Cinc-project friend and contributor CT has been hard at work on his own implementation of the Chef Infra™ server API, &lt;a href="http://goiardi.gl" target="_blank" rel="noopener">Goiardi&lt;/a>, in order to address some of the last missing pieces for full Chef Infra™ server 13 compliance.&lt;/p>
&lt;h2>Contributors new and old&lt;span class="hx-absolute -hx-mt-20" id="contributors-new-and-old">&lt;/span>
&lt;a href="#contributors-new-and-old" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Project contributors have changed a bit these past months. Most notably, one of our founding members, Artem Sidorenko, has left the project to pursue some exciting life opportunities. Artem is the man behind Cinc-Auditor, for which he both did the work upstream and created the build pipelines. We can&amp;rsquo;t thank you enough for your deep involvement in the Cinc Project and we wish you all the best!&lt;/p>
&lt;p>We also have a few new faces. We&amp;rsquo;d like to welcome Vern Burton (tarcinil). He brings some much needed Golang skills to the project team, skills that he&amp;rsquo;s already been putting to good use in the repos that constitute the Workstation. He&amp;rsquo;s been working at implementing the &lt;a href="https://github.com/chef/go-libs/tree/master/distgen" target="_blank" rel="noopener">Go code generator&lt;/a> created by Salim Afiune in relevant Workstation projects. Thanks to his contributions we&amp;rsquo;re confident our first release of Cinc-Workstation is just around the corner. Welcome aboard!&lt;/p>
&lt;p>Just arrived in the Chef Community a few weeks ago, we have Josh Gitlin (jgitlin), who&amp;rsquo;s wasted no time and started work on Cinc-Server roughly 5 minutes about hearing about Cinc! Such enthusiasm is more than welcome and we look forward to celebrating the first PRs against the Chef Server repos to implement configurable distribution names. Welcome aboard!&lt;/p>
&lt;p>We&amp;rsquo;re also seeing an increase in traffic on our &lt;a href="https://gitlab.com/cinc-project" target="_blank" rel="noopener">Gitlab&lt;/a>, with small but helpful contributions such as opening issues, providing feedback, helping keep docs up to date, and correcting my horrible grammar and vocabulary on this very blog o.O Free Open Source Software projects live by such small contributions and we encourage everyone reading this to pitch in however they can. Visit the &lt;a href="https://cinc.sh/contributing/" >contributing page&lt;/a> for some ideas of how you can help too.&lt;/p>
&lt;h2>Chef free products EOL&lt;span class="hx-absolute -hx-mt-20" id="chef-free-products-eol">&lt;/span>
&lt;a href="#chef-free-products-eol" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>We knew the day was coming, now it&amp;rsquo;s just around the corner: Unless there&amp;rsquo;s a drastic turn of events, on May 1st 2020 most of Chef&amp;rsquo;s free binaries will have reached end of life and will no longer be receiving updates from Chef Software. This will leave a lot of folks with 2 options: get a commercial agreement with Chef Software, or move to other solutions.&lt;/p>
&lt;p>Cinc being the exact same code, barring trademark related changes, you can confidently migrate to our binaries. Existing automation should continue functioning thanks to our wrappers around the upstream binaries, and so will your muscle memory if you&amp;rsquo;ve been typing &lt;code>chef-client&lt;/code> for a decade. If this statement proves to be inaccurate please open an issue, we&amp;rsquo;ll do our best to address it.&lt;/p>
&lt;p>Here&amp;rsquo;s the short list of changes people migrating solutions can expect to look into:&lt;/p>
&lt;ul>
&lt;li>Chef Infra™ client &amp;ndash;&amp;gt; Cinc-client&lt;/li>
&lt;li>Chef Infra™ server &amp;ndash;&amp;gt; &lt;a href="http://goiardi.gl" target="_blank" rel="noopener">Goiardi&lt;/a>
&lt;ul>
&lt;li>Cinc-server is being worked on&lt;/li>
&lt;li>Chef Server 12 is not actually going EOL yet&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Chef Inspec™ &amp;ndash;&amp;gt; Cinc-auditor&lt;/li>
&lt;li>Chef Habitat™ &amp;ndash;&amp;gt; see Cinc-project friends &lt;a href="https://biome.sh" target="_blank" rel="noopener">biome.sh&lt;/a>
&lt;ul>
&lt;li>Cinc&amp;rsquo;s own Habitat distro is considered low priority by the project in the presence of such a great alternative.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Chef Workstation &amp;ndash;&amp;gt; Cinc-Workstation
&lt;ul>
&lt;li>Experimental builds are available, but currently not compliant with Chef&amp;rsquo;s trademark policy
&lt;ul>
&lt;li>Windows builds have proven to be more difficult and are not currently available, but we&amp;rsquo;re working on it.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Under the Chef EULA, you may still use our workstation for testing purposes, and we&amp;rsquo;d certainly welcome the feedback!&lt;/li>
&lt;li>We&amp;rsquo;re looking for someone with expertise in Rust to contribute. If you want to help come see us on Gitlab or the Chef Community Slack.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2>That&amp;rsquo;s some big updates&lt;span class="hx-absolute -hx-mt-20" id="thats-some-big-updates">&lt;/span>
&lt;a href="#thats-some-big-updates" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Absolutely! As I write this a significant proportion of the world population is in self-imposed quarantine including project members. I can only assume it will take it&amp;rsquo;s toll on our own working pace, but we&amp;rsquo;re not stopping on account of some pandemic. We still hope to have Cinc-Workstation ready for May 1st so no one gets stuck with EOL software.&lt;/p>
&lt;p>This concludes this update. Try out the new RSS feed to get future updates delivered to you.
Take care of yourselves and each other, especially in these strange times.&lt;/p></description></item><item><title>Cooking with Cinc</title><link>https://cinc.sh/blog/2020/01/cooking-with-cinc/</link><pubDate>Tue, 28 Jan 2020 15:31:30 -0500</pubDate><guid>https://cinc.sh/blog/2020/01/cooking-with-cinc/</guid><description>
&lt;h2>So what&amp;rsquo;s cooking?&lt;span class="hx-absolute -hx-mt-20" id="so-whats-cooking">&lt;/span>
&lt;a href="#so-whats-cooking" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>As part of a private project I&amp;rsquo;m looking to deploy a &lt;a href="http://goiardi.gl" target="_blank" rel="noopener">Goiardi&lt;/a> server, and what better way to do so than with Cinc Client? My first stop was, as always, the &lt;a href="https://supermarket.chef.io" target="_blank" rel="noopener">Chef Supermarket&lt;/a>, where one can find excellent cookbooks to feed into Cinc. There I found &lt;a href="https://supermarket.chef.io/cookbooks/goiardi" target="_blank" rel="noopener">this cookbook&lt;/a> by Matt Whiteley.&lt;/p>
&lt;p>It&amp;rsquo;s a little bit dated, but that&amp;rsquo;s an easy issue to solve; We&amp;rsquo;ll update it! The new trend in community cookbooks is to write &amp;lsquo;resource cookbooks&amp;rsquo;, that is cookbooks that define custom resources and libraries but no recipes. I therefor set out to write a custom resource to install and manage a goiardi instance.&lt;/p>
&lt;h2>Cinc + Test Kitchen&lt;span class="hx-absolute -hx-mt-20" id="cinc--test-kitchen">&lt;/span>
&lt;a href="#cinc--test-kitchen" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>After a bit of keyboard smashing I was ready for some kitchen magic. I didn&amp;rsquo;t need any new plugins or gems, just a few lines in my cookbook&amp;rsquo;s &lt;code>kitchen.yml&lt;/code>:&lt;/p>
&lt;p>&lt;strong>Edit&lt;/strong>&lt;/p>
&lt;p>&lt;em>Users of Cinc Workstation will need to use the following syntax:&lt;/em>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">chef_zero&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">product_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">download_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://omnitruck.cinc.sh/install.sh&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;em>Chef Workstation users can continue using the following until such time as Cinc Workstation stable builds are available:&lt;/em>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">chef_zero&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">require_chef_omnibus&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_omnibus_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://omnitruck.cinc.sh/install.sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_omnibus_root&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/opt/cinc&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Using the usual chef-zero provisioner, I simply point kitchen to the Cinc Project&amp;rsquo;s Omnitruck and to the correct folder. Then when I run &lt;code>kitchen test&lt;/code>:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;pre>&lt;code>-----&amp;gt; Installing Chef install only if missing package
Downloading https://omnitruck.cinc.sh/install.sh to file /tmp/install.sh
Trying curl...
Download complete.
el 7 x86_64
Getting information for cinc stable for el...
downloading https://omnitruck.cinc.sh/stable/cinc/metadata?v=&amp;amp;p=el&amp;amp;pv=7&amp;amp;m=x86_64
to file /tmp/install.sh.4088/metadata.txt
[...]
Updating / installing...
1:cinc-15.5.15-1.el7 ################################# [100%]
Symlinking chef-apply command to cinc-wrapper for compatibility...
Symlinking chef-client command to cinc-wrapper for compatibility...
Symlinking chef-shell command to cinc-wrapper for compatibility...
Symlinking chef-solo command to cinc-wrapper for compatibility...
Thank you for installing Cinc Client, the community build based on Chef Infra Client!
Transferring files to &amp;lt;remove-centos-7&amp;gt;
Redirecting to cinc-client...
Starting Cinc Client, version 15.5.15&lt;/code>&lt;/pre>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And now we&amp;rsquo;re testing with Cinc! You&amp;rsquo;ll note there was no license prompt, as you&amp;rsquo;d expect from a free as in freedom
distribution.&lt;/p>
&lt;h2>But now my files are full of lies&lt;span class="hx-absolute -hx-mt-20" id="but-now-my-files-are-full-of-lies">&lt;/span>
&lt;a href="#but-now-my-files-are-full-of-lies" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>One thing I like to do in my &lt;code>file&lt;/code> and &lt;code>template&lt;/code> resources is to add a &amp;ldquo;This is a Chef generated file&amp;rdquo; type disclaimer. But this isn&amp;rsquo;t a Chef generated file, it&amp;rsquo;s a Cinc generated file! If I just put &lt;code>Cinc&lt;/code>, then it shows Cinc to a Chef Infra™ user too. Thankfully that&amp;rsquo;s another easy solve. We can call on the distribution constants implemented by the Cinc Project upstream like so:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ruby" data-lang="ruby">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">require&lt;/span> &lt;span class="s1">&amp;#39;chef/dist&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">file&lt;/span> &lt;span class="s1">&amp;#39;/tmp/a_file&amp;#39;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">content&lt;/span> &lt;span class="s2">&amp;#34;This file was generated by &lt;/span>&lt;span class="si">#{&lt;/span>&lt;span class="no">Chef&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="no">Dist&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="no">PRODUCT&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">action&lt;/span> &lt;span class="ss">:create&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">end&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Now when my cookbook writes &lt;code>/tmp/a_file&lt;/code>, it&amp;rsquo;ll output the name of the product you&amp;rsquo;re using, whether that&amp;rsquo;s Cinc, Chef Infra™ or MyOrgPrivateDistroOfChefInfraClient (please don&amp;rsquo;t name it that, for the sanity of your users o.O ). You can find a complete list of these distribution constants in &lt;a href="https://github.com/chef/chef/blob/master/lib/chef/dist.rb" target="_blank" rel="noopener">https://github.com/chef/chef/blob/master/lib/chef/dist.rb&lt;/a> (don&amp;rsquo;t forget to navigate to the appropriate tag for your version!).&lt;/p>
&lt;p>Do note this is the first implementation of distro constants and unlikely to be the last. While I&amp;rsquo;m excited to share this little trick with you all I also feel I should warn against using it just yet without some sort of safeguard against having a constant pulled from under you. Said safeguard can be as simple as:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ruby" data-lang="ruby">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">require&lt;/span> &lt;span class="s1">&amp;#39;chef/dist&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">product&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="no">Chef&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="no">Dist&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="no">PRODUCT&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="s1">&amp;#39;A Configuration Manager&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">log&lt;/span> &lt;span class="s2">&amp;#34;This log resource is being executed by &lt;/span>&lt;span class="si">#{&lt;/span>&lt;span class="n">product&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Back to my cookbook!&lt;span class="hx-absolute -hx-mt-20" id="back-to-my-cookbook">&lt;/span>
&lt;a href="#back-to-my-cookbook" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>So I wrote a resource called goiardi_install, tested it with Cinc in test-kitchen, and adjusted my templates so they output the correct product name to all the cookbook&amp;rsquo;s users. What&amp;rsquo;s left? Publishing of course! The initial intent was to PR the resources to the &lt;code>goiardi&lt;/code> cookbook but following some discussions on Slack we opted to release it as &lt;a href="https://supermarket.chef.io/cookbooks/cinc-goiardi" target="_blank" rel="noopener">cinc-goiardi&lt;/a> and to officially support it, since we currently recommend Goiardi as a FOSS Chef Infra™ server alternative. With the resources published, I wrote a quick and dirty wrapping recipe:&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-ruby" data-lang="ruby">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Recipe my_goiardi::default&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">goiardi_install&lt;/span> &lt;span class="s1">&amp;#39;goiardi&amp;#39;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">version&lt;/span> &lt;span class="s1">&amp;#39;0.11.10&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">end&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>And voila! We can run that through Chef Infra™ or Cinc Client seamlessly.&lt;/p></description></item><item><title>Cinc Client is live</title><link>https://cinc.sh/blog/2019/12/cinc-client-is-live/</link><pubDate>Wed, 04 Dec 2019 16:05:34 -0500</pubDate><guid>https://cinc.sh/blog/2019/12/cinc-client-is-live/</guid><description>
&lt;h2>The Cinc project is proud to announce the initial release of Cinc Client&lt;span class="hx-absolute -hx-mt-20" id="the-cinc-project-is-proud-to-announce-the-initial-release-of-cinc-client">&lt;/span>
&lt;a href="#the-cinc-project-is-proud-to-announce-the-initial-release-of-cinc-client" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>It&amp;rsquo;s been a long time coming, but the Cinc team is finally ready to announce it&amp;rsquo;s first official release of Cinc Client for Linux. While we have been distributing it for some time, it came with all kinds of disclaimers about compliance with Chef Software&amp;rsquo;s policy on trademarks. No longer!&lt;/p>
&lt;p>Chef Software has reviewed Cinc Client and deemed it compliant with it&amp;rsquo;s policy as reported on Chef&amp;rsquo;s Community Slack. Sadly it&amp;rsquo;s not a paid Slack, so it will eventually vanish in the backlog, so we took a nice screenshot for posterity: &lt;a href="https://gitlab.com/cinc-project/client/issues/10" target="_blank" rel="noopener">https://gitlab.com/cinc-project/client/issues/10&lt;/a>&lt;/p>
&lt;p>A big thanks to the folks at Chef Software for taking the time to review our builds so we can publish them with confidence.&lt;/p>
&lt;h2>GimmeGimme!&lt;span class="hx-absolute -hx-mt-20" id="gimmegimme">&lt;/span>
&lt;a href="#gimmegimme" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Checkout our &lt;a href="https://cinc.sh/docs/" >Installation pages&lt;/a> for some basic instructions, or just jump right in by using our omnitruck implementation &lt;code>curl -L https://omnitruck.cinc.sh/install.sh | sudo bash&lt;/code>&lt;/p>
&lt;p>Prefer plain old packages? We got you covered too! Checkout our &lt;a href="https://cinc.sh/download/" >download&lt;/a> page of skip right ahead to the &lt;a href="http://downloads.cinc.sh/files/stable/cinc/" target="_blank" rel="noopener">latest releases of Cinc Client!&lt;/a>&lt;/p>
&lt;p>Test-kitchen is where you like to try out your new toys? Put this in your kitchen file&amp;rsquo;s &lt;code>provisioner&lt;/code> section:&lt;/p>
&lt;p>&lt;strong>Edit&lt;/strong>&lt;/p>
&lt;p>&lt;em>Cinc Workstation users should use this new syntax:&lt;/em>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">chef_zero&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">product_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">cinc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">download_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://omnitruck.cinc.sh/install.sh&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>&lt;em>Chef Workstation users should continue using the existing syntax until such time as stable Cinc Workstation builds are available:&lt;/em>&lt;/p>
&lt;div class="hextra-code-block hx-relative hx-mt-6 first:hx-mt-0 hx-group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">provisioner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">chef_zero&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">require_chef_omnibus&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_omnibus_url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">https://omnitruck.cinc.sh/install.sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">chef_omnibus_root&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/opt/cinc&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx-opacity-0 hx-transition group-hover/code:hx-opacity-100 hx-flex hx-gap-1 hx-absolute hx-m-[11px] hx-right-0 hx-top-0">
&lt;button
class="hextra-code-copy-btn hx-group/copybtn hx-transition-all active:hx-opacity-50 hx-bg-primary-700/5 hx-border hx-border-black/5 hx-text-gray-600 hover:hx-text-gray-900 hx-rounded-md hx-p-1.5 dark:hx-bg-primary-300/10 dark:hx-border-white/10 dark:hx-text-gray-400 dark:hover:hx-text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon group-[.copied]/copybtn:hx-hidden hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;div class="success-icon hx-hidden group-[.copied]/copybtn:hx-block hx-pointer-events-none hx-h-4 hx-w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>We do not have hart packages available at this time, but it&amp;rsquo;s only a matter of time. If you&amp;rsquo;re in a hurry, as always we welcome &lt;a href="https://cinc.sh/contributing/" >contributions&lt;/a>.&lt;/p>
&lt;h3>What next?&lt;span class="hx-absolute -hx-mt-20" id="what-next">&lt;/span>
&lt;a href="#what-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Work is already well underway to producing a fully compliant Cinc Client for Windows platforms, and we expect a first official release in the near future. In the meantime feel free to &lt;a href="https://cinc.sh/download/" >download&lt;/a> our test builds and provide feedback through &lt;a href="https://cinc.sh/contributing/" >the usual channels&lt;/a>.&lt;/p>
&lt;p>Cinc Auditor is also ready for evaluation and the Cinc project has requested that Chef Software take a look at it too. We already distribute test builds so we can gather feedback from the community, but we do not recommend using them for any commercial purposes at this time.&lt;/p>
&lt;p>Stay tuned to this blog to find out when more binaries get evaluated!&lt;/p></description></item></channel></rss>