<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Geuni's Blog Blog</title>
        <link>https://www.geuni.tech/en/</link>
        <description>Geuni's Blog Blog</description>
        <lastBuildDate>Thu, 13 Feb 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Elasticsearch 8.x Installation and Cluster Setup]]></title>
            <link>https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup</link>
            <guid>https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup</guid>
            <pubDate>Thu, 13 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In this article, we will introduce how to install Elasticsearch(8.17) from a compiled archive (.tar.gz) and set up a cluster.]]></description>
            <content:encoded><![CDATA[<p>Elasticsearch is a real-time, distributed search and analytics engine—a powerful open source tool designed for efficiently storing, searching, and analyzing large volumes of data.</p>
<p>Built on the Apache Lucene library, it is primarily used for full-text search, log analysis, and application monitoring.</p>
<p>In this article, we will introduce how to install Elasticsearch from a compiled archive (.tar.gz) and set up a cluster.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="elasticsearch-installation">Elasticsearch Installation<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#elasticsearch-installation" class="hash-link" aria-label="Direct link to Elasticsearch Installation" title="Direct link to Elasticsearch Installation">​</a></h3>
<p><strong>Installation Environment and Elasticsearch Version</strong></p>
<ul>
<li>OS:  Ubuntu 24.04 LTS</li>
<li>Elasticsearch: 8.17.2</li>
</ul>
<p>For cluster configuration, prepare three virtual machines (VMs) as follows:</p>
<table><thead><tr><th>No.</th><th>host name</th><th>IP</th></tr></thead><tbody><tr><td>#1</td><td>es-node1</td><td>192.168.234.128</td></tr><tr><td>#2</td><td>es-node2</td><td>192.168.234.129</td></tr><tr><td>#3</td><td>es-node3</td><td>192.168.234.130</td></tr></tbody></table>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="download-and-extract-archive">Download and Extract Archive<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#download-and-extract-archive" class="hash-link" aria-label="Direct link to Download and Extract Archive" title="Direct link to Download and Extract Archive">​</a></h4>
<p>First, download the Elasticsearch archive, extract it, and move it to the installation directory.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.2-linux-x86_64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> elasticsearch-8.17.2-linux-x86_64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> elasticsearch-8.17.2 /opt/elasticsearch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> /opt/elasticsearch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="create-user-and-set-permissions">Create User and Set Permissions<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#create-user-and-set-permissions" class="hash-link" aria-label="Direct link to Create User and Set Permissions" title="Direct link to Create User and Set Permissions">​</a></h4>
<p>For security, create a separate user account and change the ownership of the Elasticsearch directory to that user.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> adduser elastic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> elastic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-R</span><span class="token plain"> elastic:elastic /opt/elasticsearch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="systemd-service-configuration">Systemd Service Configuration<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#systemd-service-configuration" class="hash-link" aria-label="Direct link to Systemd Service Configuration" title="Direct link to Systemd Service Configuration">​</a></h4>
<p>Create the <code>/etc/systemd/system/elasticsearch.service</code> file to register Elasticsearch as a service.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/systemd/system/elasticsearch.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">elasticsearch.service</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">Unit</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">Description</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">Elasticsearch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">After</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">network.target</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">Service</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">User</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">elastic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">Group</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">elastic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">ExecStart</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/bin/elasticsearch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">Restart</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">always</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">LimitMEMLOCK</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">infinity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">LimitNOFILE</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">65536</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">Install</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">WantedBy</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">multi-user.target</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl daemon-reload</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="firewall-configuration">Firewall Configuration<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#firewall-configuration" class="hash-link" aria-label="Direct link to Firewall Configuration" title="Direct link to Firewall Configuration">​</a></h4>
<p>Allow the ports used by Elasticsearch and Kibana in the firewall.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9200</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9300</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5601</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--reload</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="elasticsearch-cluster-configuration">Elasticsearch Cluster Configuration<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#elasticsearch-cluster-configuration" class="hash-link" aria-label="Direct link to Elasticsearch Cluster Configuration" title="Direct link to Elasticsearch Cluster Configuration">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="generate--deploy-certificates">Generate &amp; Deploy Certificates<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#generate--deploy-certificates" class="hash-link" aria-label="Direct link to Generate &amp; Deploy Certificates" title="Direct link to Generate &amp; Deploy Certificates">​</a></h4>
<p>To secure inter-node communication, generate SSL/TLS certificates and deploy them to each node:</p>
<p>Generate the CA certificate on one of the nodes:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic ./bin/elasticsearch-certutil ca</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic ./bin/elasticsearch-certutil cert </span><span class="token parameter variable" style="color:#36acaa">--ca</span><span class="token plain"> elastic-stack-ca.p12</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Copy the generated <code>elastic-certificates.p12</code> file to the <code>/opt/elasticsearch/config</code> directory on each node:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic </span><span class="token function" style="color:#d73a49">scp</span><span class="token plain"> elastic-certificates.p12 elastic@192.168.234.129:/opt/elasticsearch/config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic </span><span class="token function" style="color:#d73a49">scp</span><span class="token plain"> elastic-certificates.p12 elastic@192.168.234.130:/opt/elasticsearch/config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> elastic-certificates.p12 config/elastic-certificates.p12</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="configure-elasticsearchyml">Configure elasticsearch.yml<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#configure-elasticsearchyml" class="hash-link" aria-label="Direct link to Configure elasticsearch.yml" title="Direct link to Configure elasticsearch.yml">​</a></h4>
<p>Assign a unique <code>node.nam</code>e for each node and add the necessary cluster settings:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /opt/elasticsearch/config/elasticsearch.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<!-- -->
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">es-node1</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">es-node2</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">es-node3</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">elasticsearch.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">cluster.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">es-cluster</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">node-1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">network.host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">0.0.0.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.logs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># List of cluster node IPs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">discovery.seed_hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["192.168.234.128", "192.168.234.129","192.168.234.130"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Specify master-eligible nodes for initial cluster formation (remove or comment out after initial setup)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">cluster.initial_master_nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["node-1", "node-2","node-3"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># SSL/TLS settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.verification_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">certificate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.client_authentication</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">required</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.keystore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.truststore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">elasticsearch.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">cluster.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">es-cluster</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">node-2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">network.host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">0.0.0.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.logs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># List of cluster node IPs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">discovery.seed_hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["192.168.234.128", "192.168.234.129","192.168.234.130"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Specify master-eligible nodes for initial cluster formation (remove or comment out after initial setup)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">cluster.initial_master_nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["node-1", "node-2","node-3"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># SSL/TLS settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.verification_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">certificate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.client_authentication</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">required</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.keystore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.truststore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">elasticsearch.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">cluster.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">es-cluster</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">node-3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">network.host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">0.0.0.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">path.logs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">/opt/elasticsearch/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># List of cluster node IPs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">discovery.seed_hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["192.168.234.128", "192.168.234.129","192.168.234.130"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Specify master-eligible nodes for initial cluster formation (remove or comment out after initial setup)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">cluster.initial_master_nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["node-1", "node-2","node-3"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># SSL/TLS settings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.verification_mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">certificate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.client_authentication</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">required</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.keystore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">xpack.security.transport.ssl.truststore.path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">elastic-certificates.p12</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<blockquote>
<p><strong>Note:</strong> The <code>cluster.initial_master_nodes</code> setting is only necessary during the initial cluster formation. After the cluster is established, this setting should be removed or commented out. (Refer to <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-bootstrap-cluster.html" target="_blank" rel="noopener noreferrer">Bootstrapping a cluster</a>)</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="start-cluster-and-verify">Start Cluster and Verify<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#start-cluster-and-verify" class="hash-link" aria-label="Direct link to Start Cluster and Verify" title="Direct link to Start Cluster and Verify">​</a></h4>
<p>Start the Elasticsearch service on each node and then verify the cluster status.</p>
<p>Start the service:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl start elasticsearch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Reset the password for the <code>elastic</code> account:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> bin/elasticsearch-reset-password </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic </span><span class="token parameter variable" style="color:#36acaa">-i</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Check the node status:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic:your_pass http://192.168.234.128:9200/_cat/nodes?v</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ip              heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">192.168.234.130           19          89  88    1.30    0.80     0.37 cdfhilmrstw -      node-3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">192.168.234.129           24          89   9    0.29    0.17     0.13 cdfhilmrstw -      node-2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">192.168.234.128           10          90  17    0.00    0.00     0.00 cdfhilmrstw *      node-1</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Check the cluster health:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> elastic:your_pass http://192.168.234.128:9200/_cluster/health?pretty</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"cluster_name"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"es-cluster"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"green"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"timed_out"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_nodes"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_data_nodes"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_primary_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"relocating_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"initializing_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"unassigned_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"unassigned_primary_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"delayed_unassigned_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_pending_tasks"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_in_flight_fetch"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"task_max_waiting_in_queue_millis"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_shards_percent_as_number"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100.0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="kibana-integration">Kibana Integration<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#kibana-integration" class="hash-link" aria-label="Direct link to Kibana Integration" title="Direct link to Kibana Integration">​</a></h3>
<p>For security reasons, the <code>elastic</code> account cannot be used with Kibana; instead, the built-in <code>kibana_system</code> account is utilized.</p>
<p>Reset the password for the <code>kibana_system</code> account:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /opt/elasticsearch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> bin/elasticsearch-reset-password </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> kibana_system </span><span class="token parameter variable" style="color:#36acaa">-i</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="install-kibana">Install Kibana<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#install-kibana" class="hash-link" aria-label="Direct link to Install Kibana" title="Direct link to Install Kibana">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://artifacts.elastic.co/downloads/kibana/kibana-8.17.2-linux-x86_64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzf</span><span class="token plain"> kibana-8.17.2-linux-x86_64.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> kibana-8.17.2 /opt/kibana</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="configure-kibanayml">Configure kibana.yml<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#configure-kibanayml" class="hash-link" aria-label="Direct link to Configure kibana.yml" title="Direct link to Configure kibana.yml">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /opt/kibana/config/kibana.yml </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">kibana.yml</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">server.port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">5601</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">"0.0.0.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">elasticsearch.hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">["http://192.168.234.128:9200","http://192.168.234.129:9200","http://192.168.234.130:9200"]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">elasticsearch.username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">"kibana_system"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">elasticsearch.password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">"your_pass"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="kibana-startup">Kibana Startup<a href="https://www.geuni.tech/en/elasticsearch-install-cluster-kibana-setup#kibana-startup" class="hash-link" aria-label="Direct link to Kibana Startup" title="Direct link to Kibana Startup">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /opt/kibana</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">nohup</span><span class="token plain"> bin/kibana </span><span class="token operator" style="color:#393A34">&amp;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Now, access <a href="http://192.168.234.128:5601/" target="_blank" rel="noopener noreferrer">http://192.168.234.128:5601</a> (or the IP address of the node where Kibana is installed) in a web browser and log in with the <code>elastic</code> account.</p>
<img src="https://www.geuni.tech/img/post/kibana-login.png" alt="Kibana Login" style="zoom:60%">
<p>Today, we introduced a simple way to install Elasticsearch and Kibana and set up a cluster.</p>
<p>The archive installation method is easy to install and manage, making it useful in various environments. Hope you find it helpful.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Free Cursor AI Alternative: VS Code + DeepSeek R1 + Ollama Setup]]></title>
            <link>https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup</link>
            <guid>https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup</guid>
            <pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Replace Cursor AI for free with VS Code, Deepseek R1, and Ollama! Learn how to set up the Cline extension and run Deepseek R1 locally. Experience AI coding without the monthly fees!]]></description>
            <content:encoded><![CDATA[<p>Among the subscription-based AI coding assistants, tools like Cursor, Windsurf, and GitHub Copilot are truly excellent. However, the monthly subscription fees can be a burden.</p>
<p>Today, I’m sharing how to use an AI editor for free by combining the VS Code <code>Cline</code> extension with <code>ollama</code> and <code>DeepSeek R1</code>.</p>
<p><code>Cline</code> is an open-source AI coding assistant extension available for VS Code. It offers a variety of features that help with user commands and code generation, significantly boosting development productivity.</p>
<p>Other VS Code extensions offering similar functionalities include <code>Continue</code> and <code>Roo Code</code>. All of these are fairly well-tested tools with active communities.</p>
<p>Their basic setup procedures do not differ much, so you can choose the program that best suits your personal workflow. Note that Cline does not have a tab auto-completion feature, so combining Cline with Continue is also an option.</p>
<p>According to the token usage rankings on <a href="https://openrouter.ai/" target="_blank" rel="noopener noreferrer">openrouter.ai</a> , the token usage for Cline and Roo Code far exceeds that of others.</p>
<img src="https://www.geuni.tech/img/post/openrouter-ai.png" alt="openrouter-ai, token usage rankings" style="zoom:70%">
<p><strong>Cline</strong>,</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=saoudrizwan.claude-dev" target="_blank" rel="noopener noreferrer">VS Code Marketplace</a></li>
<li><a href="https://github.com/cline/cline" target="_blank" rel="noopener noreferrer">Github (26.4k Stars)</a></li>
</ul>
<p><strong>Continue</strong></p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" target="_blank" rel="noopener noreferrer">VS Code Marketplace</a></li>
<li><a href="https://github.com/continuedev/continue" target="_blank" rel="noopener noreferrer">Github (22.3k Stars)</a></li>
</ul>
<p><strong>Roo Code (prev. Roo Cline)</strong></p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=RooVeterinaryInc.roo-cline" target="_blank" rel="noopener noreferrer">VS Code Marketplace</a></li>
<li><a href="https://github.com/RooVetGit/Roo-Code" target="_blank" rel="noopener noreferrer">Github (4.9k Stars)</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-deepseek-r1-locally">Running DeepSeek R1 Locally<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#running-deepseek-r1-locally" class="hash-link" aria-label="Direct link to Running DeepSeek R1 Locally" title="Direct link to Running DeepSeek R1 Locally">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="why-run-locally">Why Run Locally?<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#why-run-locally" class="hash-link" aria-label="Direct link to Why Run Locally?" title="Direct link to Why Run Locally?">​</a></h4>
<ul>
<li><strong>Free and Low-Cost Operation:</strong> While Cursor AI incurs a monthly fee, Cline is available as open source and DeepSeek R1 can be run locally, allowing you to leverage powerful AI assistance without additional costs.</li>
<li><strong>Data Security:</strong> All AI computations occur on your local machine, ensuring that your code and related data are not transmitted to external servers, which greatly enhances privacy and security.</li>
<li><strong>Faster Response Times:</strong> Since DeepSeek R1 runs directly on your hardware, you avoid network latency and can expect lower delay compared to API call methods.</li>
</ul>
<p>However, note that lightweight distilled models for local execution do not perform as well as full-parameter API models. For most developers, using an API platform—especially for non-English languages like Korean—might still be more practical. Running AI models locally should be approached with an experimental mindset.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="installing-ollama">Installing Ollama<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#installing-ollama" class="hash-link" aria-label="Direct link to Installing Ollama" title="Direct link to Installing Ollama">​</a></h4>
<p>Ollama is a tool that makes it easy to run large language models like DeepSeek R1 locally.</p>
<ul>
<li>Download and install Ollama from the <a href="https://ollama.com/download" target="_blank" rel="noopener noreferrer">Ollama official website</a>.</li>
</ul>
<img src="https://www.geuni.tech/img/post/ollama-download.png" alt="ollama download" style="zoom:70%">
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="downloading-the-desired-deepseek-r1-model">Downloading the Desired DeepSeek R1 Model<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#downloading-the-desired-deepseek-r1-model" class="hash-link" aria-label="Direct link to Downloading the Desired DeepSeek R1 Model" title="Direct link to Downloading the Desired DeepSeek R1 Model">​</a></h4>
<p>Choose and download the model that suits your PC’s specifications.</p>
<p>For example, for the 7B model:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># https://ollama.com/library/deepseek-r1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ollama run deepseek-r1:1.5b</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ollama run deepseek-r1:7b</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ollama run deepseek-r1:8b</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ollama run deepseek-r1:14b</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ollama run deepseek-r1:32b</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ollama run deepseek-r1:70b</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Once the model download is complete, it will automatically run locally.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pulling manifest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pulling 96c415656d37... 100% ▕████████████████████████████████████████████████████████▏ 4.7 GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pulling 369ca498f347... 100% ▕████████████████████████████████████████████████████████▏  387 B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pulling 6e4c38e1172f... 100% ▕████████████████████████████████████████████████████████▏ 1.1 KB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pulling f4d24e9138dd... 100% ▕████████████████████████████████████████████████████████▏  148 B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pulling 40fb844194b2... 100% ▕████████████████████████████████████████████████████████▏  487 B</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">verifying sha256 digest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">writing manifest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">success</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt; hello?</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;think&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/think&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Hello! How can I assist you today? 😊</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>You can access the locally running model at <a href="http://localhost:11434/" target="_blank" rel="noopener noreferrer">http://localhost:11434</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-and-cline-setup">VS Code and Cline Setup<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#vs-code-and-cline-setup" class="hash-link" aria-label="Direct link to VS Code and Cline Setup" title="Direct link to VS Code and Cline Setup">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="installing-the-vs-code-extension">Installing the VS Code Extension<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#installing-the-vs-code-extension" class="hash-link" aria-label="Direct link to Installing the VS Code Extension" title="Direct link to Installing the VS Code Extension">​</a></h4>
<p>Search for <code>Cline</code> in the VS Code Marketplace and install it.</p>
<img src="https://www.geuni.tech/img/post/vs-code-cline.png" alt="Vs code, Cline Installation" style="zoom:40%">
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="connecting-cline-to-ollama-local-deepseek-r1">Connecting Cline to Ollama (Local DeepSeek R1)<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#connecting-cline-to-ollama-local-deepseek-r1" class="hash-link" aria-label="Direct link to Connecting Cline to Ollama (Local DeepSeek R1)" title="Direct link to Connecting Cline to Ollama (Local DeepSeek R1)">​</a></h4>
<ul>
<li>Open Cline settings in VS Code.</li>
<li>Select <code>Ollama</code> from the API Provider list.</li>
<li>Enter <a href="http://localhost:11434/" target="_blank" rel="noopener noreferrer">http://localhost:11434</a> in the <code>Base URL</code> field and select the running DeepSeek R1 model (e.g., <code>deepseek-r1:14b</code>) from the model selection dropdown.</li>
</ul>
<blockquote>
<p>After successful local deployment of the DeepSeek model, a model selection window will automatically appear below the Model ID after entering the <code>Base URL</code>.</p>
</blockquote>
<img src="https://www.geuni.tech/img/post/vs-code-cline-settings.png" alt="Vs code, Cline 설정" style="zoom:70%">
<blockquote>
<p>If you encounter an <code>MCP hub not available</code> error after sending a message, restarting VS Code should resolve the issue. <a href="https://github.com/cline/cline/issues/969" target="_blank" rel="noopener noreferrer">Reference GitHub Issue</a></p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="testing">Testing<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#testing" class="hash-link" aria-label="Direct link to Testing" title="Direct link to Testing">​</a></h4>
<p>Once setup is complete, test Cline by entering a prompt to confirm that it responds correctly.</p>
<p>If, after entering a prompt, your CPU is working at full throttle with a very slow or even no response, it indicates that your PC’s specifications might be insufficient for running that model. In such cases, we recommend testing with a lower model version.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="api-integration-method">API Integration Method<a href="https://www.geuni.tech/en/deepseek-r1-ollama-vscode-setup#api-integration-method" class="hash-link" aria-label="Direct link to API Integration Method" title="Direct link to API Integration Method">​</a></h4>
<ul>
<li>Obtain a DeepSeek API key from the <a href="https://platform.deepseek.com/api_keys" target="_blank" rel="noopener noreferrer">DeepSeek official website</a>.</li>
<li>Open Cline settings in VS Code, select <code>DeepSeek</code> from the API Provider list, enter your <code>API Key</code>, and select the model <code>deepseek-reasoner</code>.</li>
</ul>
<img src="https://www.geuni.tech/img/post/vs-code-cline-settings-deepseek.png" alt="Vs code, Cline DeepSeek설정" style="zoom:70%">
<p>Now, you too can experience AI coding assistance at the level of Cursor—all for $0 a month! If you encounter any issues during setup, refer to the official Ollama documentation or the Cline GitHub issues page for help.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Creating a Chatbot by Integrating Spring AI and DeepSeek]]></title>
            <link>https://www.geuni.tech/en/spring-ai-with-deepseek</link>
            <guid>https://www.geuni.tech/en/spring-ai-with-deepseek</guid>
            <pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[This article introduces how to integrate DeepSeek API using Spring AI and implement a simple AI chatbot.]]></description>
            <content:encoded><![CDATA[<p>Recently, Chinese AI startup <strong>DeepSeek</strong> has shocked the global AI community with its high-performance language models.</p>
<p>Particularly, DeepSeek R1 demonstrates performance comparable to OpenAI while causing market disruption through its cost-effective pricing and open-source distribution strategy.</p>
<p>In this article, we will explore how to integrate DeepSeek API with Spring AI in the simplest way possible and build a basic AI chatbot.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-ai-a-powerful-tool-for-ai-integration">Spring AI: A Powerful Tool for AI Integration<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#spring-ai-a-powerful-tool-for-ai-integration" class="hash-link" aria-label="Direct link to Spring AI: A Powerful Tool for AI Integration" title="Direct link to Spring AI: A Powerful Tool for AI Integration">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Spring AI, Integration diagram" src="https://www.geuni.tech/en/assets/images/spring-ai-integration-diagram-15efbf8cf671e5905e96b462ea5acdbf.svg" width="456" height="301" class="img_ev3q"></p>
<p>Spring AI is a project designed to integrate generative AI capabilities into the Spring ecosystem, making it easier for developers to incorporate AI models into their applications.</p>
<p>Key Features of Spring AI:</p>
<ol>
<li><strong>Standardized API:</strong> Provides a consistent interface for various AI providers (Anthropic, OpenAI, Microsoft, Amazon, Google, Ollama, DeepSeek, etc.).</li>
<li><strong>Modular Architecture:</strong> A flexible structure that is not tied to a specific AI provider.</li>
<li><strong>Easy Integration:</strong> Seamless integration using Spring Boot’s auto-configuration.</li>
<li><strong>Extensibility:</strong> Support for custom models and options to handle advanced use cases.</li>
</ol>
<p>Spring AI is particularly well-suited for enterprises looking to quickly adopt and scale AI functionalities.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deepseek-high-performance-affordable-pricing">DeepSeek: High Performance, Affordable Pricing<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#deepseek-high-performance-affordable-pricing" class="hash-link" aria-label="Direct link to DeepSeek: High Performance, Affordable Pricing" title="Direct link to DeepSeek: High Performance, Affordable Pricing">​</a></h3>
<img src="https://www.geuni.tech/img/post/deepseek_benchmark.jpg" alt="deepseek 벤치마크" style="zoom:20%">
<p>DeepSeek, a previously lesser-known company, has gained significant recognition with the release of <code>DeepSeek R1</code>. Offering performance comparable to OpenAI’s models at a lower price, along with an open-source distribution strategy, the company has even shaken up the U.S. capital market.</p>
<p><strong>Key Features of DeepSeek:</strong></p>
<ul>
<li><strong>High-performance LLM:</strong> Advanced language model matching OpenAI-o1 capabilities</li>
<li><strong>OpenAI-compatible API:</strong> Full compatibility with existing OpenAI-based applications</li>
<li><strong>Cost Efficiency:</strong> More affordable pricing than OpenAI</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="prerequisites">Prerequisites<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites">​</a></h3>
<ul>
<li>Java 17+ installed</li>
<li>Gradle 8+ installed</li>
<li>DeepSeek API key obtained (<a href="https://platform.deepseek.com/api_keys" target="_blank" rel="noopener noreferrer">Get your key from DeepSeek</a>)</li>
<li>Environment variable setup (It is recommended to store the API key as an environment variable instead of directly in application.yml.)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="implementation">Implementation<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#implementation" class="hash-link" aria-label="Direct link to Implementation" title="Direct link to Implementation">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-buildgradle-configuration">1. build.gradle Configuration<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#1-buildgradle-configuration" class="hash-link" aria-label="Direct link to 1. build.gradle Configuration" title="Direct link to 1. build.gradle Configuration">​</a></h4>
<p>Create a Spring Boot project and configure dependencies in <code>build.gradle</code>:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">build.gradle</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">plugins </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token string" style="color:#e3116c">'java'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token string" style="color:#e3116c">'org.springframework.boot'</span><span class="token plain"> version </span><span class="token string" style="color:#e3116c">'3.4.2'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id </span><span class="token string" style="color:#e3116c">'io.spring.dependency-management'</span><span class="token plain"> version </span><span class="token string" style="color:#e3116c">'1.1.7'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">group </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'com.example'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'0.0.1-SNAPSHOT'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">java </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    toolchain </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        languageVersion </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token maybe-class-name">JavaLanguageVersion</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">17</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repositories </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">mavenCentral</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    maven </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> url </span><span class="token string" style="color:#e3116c">'https://repo.spring.io/milestone'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    maven </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> url </span><span class="token string" style="color:#e3116c">'https://repo.spring.io/snapshot'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dependencies </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    implementation </span><span class="token string" style="color:#e3116c">'org.springframework.boot:spring-boot-starter-web'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    implementation </span><span class="token string" style="color:#e3116c">'org.springframework.ai:spring-ai-openai-spring-boot-starter:1.0.0-M5'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//    implementation 'org.springframework.ai:spring-ai-ollama-spring-boot-starter:1.0.0-M5'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<p>The <code>spring-ai-openai-spring-boot-starter</code> dependency is compatible with all services that follow OpenAI’s API standard.</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-applicationyml-configuration">2. application.yml Configuration<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#2-applicationyml-configuration" class="hash-link" aria-label="Direct link to 2. application.yml Configuration" title="Direct link to 2. application.yml Configuration">​</a></h4>
<p>Next, configure <code>application.yml</code> to connect to the DeepSeek API and set model options.</p>
<blockquote>
<p>By simply changing the values of <code>base-url</code>, <code>api-key</code>, and <code>model</code>, you can integrate with other language models as well.</p>
</blockquote>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">spring</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">application</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> spring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ai</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">deepseek</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ai</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">openai</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">base-url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//api.deepseek.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">api-key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">DEEPSEEK_API_KEY</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">chat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">options</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#          model: deepseek-chat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">model</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deepseek</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">reasoner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">stream-usage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    ollama integration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#    ollama:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#      base-url: http://localhost:11434</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#      chat:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#        options:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#          model: deepseek-r1:7b</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-implementing-the-controller">3. Implementing the Controller<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#3-implementing-the-controller" class="hash-link" aria-label="Direct link to 3. Implementing the Controller" title="Direct link to 3. Implementing the Controller">​</a></h4>
<p>Now, let's create a Spring Boot REST Controller to interact with DeepSeek API using Spring AI.</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token annotation punctuation" style="color:#393A34">@RestController</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token annotation punctuation" style="color:#393A34">@CrossOrigin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">origins </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ChatController</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">private</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">final</span><span class="token plain"> </span><span class="token class-name">ChatClient</span><span class="token plain"> chatClient</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ChatController</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">ChatClient</span><span class="token class-name punctuation" style="color:#393A34">.</span><span class="token class-name">Builder</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        chatClient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> builder</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token annotation punctuation" style="color:#393A34">@PostMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/chat"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">public</span><span class="token plain"> </span><span class="token class-name">ChatResponse</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token annotation punctuation" style="color:#393A34">@RequestParam</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> prompt</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> chatClient</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">prompt</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">prompt</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">call</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">chatResponse</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="api-testing">API Testing<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#api-testing" class="hash-link" aria-label="Direct link to API Testing" title="Direct link to API Testing">​</a></h3>
<p>Due to a surge in users, the Deepseek API service is still unstable. In case of API errors, please check the service status at the following link:</p>
<blockquote>
<p>Check service status: <a href="https://status.deepseek.com/" target="_blank" rel="noopener noreferrer">https://status.deepseek.com/</a></p>
</blockquote>
<p><img decoding="async" loading="lazy" alt="Spring AI with DeepSeek Integration Test" src="https://www.geuni.tech/en/assets/images/spring-ai-deepseek-test-en-a3818dac4538b1eee1d9db7d6a19a5fb.png" width="2182" height="1257" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="implementing-a-chat-ui">Implementing a Chat UI<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#implementing-a-chat-ui" class="hash-link" aria-label="Direct link to Implementing a Chat UI" title="Direct link to Implementing a Chat UI">​</a></h3>
<p>I used Cursor to create a simple UI for testing, I encourage you to use any AI tools that work best for you to build a UI that fits your needs.</p>
<img src="https://www.geuni.tech/img/post/spring-ai-deepseek-test.gif" alt="Creating a Chatbot by Integrating Spring AI and DeepSeek" style="zoom:40%">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://www.geuni.tech/en/spring-ai-with-deepseek#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>In this guide, we explored how to integrate DeepSeek API with Spring AI and build a simple AI chatbot.</p>
<p>As DeepSeek continues to emerge as a strong competitor to OpenAI, it is expected to significantly impact the AI market in the future.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cursor AI 사용법: 코드 편집을 넘어, 다목적 AI 도구]]></title>
            <link>https://www.geuni.tech/en/cursor-ai-usage</link>
            <guid>https://www.geuni.tech/en/cursor-ai-usage</guid>
            <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Cursor AI는 코드 자동 완성, 버그 수정 등 개발 생산성을 높여주는 것은 물론, 자연어 생성 기능으로 콘텐츠 크리에이터에게도 유용한 AI 도구입니다. 다양한 기능과 사용법을 자세히 알아보세요.]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cursor-ai-코드-편집을-넘어선-다목적-ai-assist-도구">Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구<a href="https://www.geuni.tech/en/cursor-ai-usage#cursor-ai-%EC%BD%94%EB%93%9C-%ED%8E%B8%EC%A7%91%EC%9D%84-%EB%84%98%EC%96%B4%EC%84%A0-%EB%8B%A4%EB%AA%A9%EC%A0%81-ai-assist-%EB%8F%84%EA%B5%AC" class="hash-link" aria-label="Direct link to Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구" title="Direct link to Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구">​</a></h3>
<p>Cursor AI는 단순한 코드 편집기가 아닙니다. <strong>AI의 강력한 자연어 처리(NLP)와 코드 이해 능력을 기반으로 한 다목적 도구</strong>로, 개발자부터 콘텐츠 크리에이터에 이르기까지 다양한 사용자에게 혁신적인 생산성 향상을 제공합니다.</p>
<p>참고로, 뒤에 업데이트 하는 내용이지만 이번 포스트도 Cursor AI를 활용해 작성해보았습니다. 그동안 VS Code로 블로그 글을 작성해왔던 터라 나름 친숙한 느낌이 들었습니다.</p>
<p>대부분의 단어에 제안 문장이 뜨다 보니 귀찮은 부분도 없지 않았지만, 글의 틀을 잡고 문맥을 다듬는 데 있어서는 많은 도움을 받을 수 있겠다는 생각이 들었습니다.</p>
<p><strong>1. 개발자를 위한 최적의 AI 코드 편집기</strong><br>
<!-- -->Cursor AI는 개발자에게 꼭 필요한 기능을 제공합니다.</p>
<ul>
<li><strong>코드 자동 완성</strong>: AI가 코드의 맥락을 이해하고, 다음에 작성할 코드를 예측하여 빠르게 제안.</li>
<li><strong>버그 수정 및 디버깅</strong>: 코드 내 잠재적인 오류를 실시간으로 탐지하고, 수정 방안을 제시.</li>
<li><strong>코드 리팩토링</strong>: 더 효율적이고 가독성 높은 코드로 개선하는 방법을 제안.</li>
<li><strong>문서화 지원</strong>: 코드에 대한 설명을 자동으로 생성하여 개발 생산성을 높일수 있음.</li>
</ul>
<p><strong>2. 콘텐츠 크리에이터를 위한 AI 글쓰기 도구</strong><br>
<!-- -->Cursor AI는 개발 영역을 넘어 글쓰는 사람들에게도 강력한 도구로 활용될 수 있습니다.</p>
<ul>
<li><strong>자연어 생성</strong>: 블로거, 작가, 콘텐츠 크리에이터를 위해 아이디어 구상부터 문장 작성까지 AI 도움을 받을수 있음.</li>
<li><strong>문서 요약</strong>: 긴 글을 간결하게 요약하거나, 핵심 포인트를 추출.</li>
<li><strong>스타일 맞춤화</strong>: 특정 톤이나 스타일에 맞춰 글을 작성하거나 수정 가능.</li>
<li><strong>번역 지원</strong>: 다양한 언어로의 번역을 통해 글로벌 콘텐츠 제작에 도움을 줄수 있음.</li>
</ul>
<p><strong>3. 다목적 AI Assist 도구로서의 가능성</strong><br>
<!-- -->Cursor AI는 단일 영역에 국한되지 않고, 다양한 업무와 프로젝트에 적용할 수 있습니다.</p>
<ul>
<li><strong>프로젝트 관리</strong>: 작업 목록 생성, 일정 관리, 보고서 작성 등 지원.</li>
<li><strong>학습 및 연구</strong>: 복잡한 개념을 쉽게 설명하거나, 연구 자료를 정리하는 데 활용가능.</li>
</ul>
<p>아래는 간단한 스네이크 게임을 만들어본 결과입니다.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>프롬프트 참고:</summary><div><div class="collapsibleContent_i85q"><h6 class="anchor anchorWithStickyNavbar_LWe7" id="목표">목표<a href="https://www.geuni.tech/en/cursor-ai-usage#%EB%AA%A9%ED%91%9C" class="hash-link" aria-label="Direct link to 목표" title="Direct link to 목표">​</a></h6><p>Python을 사용하여 시각적으로 세련되고 현대적인 Snake 게임을 개발합니다. 코드는 깔끔하고 유지보수가 용이하며, 직관적인 UI를 제공합니다.</p><h6 class="anchor anchorWithStickyNavbar_LWe7" id="요구사항">요구사항<a href="https://www.geuni.tech/en/cursor-ai-usage#%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD" class="hash-link" aria-label="Direct link to 요구사항" title="Direct link to 요구사항">​</a></h6><ol>
<li><strong>프로그래밍 언어</strong>: Python</li>
<li><strong>사용 라이브러리</strong>:<!-- -->
<ul>
<li><code>pygame</code>: 그래픽 및 게임 로직 구현</li>
<li>선택사항: <code>pygame_gui</code> (UI 요소 개선을 위해)</li>
</ul>
</li>
<li><strong>필수 기능</strong>:<!-- -->
<ul>
<li>현대적이고 깔끔한 디자인</li>
<li>부드러운 애니메이션 및 반응형 게임 플레이</li>
<li>점수 시스템과 난이도 조절 기능</li>
<li>게임 오버 화면 및 다시 시작 옵션</li>
<li>배경 음악 및 효과음 추가</li>
<li>고해상도 디스플레이 지원</li>
</ul>
</li>
<li><strong>확장 가능성</strong>:<!-- -->
<ul>
<li>새로운 스킨 및 테마 추가</li>
<li>멀티플레이 모드 (선택 사항)</li>
</ul>
</li>
</ol><h6 class="anchor anchorWithStickyNavbar_LWe7" id="설계-방향">설계 방향<a href="https://www.geuni.tech/en/cursor-ai-usage#%EC%84%A4%EA%B3%84-%EB%B0%A9%ED%96%A5" class="hash-link" aria-label="Direct link to 설계 방향" title="Direct link to 설계 방향">​</a></h6><ul>
<li><strong>UI/UX</strong>: 심플하고 직관적인 사용자 인터페이스, 시각적으로 만족스러운 그래픽</li>
<li><strong>코드 구조</strong>: 객체 지향 설계를 사용하여 모듈화 및 재사용성을 높임</li>
<li><strong>애니메이션</strong>: 부드럽고 자연스러운 이동 및 화면 전환</li>
</ul><h6 class="anchor anchorWithStickyNavbar_LWe7" id="개발-가이드라인">개발 가이드라인<a href="https://www.geuni.tech/en/cursor-ai-usage#%EA%B0%9C%EB%B0%9C-%EA%B0%80%EC%9D%B4%EB%93%9C%EB%9D%BC%EC%9D%B8" class="hash-link" aria-label="Direct link to 개발 가이드라인" title="Direct link to 개발 가이드라인">​</a></h6><ol>
<li><strong>환경 설정</strong>:<!-- -->
<ul>
<li>Python 최신 버전 설치</li>
<li><code>pip install pygame</code>으로 필요한 라이브러리 설치</li>
</ul>
</li>
<li><strong>코드 구성</strong>:<!-- -->
<ul>
<li><code>main.py</code>: 게임 실행 및 초기화</li>
<li><code>snake.py</code>: Snake 객체 정의 및 로직</li>
<li><code>game_logic.py</code>: 게임 상태 관리 및 충돌 감지</li>
<li><code>ui.py</code>: UI 요소 관리</li>
</ul>
</li>
<li><strong>디자인</strong>:<!-- -->
<ul>
<li>현대적인 색상 팔레트 사용 (예: 파스텔톤, 미니멀리즘 디자인)</li>
<li>사용자 맞춤 테마 지원</li>
</ul>
</li>
</ol></div></div></details>
<img src="https://www.geuni.tech/img/post/cursor-ai-snake-game.gif" alt="Cursor AI, 스네이크 게임 만들기" style="zoom:40%">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cursor-핵심기능">Cursor 핵심기능<a href="https://www.geuni.tech/en/cursor-ai-usage#cursor-%ED%95%B5%EC%8B%AC%EA%B8%B0%EB%8A%A5" class="hash-link" aria-label="Direct link to Cursor 핵심기능" title="Direct link to Cursor 핵심기능">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="tab-자동완성">Tab 자동완성<a href="https://www.geuni.tech/en/cursor-ai-usage#tab-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1" class="hash-link" aria-label="Direct link to Tab 자동완성" title="Direct link to Tab 자동완성">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>관련 단축키</div><div class="admonitionContent_BuS1"><p>코드 제안 수락 : <code>Tab</code> <br>
코드 제안 거절 : <code>Esc</code> <br>
단어별 부분 수락: <code>Ctrl/⌘ + →</code></p></div></div>
<p>Cursor의 기본기능은 문장이나 코드 앞뒤 문맥을 파악하여 코드제안을 하게 되는데, 이때 <code>Tab</code> 키로 코드제안을 수락할수 있습니다.</p>
<p>GitHub Copilot, JetBrains AI와 같은 기타 AI툴에서도 지원되는 기능이죠? Cursor의 Tab기능은 이 외에도 아래와 같은 차별화 된 기능을 제공하고 있습니다.</p>
<p><strong>1. 멀티라인 자동완성(Multi-line Completion)</strong></p>
<p>Cursor는 아래와 같이 멀티라인의 코드 제안/자동완성이 가능합니다.</p>
<img src="https://www.geuni.tech/img/post/cursor-multi-line-completion.png" alt="Cursor AI, 자동완성" style="zoom:70%">
<p><strong>2. Smart Rewrite</strong></p>
<p>소스의 오류를 인지하여 자동으로 보정작업을 해줄수 있습니다.</p>
<p><img decoding="async" loading="lazy" alt="Cursor AI, Smart Rewrite" src="https://www.geuni.tech/en/assets/images/cursor-tab-smart-rewrite-f7ff955cc53d14783751c3954d689e32.png" width="1570" height="166" class="img_ev3q"></p>
<p><strong>3. 커서 예측(Cursor Prediction)</strong></p>
<p>Cursor는 사용자가 다음에 편집하려는 위치를 예측하여 마우스 커서를 자동으로 이동시킬 수 있습니다.</p>
<p>예를 들어, 제가 함수에 파라미터 하나를 추가했을 때, Cursor는 두 가지 예측을 합니다. 하나는 payload에 추가 작업을 할 수도 있다는 예측(커서 이동), 또 하나는 boolean 파라미터를 사용해 if문을 생성할 수 있다는 예측입니다.</p>
<img src="https://www.geuni.tech/img/post/cursor-prediction.png" alt="Cursor AI, 커서 예측" style="zoom:60%">
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="chat-ctrl--l">Chat (Ctrl/⌘ + L)<a href="https://www.geuni.tech/en/cursor-ai-usage#chat-ctrl--l" class="hash-link" aria-label="Direct link to Chat (Ctrl/⌘ + L)" title="Direct link to Chat (Ctrl/⌘ + L)">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>관련 단축키</div><div class="admonitionContent_BuS1"><p>Chat 열기 : <code>Ctrl/⌘ + L</code> <br>
변경 적용 : <code>Ctrl/⌘ + ↵</code> <br>
변경 거절: <code>Ctrl/⌘ + ⌫</code>  <br>
부분 수락: <code>Ctrl/⌘ + Shift + Y</code> <br>
부분 거절: <code>Ctrl/⌘ + N</code> <br>
코드 선택 추가: <code>Ctrl/⌘ + Shift + L</code> <br>
Chat에서 오류해결: <code>Ctrl/⌘ + Shift + E</code> <br>
채팅 기록 확인: <code>Ctrl/⌘ + Alt/Option + L</code></p></div></div>
<p>Cursor <code>Chat</code> 기능은 코드 편집기 내에서 AI와 대화하며 코드 관련 질문을 하거나 문제를 해결할 수 있는 기능입니다.</p>
<p><strong>1. 다양한 컨텍스트지원</strong></p>
<p>컨텍스트(<code>Context</code>)는 상황, 배경, 맥락 등을 의미하며 요즘 흔히 말하는 <code>Prompt</code>도 컨텍스트의 일종의라고 볼수 있습니다. 컨텍스트에 따라 답변의 정확성, 비용 등에도 영향줄수 있으며 AGI의 활용에 있어서 상당히 중요한 역할을 합니다.</p>
<p>Cursor는 아래와 같이 다양한 컨텍스틀 지원합니다:</p>
<ul>
<li>현재 파일 컨텍스트: 기본적으로 현재 열린 파일의 내용을 컨텍스트로 포함합니다. 이를 통해 AI는 코드의 특정 부분을 이해하고 관련된 답변을 제공할 수 있습니다.</li>
<li>프로젝트 전체 컨텍스트: <code>@Codebase</code>를 사용하여 전체 프로젝트를 컨텍스트로 포함할 수 있습니다.</li>
<li>외부 문서 및 웹 검색: <code>@Doc</code>을 통해 기술 문서를 참조하거나 <code>@Web</code>을 사용해 웹 검색 결과를 포함할 수 있습니다</li>
</ul>
<p><strong>2. 코드 적용 기능 (Apply)</strong></p>
<p>AI가 제안한 코드를 바로 편집기에 적용할 수 있습니다. 코드 블록 우측의 "Apply" 버튼을 클릭하거나 <code>Ctrl/⌘ + Enter</code>를 눌러 변경 사항을 적용할 수 있습니다.</p>
<p>적용된 코드는 편집기에서 <code>diff</code>형태로 표시되며, 코드 블록 단위로나 파일단위로 변경을 수락할수 있습니다.</p>
<img src="https://www.geuni.tech/img/post/cursor-apply-show-diff.png" alt="Cursor AI - diff" style="zoom:70%">
<p><strong>3. 채팅 이력 관리</strong></p>
<p>AI화의 대화 기록은 이력으로 관리가 됩니다.AI 패널의 오른쪽 상단에 있는 'Previous Chats' 버튼을 누르거나, <code>Ctrl/⌘ + Alt/Option + L</code>을 누르면 채팅 기록을 확인할 수 있습니다.</p>
<p><strong>4. AI 모델 전환</strong></p>
<p>Cursor Chat은 여러 AI 모델을 지원하며, <code>Ctrl/⌘ /</code>를 눌러 모델을 전환할 수 있습니다. 선택한 모델은 이후 세션에서도 유지됩니다</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="inline-chatctrlcmd-k">Inline Chat(Ctrl/Cmd K)<a href="https://www.geuni.tech/en/cursor-ai-usage#inline-chatctrlcmd-k" class="hash-link" aria-label="Direct link to Inline Chat(Ctrl/Cmd K)" title="Direct link to Inline Chat(Ctrl/Cmd K)">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>관련 단축키</div><div class="admonitionContent_BuS1"><p>Prompt Bar 열기 : <code>Ctrl/⌘ + K</code> <br>
추가 설명 : <code>Ctrl/⌘ + Shift + K</code> <br>
변경 적용 : <code>Ctrl/⌘ + ↵</code> <br>
터미널 Prompt Bar 열기 : <code>Ctrl/⌘ + K</code>    <br>
터미널 명령어 실행: <code>Ctrl/⌘ + ↵</code></p></div></div>
<p>시작에 이력서 샘플 생성하면서 사용했던 기능입니다. 조금 단순한 지시나, 블록단위의 코드 생성/변경은 <code>Ctrl/Cmd K</code>를 사용하는게 많이 편리합니다.</p>
<p><code>Ctrl/Cmd K</code>를 누른후 뜨는 창을 프롬프트 바(<code>Prompt Bar</code>)라고 부르며 Chat기능과 마찬가지로 <code>@Codebase</code>, <code>@Doc</code>, <code>@Web</code> 등 기능을 사용할수 있습니다.</p>
<p>변경을 원하는 코드 선택해서 누르거나, 코드 선택을 하지 않은 상태로 눌러 새로운 코드를 생성할수 있습니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="composer-ctrl--i">Composer (Ctrl/⌘ + I)<a href="https://www.geuni.tech/en/cursor-ai-usage#composer-ctrl--i" class="hash-link" aria-label="Direct link to Composer (Ctrl/⌘ + I)" title="Direct link to Composer (Ctrl/⌘ + I)">​</a></h4>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>관련 단축키</div><div class="admonitionContent_BuS1"><p>Composer 열기 : <code>Ctrl/⌘ + I</code> <br>
변경 적용 : <code>Ctrl/⌘ + ↵</code> <br>
변경 거절: <code>Ctrl/⌘ + ⌫</code>  <br>
부분 수락: <code>Ctrl/⌘ + Shift + Y</code> <br>
부분 거절: <code>Ctrl/⌘ + N</code> <br>
Composer에서 오류해결: <code>Ctrl/⌘ + Shift + D</code> <br>
Composer 새로 열기 : <code>Ctrl/⌘ + N</code> <br></p></div></div>
<p><code>Composer</code> 기능은 <code>Chat</code>기능과 달리 에디터에 직접 작용되며, 긴 텍스트와 코드를 체계적으로 작성하고 편집하는 데 최적화 되어있습니다.</p>
<p><strong>Composer vs Chat</strong></p>
<table><thead><tr><th><strong>구분</strong></th><th><strong>Composer</strong></th><th><strong>Chat</strong></th></tr></thead><tbody><tr><td><strong>기능 초점</strong></td><td>사용자 주도적으로 텍스트 또는 코드 작성 및 편집</td><td>대화 형식으로 질문/답변을 통해 작업 진행</td></tr><tr><td><strong>작업 방식</strong></td><td>구조화된 편집 환경에서 원하는 콘텐츠를 직접 작성</td><td>자유로운 대화 흐름에서 작업 요구를 표현</td></tr><tr><td><strong>편집 지원</strong></td><td>실시간 코멘트와 수정 제안 기능 제공</td><td>추가 질문, 요청 및 정보 제공을 통해 작업 방향을 보완</td></tr><tr><td><strong>결과물 형태</strong></td><td>완성된 문서, 코드 또는 구조화된 텍스트</td><td>대화 형태의 결과물로, 필요에 따라 추가 작업 필요</td></tr><tr><td><strong>주요 장점</strong></td><td>코드베이스에 큰 변경을 빠르게 적용할 때 유리.</td><td>점진적이고 반복적인 변경에 더 적합.</td></tr></tbody></table>
<p>Composer는 실험적인 기능으로, Rule이나 prompt를 잘 짜서 사용하면 의외의 효과를 볼수 있습니다.</p>
<p>일반적으로 구조적이고 잘 정리된 요구사항을 prompt로 활용할 때 Composer 기능이 더 적합하며, 프리스타일의 질문/요청에는 Chat 기능이 더 적합합니다.</p>
<p>아래와 같이 prompt 입력후, 변경내역이 실시간으로 에디터에 반영됩니다. (참고로, 시작에 보여드린 스네이크 게임도 Composer를 사용한 결과물입니다.)</p>
<p><img decoding="async" loading="lazy" alt="Cursor AI - Composer" src="https://www.geuni.tech/en/assets/images/cursor-composer-fb0b109b8bff79485f7bbaa79775a7c6.png" width="2419" height="1350" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rules-for-ai">Rules for AI<a href="https://www.geuni.tech/en/cursor-ai-usage#rules-for-ai" class="hash-link" aria-label="Direct link to Rules for AI" title="Direct link to Rules for AI">​</a></h4>
<p>Cursor Rules란 Cursor의 AI 어시스턴트가 코드를 해석하고, 제안을 생성하며, 질문에 응답할 때 그 동작을 맞춤화하는 사용자 정의 규칙들입니다. Cursor Rules에는 두 가지 유형이 있습니다:</p>
<ul>
<li>전역 규칙(<code>Global Rules</code>):  이 규칙은 모든 프로젝트와 파일에 적용되며, AI의 전반적인 동작을 정의합니다.(<code>Cursor Settings</code> &gt; <code>General</code> &gt; <code>Rules for AI</code>)</li>
<li>로컬 규칙(<code>Local Rules</code>): 이 규칙은 특정 프로젝트 또는 파일에만 적용됩니다.(프로젝트 root에 <code>.cursorrules</code>파일로 정의)</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Cursor AI, Rules for AI" src="https://www.geuni.tech/en/assets/images/cursor-rules-for-ai-d5c830c218957927c03a3a8c0743a9e8.png" width="1417" height="406" class="img_ev3q"></p>
<p>Cursor Rules는 아래와 같은 효과를 낼수 있습니다:</p>
<ol>
<li>
<p><strong>코딩 스타일에 맞게 AI 응답을 맞춤화</strong></p>
<ul>
<li>AI가 생성하는 코드나 제안이 개인 또는 팀의 코딩 스타일과 일치하도록 설정할 수 있습니다.</li>
<li>예를 들어, 들여쓰기 방식, 변수 명명 규칙, 코드 구조 등을 지정할 수 있습니다.</li>
</ul>
</li>
<li>
<p><strong>팀 전체에 걸쳐 코딩 표준 강제 적용</strong></p>
<ul>
<li>팀 전체가 동일한 코딩 표준을 따르도록 AI를 설정할 수 있습니다.</li>
<li>이를 통해 코드베이스의 일관성을 유지하고, 코드 리뷰 과정을 단순화할 수 있습니다.</li>
</ul>
</li>
<li>
<p><strong>코드 일관성 및 품질 향상</strong></p>
<ul>
<li>AI가 생성하거나 수정하는 코드가 항상 일관된 품질을 유지하도록 지침을 제공할 수 있습니다.</li>
<li>예를 들어, 특정 보안 규칙이나 성능 최적화 기준을 준수하도록 설정할 수 있습니다.</li>
</ul>
</li>
<li>
<p><strong>개발 워크플로우 간소화</strong></p>
<ul>
<li>반복적인 작업을 자동화하고, AI가 개발자의 작업 흐름에 더 잘 통합되도록 설정할 수 있습니다.</li>
<li>예를 들어, 특정 유형의 코드 생성 요청에 대해 항상 동일한 형식으로 응답하도록 설정할 수 있습니다.</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="결론-cursor-ai-다목적-ai-도구로의-진화">결론: Cursor AI, 다목적 AI 도구로의 진화<a href="https://www.geuni.tech/en/cursor-ai-usage#%EA%B2%B0%EB%A1%A0-cursor-ai-%EB%8B%A4%EB%AA%A9%EC%A0%81-ai-%EB%8F%84%EA%B5%AC%EB%A1%9C%EC%9D%98-%EC%A7%84%ED%99%94" class="hash-link" aria-label="Direct link to 결론: Cursor AI, 다목적 AI 도구로의 진화" title="Direct link to 결론: Cursor AI, 다목적 AI 도구로의 진화">​</a></h3>
<p>오늘은 Cursor의 핵심 기능에 대해 정리해봤습니다. Cursor는 단순한 코드 편집기를 넘어, AI의 힘을 활용해 다양한 분야에서 활용 가능한 다목적 도구로 자리 잡고 있습니다.</p>
<p>처음 Cursor를 접했을 때는 개발자들을 위한 코드 편집기로만 생각했지만, 실제로 사용해보면 그 이상의 잠재력을 발견할 수 있습니다. Cursor는 AI의 자연어 처리 능력을 바탕으로, 코드 작성부터 복잡한 문제 해결, 글쓰기와 콘텐츠 생성에 이르기까지 다양한 작업을 지원하는 강력한 도구입니다.</p>
<p>Cursor는 단순히 도구를 넘어, 사용자의 창의성과 생산성을 극대화하는 파트너 역할을 합니다. 여러분도 Cursor를 통해 더 스마트하고 효율적인 작업 방식을 경험해보시길 추천합니다.</p>]]></content:encoded>
            <category>Cursor</category>
        </item>
        <item>
            <title><![CDATA[Git 사용법: 명령어, 용어 정리]]></title>
            <link>https://www.geuni.tech/en/git-commands-and-glossary</link>
            <guid>https://www.geuni.tech/en/git-commands-and-glossary</guid>
            <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Git 명령어 사용법, 용어 총정리! Git: 더 이상 개발자만의 도구가 아니다!]]></description>
            <content:encoded><![CDATA[<p>본 포스트는 Git 명령어를 중심으로 다룹니다. Git을 처음 접하시는 분들도 쉽게 따라올 수 있도록 기본 개념을 간단히 소개하는 것부터 시작해보려고 합니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-더-이상-개발자�만의-도구가-아니다">Git: 더 이상 개발자만의 도구가 아니다!<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-%EB%8D%94-%EC%9D%B4%EC%83%81-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A7%8C%EC%9D%98-%EB%8F%84%EA%B5%AC%EA%B0%80-%EC%95%84%EB%8B%88%EB%8B%A4" class="hash-link" aria-label="Direct link to Git: 더 이상 개발자만의 도구가 아니다!" title="Direct link to Git: 더 이상 개발자만의 도구가 아니다!">​</a></h2>
<p>과거에는 주로 개발자들이 사용하는 전문 도구로 여겨졌던 Git은 이제 블로거, 작가, 그리고 노트 정리를 좋아하는 사람들에게도 필수 도구로 자리 잡고 있습니다.</p>
<p><strong>Git이란?</strong></p>
<p>Git은 간단히 말해 버전 관리 시스템입니다. 컴퓨터 파일의 변경 사항을 기록하고, 필요할 때 특정 시점으로 되돌아갈 수 있게 도와주는 도구입니다.
먼저, Git은 코드나 파일의 변경 내역을 기록하고, 여러 사람이 함께 작업할 때 충돌을 방지하는 버전 관리 시스템입니다. 쉽게 말해, 모든 작업을 안전하게 "저장"하고 "공유"하는 디지털 작업 공간입니다.</p>
<p>예를 들어, 여러분이 소설을 쓰다가 내용이 마음에 들지 않아 <em>"일주일 전 버전으로 되돌리고 싶다"</em> 고 생각할 때, Git은 그런 마법을 가능하게 해줍니다.</p>
<p>요즘은 Obsidian, Logseq 같은 노트 관리 도구와의 조합으로 개인 지식 관리(<code>PKM</code>) 에도 많이 활용되고 있습니다.</p>
<p>초보자 분들은 GUI tool로부터 시작하는걸 권장 드립니다. (<a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener noreferrer">Sourcetree</a>, <a href="https://www.gitkraken.com/" target="_blank" rel="noopener noreferrer">GitKraken</a>, <a href="https://github.com/apps/desktop" target="_blank" rel="noopener noreferrer">GitHub Desktop</a>, <a href="https://code.visualstudio.com/docs/sourcecontrol/overview" target="_blank" rel="noopener noreferrer">VS Code</a> 등)</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-개념잡기">Git 개념잡기<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0" class="hash-link" aria-label="Direct link to Git 개념잡기" title="Direct link to Git 개념잡기">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="git-workflow">Git Workflow<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-workflow" class="hash-link" aria-label="Direct link to Git Workflow" title="Direct link to Git Workflow">​</a></h3>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">---- Git Workflow ---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[작업 디렉토리 (Working Directory)]  🖥️</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |  파일 작업 (수정, 추가, 삭제)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    |  git add &lt;파일&gt;  (변경 사항 스테이징)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[스테이징 영역 (Staging Area)]      📦</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |  git commit -m "메시지"  (변경 사항을 로컬 저장소에 저장)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[로컬 저장소 (Local Repository)]  🏠</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |  git push origin &lt;브랜치&gt;  (변경 사항을 원격 저장소로 푸시)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[원격 저장소 (Remote Repository)] 🌍</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |  git pull origin &lt;브랜치&gt;  (git fetch + git merge)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[협력자의 로컬 저장소]  🏠</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |  git merge 발생</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    |  충돌 해결 (Conflict Resolution, 필요한 경우)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        |    ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        v</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[협력자의 작업 디렉토리 (Working Directory)]  🖥️</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="git-용어정리">Git 용어정리<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC" class="hash-link" aria-label="Direct link to Git 용어정리" title="Direct link to Git 용어정리">​</a></h3>
<table><thead><tr><th><strong>용어</strong></th><th><strong>설명</strong></th><th><strong>사용 예시</strong></th></tr></thead><tbody><tr><td><code>Working Directory</code></td><td>현재 작업 중인 프로젝트의 디렉터리. Git이 추적하는 파일들이 위치하며 파일을 수정할 수 있는 작업 공간입니다.</td><td><code>git status</code>로 <code>Working Directory</code>의 상태 확인</td></tr><tr><td><code>Staging Area</code></td><td>커밋을 준비하기 위해 변경 사항을 임시로 저장하는 영역. <code>git add</code> 명령어로 파일을 추가합니다.</td><td><code>git add &lt;file&gt;</code> <br> (파일을 <code>Staging Area</code>에 추가)</td></tr><tr><td><code>Index</code></td><td><code>Staging Area</code>와 동일 개념으로, Git 내부에서 파일 상태를 추적하기 위한 데이터 구조를 의미합니다.</td><td><code>git ls-files --stage</code> <br> (<code>Index</code>에 있는 파일 목록 확인)</td></tr><tr><td><code>Worktree</code></td><td>하나의 저장소에서 여러 작업 디렉터리를 관리할 수 있는 기능. 여러 브랜치에서 동시에 작업할 때 유용합니다.</td><td><code>git worktree add &lt;path&gt; &lt;branch&gt;</code> <br> (새 작업 디렉터리 추가)</td></tr><tr><td><code>HEAD</code></td><td>현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터.</td><td><code>git checkout main</code> <br> (<code>HEAD</code>가 <code>main</code> 브랜치를 가리킴)</td></tr><tr><td><code>Detached HEAD</code></td><td><code>HEAD</code>가 특정 브랜치가 아닌 특정 커밋을 직접 가리키는 상태. 이 상태에서는 브랜치 없이 커밋이 생성되므로 주의가 필요합니다.</td><td><code>git checkout &lt;commit-hash&gt;</code> <br> (<code>Detached HEAD</code> 상태로 전환)</td></tr><tr><td><code>Repository</code></td><td>Git으로 관리되는 프로젝트의 저장소. 로컬 저장소와 원격 저장소로 구분됩니다.</td><td><code>git init</code> (로컬 저장소 생성),<br> <code>git clone &lt;URL&gt;</code> (원격 저장소 복제)</td></tr><tr><td><code>Commit</code></td><td>파일의 변경 사항을 저장하는 행위. 각 커밋은 고유한 해시 값으로 식별됩니다.</td><td><code>git commit -m "메시지"</code></td></tr><tr><td><code>Branch</code></td><td>코드의 독립적인 버전을 만드는 것. 기본적으로 <code>main</code> 또는 <code>master</code> 브랜치가 존재합니다.</td><td><code>git branch feature-branch</code> <br> (새 브랜치 생성)</td></tr><tr><td><code>Checkout</code></td><td>특정 브랜치나 커밋으로 작업 환경을 전환하는 명령어.</td><td><code>git checkout feature-branch</code> <br> (브랜치 전환)</td></tr><tr><td><code>Merge</code></td><td>두 브랜치의 변경 사항을 하나로 합치는 작업.</td><td><code>git merge feature-branch</code> <br> (현재 브랜치에 <code>feature-branch</code> 병합)</td></tr><tr><td><code>Pull</code></td><td>원격 저장소의 변경 사항을 로컬 저장소로 가져오고 병합하는 작업.</td><td><code>git pull origin main</code> <br> (원격 <code>main</code> 브랜치의 변경 사항 가져오기)</td></tr><tr><td><code>Push</code></td><td>로컬 저장소의 변경 사항을 원격 저장소로 업로드하는 작업.</td><td><code>git push origin feature-branch</code> <br> (원격 저장소에 <code>feature-branch</code> 업로드)</td></tr><tr><td><code>Fetch</code></td><td>원격 저장소의 변경 사항을 로컬 저장소로 가져오지만 병합하지는 않습니다.</td><td><code>git fetch origin</code> <br> (원격 저장소의 변경 사항 가져오기)</td></tr><tr><td><code>Clone</code></td><td>원격 저장소를 로컬로 복제하는 작업.</td><td><code>git clone https://github.com/user/repo.git</code></td></tr><tr><td><code>Fork</code></td><td>원격 저장소를 자신의 계정으로 복제하는 작업. 주로 오픈소스 프로젝트에 기여할 때 사용됩니다.</td><td>GitHub "Fork" 버튼</td></tr><tr><td><code>Pull Request (PR)</code></td><td>자신의 브랜치에서 변경한 내용을 원본 저장소에 병합 요청을 보내는 작업.</td><td>GitHub "New Pull Request" 버튼</td></tr><tr><td><code>Stash</code></td><td>작업 중인 변경 사항을 임시로 저장하고 작업 디렉터리를 깨끗하게 만드는 작업.</td><td><code>git stash</code> (변경 사항 임시 저장),<br> <code>git stash pop</code> (임시 저장 내용 복원)</td></tr><tr><td><code>Rebase</code></td><td>브랜치의 기반을 다른 커밋으로 재설정하여 커밋 히스토리를 깔끔하게 만드는 작업.</td><td><code>git rebase main</code> <br> (현재 브랜치를 <code>main</code> 브랜치에 리베이스)</td></tr><tr><td><code>Tag</code></td><td>특정 커밋에 이름을 붙이는 작업. 주로 버전 릴리즈 시 사용됩니다.</td><td><code>git tag v1.0.0</code> <br> (<code>v1.0.0</code> 태그 생성)</td></tr><tr><td><code>Remote</code></td><td>원격 저장소를 가리키는 참조. 일반적으로 <code>origin</code>이라는 이름으로 설정됩니다.</td><td><code>git remote add origin &lt;URL&gt;</code> <br> (원격 저장소 추가)</td></tr><tr><td><code>Conflict</code></td><td>두 브랜치를 병합할 때 동일한 파일의 동일한 부분이 수정되어 발생하는 충돌.</td><td>병합 시 충돌이 발생하면 수동으로 해결해야 함</td></tr><tr><td><code>Cherry-pick</code></td><td>특정 커밋을 현재 브랜치에 적용하는 작업.</td><td><code>git cherry-pick &lt;commit-hash&gt;</code> <br> (특정 커밋 적용)</td></tr><tr><td><code>Reset</code></td><td>현재 브랜치의 <code>HEAD</code>를 특정 커밋으로 되돌리는 작업. <code>--soft</code>, <code>--mixed</code>, <code>--hard</code> 옵션으로 동작이 달라집니다.</td><td><code>git reset --hard HEAD~1</code> <br> (이전 커밋으로 완전히 되돌림)</td></tr><tr><td><code>Revert</code></td><td>특정 커밋을 취소하는 새로운 커밋을 생성하는 작업.</td><td><code>git revert &lt;commit-hash&gt;</code> <br> (특정 커밋 취소)</td></tr><tr><td><code>Blame</code></td><td>파일의 각 줄을 누가 언제 수정했는지 확인하는 작업.</td><td><code>git blame &lt;file&gt;</code> <br> (파일의 수정 이력 확인)</td></tr><tr><td><code>Log</code></td><td>커밋 히스토리를 확인하는 작업.</td><td><code>git log</code> <br> (커밋 히스토리 출력)</td></tr><tr><td><code>Diff</code></td><td>파일의 변경 사항을 비교하는 작업.</td><td><code>git diff</code> <br> (작업 디렉터리와 스테이징 영역 비교)</td></tr><tr><td><code>Stage</code></td><td>변경 사항을 커밋하기 전에 스테이징 영역에 추가하는 작업.</td><td><code>git add &lt;file&gt;</code> <br> (파일을 스테이징 영역에 추가)</td></tr><tr><td><code>Unstage</code></td><td>스테이징 영역에서 변경 사항을 제거하는 작업.</td><td><code>git reset &lt;file&gt;</code> <br> (파일을 스테이징 영역에서 제거)</td></tr><tr><td><code>Ignore</code></td><td>Git이 추적하지 않을 파일이나 디렉터리를 지정하는 설정. <code>.gitignore</code> 파일에 정의합니다.</td><td><code>.gitignore</code> 파일에 <code>node_modules/</code> 추가</td></tr><tr><td><code>Submodule</code></td><td>다른 Git 저장소를 현재 프로젝트에 포함시키는 방법.</td><td><code>git submodule add &lt;URL&gt;</code> <br> (서브모듈 추가)</td></tr><tr><td><code>Bisect</code></td><td>버그가 발생한 커밋을 이진 탐색으로 찾는 작업.</td><td><code>git bisect start</code>, <code>git bisect bad</code>, <code>git bisect good</code></td></tr><tr><td><code>Hooks</code></td><td>Git 작업 중 특정 이벤트가 발생할 때 실행되는 스크립트. <code>.git/hooks</code> 디렉터리에 저장됩니다.</td><td><code>pre-commit</code>, <code>post-commit</code> 등의 훅 스크립트</td></tr><tr><td><code>Reflog</code></td><td>Git에서 수행한 모든 작업의 기록을 확인하는 작업.</td><td><code>git reflog</code> <br> (작업 기록 확인)</td></tr><tr><td><code>Upstream</code></td><td>원격 저장소의 기본 브랜치를 가리키는 용어. 일반적으로 <code>origin/main</code> 또는 <code>origin/master</code>를 의미합니다.</td><td><code>git push --set-upstream origin feature-branch</code> <br> (업스트림 설정)</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="포인터의-중요성">포인터의 중요성<a href="https://www.geuni.tech/en/git-commands-and-glossary#%ED%8F%AC%EC%9D%B8%ED%84%B0%EC%9D%98-%EC%A4%91%EC%9A%94%EC%84%B1" class="hash-link" aria-label="Direct link to 포인터의 중요성" title="Direct link to 포인터의 중요성">​</a></h3>
<p>Git은 다양한 개념과 명령어를 기반으로 동작하지만, 그 핵심은 포인터(<code>pointer</code>)를 중심으로 이루어져 있습니다.</p>
<p>Git에서 포인터는 저장소 내의 특정 커밋이나 참조를 가리키는 핵심 메커니즘입니다. 포인터는 커밋의 해시값, 브랜치명, 태그명 등을 통해 특정 시점의 코드 상태를 참조할 수 있으며, 이를 기반으로 효율적인 버전 관리와 브랜치 관리가 이루어집니다.</p>
<p><strong>1. HEAD 포인터</strong></p>
<ul>
<li>현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터</li>
<li><code>.git/HEAD</code> 파일에 저장되어 있으며, 해당 파일은 HEAD가 가리키는 브랜치 이름 또는 특정 커밋 해시를 기록함.</li>
<li>만약 특정 커밋을 직접 체크아웃하면, <code>HEAD</code>는 "분리된 상태(<code>Detached HEAD</code>)"가 됨. 이 경우 <code>HEAD</code>는 브랜치 대신 커밋 해시를 직접 가리킴.(<code>ref: refs/heads/main</code> -&gt; <code>88f4bc..</code>)</li>
</ul>
<p><strong>HEAD 표현법</strong>
<code>HEAD</code>와 관련된 커밋을 참조할 때는 <code>^</code>와 <code>~</code> 기호를 사용합니다.</p>
<ol>
<li><code>HEAD^</code>: HEAD가 가리키는 커밋의 직전 부모 커밋을 참조합니다.<!-- -->
<ul>
<li><code>HEAD^</code>: 첫 번째 부모 커밋</li>
<li><code>HEAD^^</code>: 두 세대 전의 커밋</li>
<li><code>HEAD^2</code>: 두 번째 부모 커밋 (병합 커밋에서 유용)</li>
</ul>
</li>
<li><code>HEAD~</code>: HEAD가 가리키는 커밋에서 첫 번째 부모를 기준으로 몇 세대 이전의 커밋을 참조합니다.<!-- -->
<ul>
<li><code>HEAD~</code>: 첫 번째 부모 커밋</li>
<li><code>HEAD~2</code>: 두 세대 전의 커밋</li>
<li><code>HEAD~10</code>: 10 세대 전의 커밋</li>
</ul>
</li>
</ol>
<p><strong>HEAD^와 HEAD~의 차이점</strong></p>
<ul>
<li>단일 부모를 가진 커밋의 경우, <code>HEAD^</code>와 <code>HEAD~</code>는 동일한 커밋을 참조합니다.</li>
<li>병합 커밋의 경우:<!-- -->
<ul>
<li><code>HEAD^</code>: 첫 번째 부모 커밋을 참조하며, <code>HEAD^2</code>는 두 번째 부모를 참조합니다.</li>
<li><code>HEAD~</code>: 항상 첫 번째 부모를 기준으로 세대를 거슬러 올라갑니다.</li>
</ul>
</li>
</ul>
<p>차이를 보기 위하여 아래와 같은 예시를 보겠습니다.
브랜치 <code>feature</code>가 브랜치 <code>main</code>에 병합되면서 병합 커밋 <code>M</code>이 생성된 상황입니다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">A---B---C---M (main)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     \     /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      D---E (feature)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ol>
<li>
<p><code>git show HEAD^2</code></p>
<ul>
<li><code>HEAD</code>는 현재 커밋 <code>M</code>을 가리키며, <code>HEAD^2</code>는 병합 커밋 <code>M</code>의 두 번째 부모 커밋인 <code>E</code>를 참조합니다.</li>
</ul>
</li>
<li>
<p><code>git show HEAD~2</code></p>
<ul>
<li><code>HEAD~2</code>는 <code>HEAD</code>에서 첫 번째 부모를 두 번 거슬러 올라간 커밋, 즉 <code>B</code>를 참조합니다.</li>
</ul>
</li>
</ol>
<p><strong>2. 브랜치 포인터</strong></p>
<ul>
<li>각 브랜치의 최신 커밋을 가리키는 포인터</li>
<li><code>.git/refs/heads/</code> 디렉터리에 브랜치별로 저장</li>
<li>새로운 커밋이 생성되면 브랜치 포인터가 자동으로 이동</li>
</ul>
<p><strong>3. 태그 포인터</strong></p>
<ul>
<li>특정 커밋을 영구적으로 가리키는 포인터</li>
<li><code>.git/refs/tags/</code> 디렉터리에 저장</li>
<li>태그가 특정 커밋을 안정적으로 가리키기 위한 목적으로 사용됨, 하여 일반적으로 한번 생성되면 변경되지 않음.</li>
</ul>
<p><strong>4. 원격 브랜치 포인터</strong></p>
<ul>
<li>원격 저장소의 브랜치를 가리키는 포인터</li>
<li><code>.git/refs/remotes/</code> 디렉터리에 저장</li>
<li><code>fetch</code> 명령으로 업데이트됨</li>
</ul>
<p>이러한 포인터들은 Git의 핵심 메커니즘으로, 버전 관리와 브랜치 관리의 기반이 됩니다. 특히 <code>HEAD</code> 포인터는 현재 작업 중인 위치를 나타내는 중요한 역할을 하며, 브랜치 포인터와 함께 Git의 분산 버전 관리 시스템을 가능하게 합니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-명령어">Git 명령어<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-%EB%AA%85%EB%A0%B9%EC%96%B4" class="hash-link" aria-label="Direct link to Git 명령어" title="Direct link to Git 명령어">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-저장소-설정">1. 저장소 설정<a href="https://www.geuni.tech/en/git-commands-and-glossary#1-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 1. 저장소 설정" title="Direct link to 1. 저장소 설정">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-config">git config<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-config" class="hash-link" aria-label="Direct link to git config" title="Direct link to git config">​</a></h4>
<p><code>git config</code>는 Git의 설정을 관리하는 명령어입니다. 이 명령어를 사용하여 사용자 이름, 이메일, 에디터, 별칭 등을 설정하거나 확인할 수 있습니다. 설정은 전역(<code>global</code>), 로컬(<code>local</code>), 시스템(<code>system</code>) 레벨에서 관리됩니다.</p>
<p><strong>Git config 파일의 종류:</strong></p>
<ul>
<li><code>system</code> 설정 파일: 모든 사용자에게 적용 (많이 사용되지 않음)<!-- -->
<ul>
<li>macOS/Linux: <code>/etc/gitconfig</code> ,macOS 같은 경우 Homebrew로 설치시 <code>/usr/local/etc/gitconfig</code>에 위치하기도 함.</li>
<li>Windows: <code>C:\Program Files\Git\etc\gitconfig</code></li>
</ul>
</li>
<li><code>global</code> 설정 파일: 사용자 전체에 적용, <code>~/.gitconfig</code>에 위치.</li>
<li><code>local</code> 설정파일: 특정 저장소에만 적용, <code>&lt;repo&gt;/.git/config</code>에 위치하.</li>
</ul>
<p><code>-e</code> 옵션으로 config 파일 위치 확인가능(예:<code>git config --global -e</code>)</p>
<p><strong>global 설정 vs. local 설정:</strong> 일반적으로 사용자 정보는 전역 설정으로, 프로젝트별 설정은 로컬 설정으로 관리합니다.</p>
<p><strong>config 우선순위:</strong> local 설정 &gt; global 설정 &gt; system 설정 순으로 우선순위가 적용됩니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git config --list</code></td><td>현재 적용된 모든 설정을 확인.</td></tr><tr><td><code>git config --global</code></td><td>전역 설정을 관리. (사용자 전체에 적용)</td></tr><tr><td><code>git config --local</code></td><td>로컬 설정을 관리. (현재 저장소에만 적용)</td></tr><tr><td><code>git config --get &lt;key&gt;</code></td><td>특정 설정 값을 확인.</td></tr><tr><td><code>git config --add &lt;key&gt; &lt;value&gt;</code></td><td>새로운 설정을 추가.</td></tr><tr><td><code>git config --unset &lt;key&gt;</code></td><td>특정 설정을 삭제.</td></tr><tr><td><code>git config --edit</code> 또는 <code>-e</code></td><td>설정 파일을 편집기로 열어 수정.</td></tr><tr><td><code>git config --show-origin</code></td><td>설정 값의 출처를 확인.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 적용된 모든 설정 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 전역 설정 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 전역 설정에 사용자 이름 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> user.name </span><span class="token string" style="color:#e3116c">"John Doe"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 전역 설정에 사용자 이메일 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> user.email </span><span class="token string" style="color:#e3116c">"john@example.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 설정 값 확인 (예: 사용자 이름)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--get</span><span class="token plain"> user.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 설정 삭제 (예: 사용자 이름)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--unset</span><span class="token plain"> user.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 설정 파일 편집기로 열기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--edit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 설정 값의 출처 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config --show-origin user.name</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-alias">git alias<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-alias" class="hash-link" aria-label="Direct link to git alias" title="Direct link to git alias">​</a></h4>
<p><code>git alias</code>는 자주 사용하는 긴 명령어를 짧은 별칭으로 설정하여 편리하게 사용할 수 있도록 도와주는 기능입니다.<code>git config</code> 명령어를 통해 설정하거나, <code>.gitconfig</code> 파일을 직접 편집하여 설정할 수 있습니다.</p>
<p><strong>1. git config를 사용하여 alias 설정하기</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># alias 설정 (자주 사용하는 alias)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.co checkout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.br branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.ci commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.st status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.unstage </span><span class="token string" style="color:#e3116c">'reset HEAD --'</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 스테이징 영역에서 파일 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.last </span><span class="token string" style="color:#e3116c">'log -1 HEAD'</span><span class="token plain">      </span><span class="token comment" style="color:#999988;font-style:italic"># 마지막 커밋 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> alias.amend </span><span class="token string" style="color:#e3116c">'commit --amend'</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 마지막 커밋 수정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># alias 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config --get-regexp </span><span class="token builtin class-name">alias</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># alias 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--unset</span><span class="token plain"> alias.</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">별칭</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 사용 예시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> co main          </span><span class="token comment" style="color:#999988;font-style:italic"># `git checkout main`과 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> br               </span><span class="token comment" style="color:#999988;font-style:italic"># `git branch`와 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> ci </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"메시지"</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic"># `git commit -m "메시지"`와 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> st               </span><span class="token comment" style="color:#999988;font-style:italic"># `git status`와 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> unstage file.txt </span><span class="token comment" style="color:#999988;font-style:italic"># `git reset HEAD file.txt`와 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> last             </span><span class="token comment" style="color:#999988;font-style:italic"># `git log -1 HEAD`와 동일</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> amend            </span><span class="token comment" style="color:#999988;font-style:italic"># `git commit --amend`와 동일</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>2. .gitconfig 파일을 직접 편집하여 alias 설정하기</strong>
<code>.gitconfig</code> 파일을 직접 편집하여 alias를 설정할 수도 있습니다. <code>.gitconfig</code> 파일은 일반적으로 사용자의 홈 디렉토리(<code>~/.gitconfig</code>)에 위치합니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">alias</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    co </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> checkout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    br </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ci </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    st </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    last </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">-1</span><span class="token plain"> HEAD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    lg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--oneline</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--graph</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--decorate</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--all</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-저장소-초기화-및-클론">2. 저장소 초기화 및 클론<a href="https://www.geuni.tech/en/git-commands-and-glossary#2-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%B4%88%EA%B8%B0%ED%99%94-%EB%B0%8F-%ED%81%B4%EB%A1%A0" class="hash-link" aria-label="Direct link to 2. 저장소 초기화 및 클론" title="Direct link to 2. 저장소 초기화 및 클론">​</a></h3>
<p>git저장소를 만드는 방식에는 아래와 같이 <code>git init</code>, <code>git clone</code> 2가지 방식이 있습니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-init">git init<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-init" class="hash-link" aria-label="Direct link to git init" title="Direct link to git init">​</a></h4>
<p><code>git init</code>은 새로운 Git 저장소를 초기화하는 명령어입니다. 이 명령어는 현재 디렉토리 또는 지정한 디렉토리에 <code>.git</code>이라는 숨겨진 하위 디렉토리를 생성하여 Git 저장소로 만듭니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git init</code></td><td>현재 디렉토리에 새로운 Git 저장소를 초기화.</td></tr><tr><td><code>git init &lt;directory&gt;</code></td><td>지정한 디렉토리에 새로운 Git 저장소를 초기화.</td></tr><tr><td><code>git init --bare</code></td><td>작업 디렉토리 없이 베어 저장소를 초기화.</td></tr><tr><td><code>git init --quiet</code></td><td>초기화 과정에서 출력을 최소화.</td></tr><tr><td><code>git init --initial-branch &lt;name&gt;</code></td><td>초기 브랜치 이름을 지정. (기본값: <code>main</code>)</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 디렉토리에 새로운 Git 저장소 초기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 지정한 디렉토리에 새로운 Git 저장소 초기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> init my-repo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리 없이 베어 저장소 초기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> init </span><span class="token parameter variable" style="color:#36acaa">--bare</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 초기화 과정에서 출력 최소화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> init </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 초기 브랜치 이름을 지정하여 초기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> init --initial-branch develop</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-clone">git clone<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-clone" class="hash-link" aria-label="Direct link to git clone" title="Direct link to git clone">​</a></h4>
<p>git clone은 Git 버전 관리 시스템에서 원격 저장소(<code>remote repository</code>)에서 로컬 저장소(<code>local repository</code>)로 프로젝트를 복제하는 명령어입니다. 이 명령어는 원격 저장소의 전체 히스토리와 파일을 로컬 저장소로 가져오는 데 사용됩니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git clone &lt;repository&gt;</code></td><td>원격 저장소를 로컬로 복제.</td></tr><tr><td><code>git clone &lt;repository&gt; &lt;directory&gt;</code></td><td>원격 저장소를 지정한 디렉토리에 복제.</td></tr><tr><td><code>git clone --branch &lt;branch&gt;</code></td><td>특정 브랜치를 복제.</td></tr><tr><td><code>git clone --depth &lt;depth&gt;</code></td><td>특정 깊이만큼의 커밋 히스토리만 복제. (얕은 복제)</td></tr><tr><td><code>git clone --single-branch</code></td><td>특정 브랜치만 복제.</td></tr><tr><td><code>git clone --recurse-submodules</code></td><td>서브모듈을 포함하여 복제.</td></tr><tr><td><code>git clone --bare</code></td><td>작업 디렉토리 없이 복제. (베어 저장소)</td></tr><tr><td><code>git clone --mirror</code></td><td>원격 저장소를 미러링하여 복제.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 기본적인 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 지정한 디렉토리에 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone https://github.com/user/repo.git my-directory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 브랜치만 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone --single-branch </span><span class="token parameter variable" style="color:#36acaa">--branch</span><span class="token plain"> main https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 얕은 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone </span><span class="token parameter variable" style="color:#36acaa">--depth</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈 포함하여 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone --recurse-submodules https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리 없이 베어 저장소로 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone </span><span class="token parameter variable" style="color:#36acaa">--bare</span><span class="token plain"> https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소를 미러링하여 복제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> clone </span><span class="token parameter variable" style="color:#36acaa">--mirror</span><span class="token plain"> https://github.com/user/repo.git</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-변경-사항-추적-및-관리">3. 변경 사항 추적 및 관리<a href="https://www.geuni.tech/en/git-commands-and-glossary#3-%EB%B3%80%EA%B2%BD-%EC%82%AC%ED%95%AD-%EC%B6%94%EC%A0%81-%EB%B0%8F-%EA%B4%80%EB%A6%AC" class="hash-link" aria-label="Direct link to 3. 변경 사항 추적 및 관리" title="Direct link to 3. 변경 사항 추적 및 관리">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-status">git status<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-status" class="hash-link" aria-label="Direct link to git status" title="Direct link to git status">​</a></h4>
<p><code>git status</code>는 현재 작업 디렉토리와 스테이징 영역의 상태를 보여주는 Git 명령어입니다. 즉, 어떤 파일들이 변경되었는지, 변경된 파일들이 커밋될 준비가 되었는지 등을 한눈에 확인할 수 있습니다.</p>
<p><strong>git status 상태값 설명:</strong></p>
<table><thead><tr><th><code>git status</code> 상태</th><th>설명</th><th>추적 상태</th><th>파일 상태</th></tr></thead><tbody><tr><td><strong>Untracked</strong></td><td>Git이 추적하지 않는 새로운 파일. (<code>git add</code>로 스테이징 가능)</td><td>Untracked</td><td>-</td></tr><tr><td><strong>Modified</strong></td><td>Git이 추적 중인 파일이 수정되었으나 스테이징되지 않음.</td><td>Tracked</td><td>Modified</td></tr><tr><td><strong>Staged</strong></td><td>변경 사항이 스테이징 영역에 추가된 파일. (<code>git commit</code>으로 커밋 가능)</td><td>Tracked</td><td>Staged</td></tr><tr><td><strong>Unstaged</strong></td><td>변경 사항이 작업 디렉토리에 있으나 스테이징되지 않음.</td><td>Tracked</td><td>Unstaged</td></tr><tr><td><strong>Deleted</strong></td><td>Git이 추적 중인 파일이 삭제됨. (<code>git rm</code>으로 삭제를 스테이징 가능)</td><td>Tracked</td><td>Deleted</td></tr><tr><td><strong>Renamed</strong></td><td>이름이 변경된 파일. (<code>git mv</code> 또는 수동 변경 후 스테이징 필요)</td><td>Tracked</td><td>Renamed</td></tr><tr><td><strong>Copied</strong></td><td>기존 파일을 복사한 새 파일. (<code>git add</code>로 스테이징 가능)</td><td>Tracked</td><td>Copied</td></tr><tr><td><strong>Unmerged</strong></td><td>충돌이 발생한 파일. (충돌 해결 후 <code>git add</code> 필요)</td><td>Tracked</td><td>Unmerged</td></tr><tr><td><strong>Ignored</strong></td><td><code>.gitignore</code>에 의해 무시된 파일. (<code>git status --ignored</code>로 확인 가능)</td><td>Ignored</td><td>-</td></tr></tbody></table>
<p><strong><code>git status</code> 옵션:</strong></p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git status</code></td><td>작업 디렉토리와 스테이징 영역의 상태를 확인.</td></tr><tr><td><code>git status -s</code> 또는 <code>--short</code></td><td>상태 정보를 짧은 형식으로 확인.</td></tr><tr><td><code>git status --branch</code></td><td>브랜치 정보를 함께 확인.</td></tr><tr><td><code>git status --untracked-files</code> 또는 <code>-u</code></td><td>추적되지 않은 파일의 상태를 확인. (예: <code>no</code>, <code>normal</code>, <code>all</code>)</td></tr><tr><td><code>git status --verbose</code></td><td>상태 정보를 상세히 확인.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 기본 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 짧은 형식으로 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> status </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치 정보 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> status </span><span class="token parameter variable" style="color:#36acaa">--branch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 추적되지 않은 파일의 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> status --untracked-files</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 상세한 상태 정보 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> status </span><span class="token parameter variable" style="color:#36acaa">--verbose</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-add">git add<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-add" class="hash-link" aria-label="Direct link to git add" title="Direct link to git add">​</a></h4>
<p><code>git add</code>는 작업 디렉토리의 변경 사항을 스테이징 영역(<code>staging area</code>)에 추가하는 명령어입니다. 이 명령어는 커밋할 파일을 준비하는 데 사용되며, 변경 사항을 Git이 추적할 수 있도록 합니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git add &lt;file&gt;</code></td><td>특정 파일을 스테이징 영역에 추가.</td></tr><tr><td><code>git add .</code></td><td>현재 디렉토리의 모든 변경 사항을 스테이징 영역에 추가.</td></tr><tr><td><code>git add -A</code></td><td>작업 디렉토리의 모든 변경 사항을 스테이징 영역에 추가.</td></tr><tr><td><code>git add -u</code></td><td>추적 중인 파일의 변경 사항만 스테이징 영역에 추가.</td></tr><tr><td><code>git add --patch</code> 또는 <code>-p</code></td><td>변경 사항을 인터랙티브하게 선택하여 스테이징 영역에 추가.</td></tr><tr><td><code>git add --force</code> 또는 <code>-f</code></td><td>무시된 파일도 강제로 스테이징 영역에 추가.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일을 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 디렉토리의 모든 변경 사항을 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리의 모든 변경 사항을 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-A</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 추적 중인 파일의 변경 사항만 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경 사항을 인터랙티브하게 선택하여 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 무시된 파일도 강제로 스테이징 영역에 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--force</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-diff">git diff<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-diff" class="hash-link" aria-label="Direct link to git diff" title="Direct link to git diff">​</a></h4>
<p><code>git diff</code>는 Git에서 변경 사항을 비교하는 명령어입니다. 이 명령어는 작업 디렉토리, 스테이징 영역, 커밋 간의 차이를 확인할 때 사용됩니다. 파일의 추가, 삭제, 수정 사항을 라인 단위로 보여줍니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git diff</code></td><td>작업 디렉토리와 스테이징 영역의 차이를 확인.</td></tr><tr><td><code>git diff --cached</code></td><td>스테이징 영역과 최신 커밋의 차이를 확인.</td></tr><tr><td><code>git diff HEAD</code></td><td>작업 디렉토리와 최신 커밋의 차이를 확인.</td></tr><tr><td><code>git diff &lt;commit&gt;</code></td><td>작업 디렉토리와 특정 커밋의 차이를 확인.</td></tr><tr><td><code>git diff &lt;commit1&gt; &lt;commit2&gt;</code></td><td>두 커밋 간의 차이를 확인.</td></tr><tr><td><code>git diff --stat</code></td><td>변경된 파일의 통계를 확인.</td></tr><tr><td><code>git diff --name-only</code></td><td>변경된 파일의 이름만 확인.</td></tr><tr><td><code>git diff --name-status</code></td><td>변경된 파일의 이름과 상태(추가, 수정, 삭제 등)를 확인.</td></tr><tr><td><code>git diff --color</code></td><td>출력에 색상을 적용.</td></tr><tr><td><code>git diff --word-diff</code></td><td>단어 단위로 차이를 확인.</td></tr><tr><td><code>git diff --ignore-space-change</code></td><td>공백 변경을 무시하고 차이를 확인.</td></tr><tr><td><code>git diff --diff-filter=&lt;filter&gt;</code></td><td>특정 상태의 파일만 확인. (예: <code>A</code> 추가, <code>M</code> 수정, <code>D</code> 삭제)</td></tr><tr><td><code>git diff --check</code></td><td>공백 오류를 검사.</td></tr><tr><td><code>git diff --quiet</code></td><td>차이가 있는지 여부만 확인. (출력 없음)</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리와 스테이징 영역의 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 스테이징 영역과 최신 커밋의 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--cached</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리와 최신 커밋의 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> HEAD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리와 특정 커밋의 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 두 커밋 간의 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> abc1234 def5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 통계 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--stat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름만 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> --name-only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름과 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> --name-status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 출력에 색상 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--color</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 단어 단위로 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> --word-diff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 공백 변경을 무시하고 차이 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> --ignore-space-change</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 상태의 파일만 확인 (예: 추가된 파일)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> --diff-filter</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">A</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 공백 오류 검사</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--check</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 차이가 있는지 여부만 확인 (출력 없음)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">diff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-stash">git stash<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-stash" class="hash-link" aria-label="Direct link to git stash" title="Direct link to git stash">​</a></h4>
<p><code>git stash</code>는 작업 중인 변경 사항을 임시로 저장하는 명령어입니다. 현재 작업 디렉토리의 변경 사항을 스택에 저장하고, 깨끗한 상태로 만들어 다른 작업을 수행할 수 있습니다. 나중에 저장한 변경 사항을 다시 적용할 수 있습니다.</p>
<ul>
<li>git stash는 작업 디렉토리의 변경 사항을 스택에 저장합니다.</li>
<li>스태시는 여러 개 저장할 수 있으며, 각 스태시는 고유한 식별자(<code>stash@{n}</code>)를 가집니다.</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git stash</code></td><td>작업 중인 변경 사항을 임시로 저장.</td></tr><tr><td><code>git stash save "&lt;message&gt;"</code></td><td>메시지와 함께 변경 사항을 임시로 저장.</td></tr><tr><td><code>git stash list</code></td><td>저장된 스태시 목록을 확인.</td></tr><tr><td><code>git stash apply</code></td><td>가장 최근의 스태시를 적용.</td></tr><tr><td><code>git stash apply &lt;stash&gt;</code></td><td>특정 스태시를 적용.</td></tr><tr><td><code>git stash pop</code></td><td>가장 최근의 스태시를 적용하고 스택에서 제거.</td></tr><tr><td><code>git stash drop</code></td><td>가장 최근의 스태시를 스택에서 제거.</td></tr><tr><td><code>git stash clear</code></td><td>모든 스태시를 스택에서 제거.</td></tr><tr><td><code>git stash show</code></td><td>가장 최근의 스태시의 변경 사항을 확인.</td></tr><tr><td><code>git stash show -p</code></td><td>가장 최근의 스태시의 변경 사항을 패치 형식으로 확인.</td></tr><tr><td><code>git stash --include-untracked</code></td><td>추적되지 않은 파일도 함께 스태시에 저장.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 작업 중인 변경 사항을 임시로 저장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 메시지와 함께 변경 사항을 임시로 저장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash save </span><span class="token string" style="color:#e3116c">"WIP: Working on feature X"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 저장된 스태시 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가장 최근의 스태시 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash apply</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 스태시 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash apply stash@</span><span class="token punctuation" style="color:#393A34">{</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가장 최근의 스태시 적용 및 스택에서 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash pop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가장 최근의 스태시 스택에서 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash drop</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 스태시 스택에서 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash </span><span class="token function" style="color:#d73a49">clear</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가장 최근의 스태시의 변경 사항 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash show</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가장 최근의 스태시의 변경 사항을 패치 형식으로 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash show </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 추적되지 않은 파일도 함께 스태시에 저장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> stash --include-untracked</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-commit">git commit<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-commit" class="hash-link" aria-label="Direct link to git commit" title="Direct link to git commit">​</a></h4>
<p><code>git commit</code>은 스테이징 영역(<code>staging area</code>)에 있는 파일 변경 사항을 로컬 저장소에 저장하는 명령어입니다. 한 번의 커밋은 변경 사항의 논리적 단위를 의미하며, 작업의 스냅샷으로 볼수 있습니다.</p>
<p><strong>commit의 구성 요소:</strong></p>
<ul>
<li>커밋 해시 (Commit Hash): 커밋을 고유하게 식별하는 40자리의 SHA-1 해시 값.<!-- -->
<ul>
<li>해시 값은 커밋의 내용(변경 사항, 작성자, 날짜 등)을 기반으로 생성됨.</li>
</ul>
</li>
<li>트리 객체 (Tree Object): 커밋 시점의 작업 디렉토리 구조를 나타내는 객체입니다.<!-- -->
<ul>
<li>트리 객체는 파일과 디렉토리의 구조를 저장하며, 각 파일의 해시 값을 포함.</li>
<li>이를 통해 커밋 시점의 파일 상태를 재구성할 수 있음.</li>
</ul>
</li>
<li>부모 커밋 (Parent Commit): 현재 커밋의 이전 커밋(부모 커밋)을 가리키는 해시 값.<!-- -->
<ul>
<li>일반적으로 하나의 부모 커밋을 가지지만, 머지 커밋의 경우 두 개 이상의 부모 커밋을 가질 수 있음.</li>
<li>부모 커밋을 통해 커밋 히스토리를 추적 가능.</li>
</ul>
</li>
<li>작성자 (Author): 커밋을 만든 사람의 이름과 이메일.</li>
<li>커미터 (Committer): 커밋을 실제로 저장소에 기록한 사람의 이름과 이메일. (작성자와 커미터가 다른 경우가 있음)</li>
<li>커밋 날짜 (Commit Date): 커밋이 생성된 날짜와 시간.</li>
<li>커밋 메시지 (Commit Message): 커밋의 변경 사항에 대한 기술.</li>
<li>GPG 서명 (GPG Signature) (선택 사항): 커밋에 GPG 서명을 추가하여(<code>--gpg-sign</code> 옵션 사용) 커밋의 무결성(변조 여부)을 보장 가능.</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git commit</code></td><td>스테이징 영역의 변경 사항을 커밋. (커밋 메시지 편집기 열림)</td></tr><tr><td><code>git commit -m "&lt;message&gt;"</code></td><td>커밋 메시지를 직접 입력하여 커밋.</td></tr><tr><td><code>git commit -a</code></td><td>추적 중인 파일의 변경 사항을 자동으로 스테이징하고 커밋.</td></tr><tr><td><code>git commit --amend</code></td><td>최신 커밋을 수정. (커밋 메시지 변경 또는 파일 추가)</td></tr><tr><td><code>git commit --no-verify</code></td><td>커밋 전 후크(hook) 스크립트를 실행하지 않음.</td></tr><tr><td><code>git commit --allow-empty</code></td><td>빈 커밋을 생성. (변경 사항 없이 커밋)</td></tr><tr><td><code>git commit --signoff</code></td><td>커밋 메시지에 <code>Signed-off-by</code> 줄을 추가.</td></tr><tr><td><code>git commit --no-edit</code></td><td>커밋 메시지를 수정하지 않고 <code>--amend</code>를 수행.</td></tr><tr><td><code>git commit --fixup=&lt;commit&gt;</code></td><td>특정 커밋을 수정하기 위한 커밋을 생성. (<code>rebase --autosquash</code>와 함께 사용)</td></tr><tr><td><code>git commit --squash=&lt;commit&gt;</code></td><td>특정 커밋과 병합하기 위한 커밋을 생성. (<code>rebase --autosquash</code>와 함께 사용)</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 스테이징 영역의 변경 사항을 커밋 (커밋 메시지 편집기 열림)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지를 직접 입력하여 커밋</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Add new feature"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 추적 중인 파일의 변경 사항을 자동으로 스테이징하고 커밋</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Update tracked files"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 최신 커밋을 수정 (커밋 메시지 변경 또는 파일 추가)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--amend</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 전 후크(hook) 스크립트를 실행하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit --no-verify </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Bypass hooks"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 빈 커밋 생성 (변경 사항 없이 커밋)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit --allow-empty </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Empty commit"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지에 Signed-off-by 줄 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--signoff</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Add signoff"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지를 수정하지 않고 --amend 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--amend</span><span class="token plain"> --no-edit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋을 수정하기 위한 커밋 생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--fixup</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋과 병합하기 위한 커밋 생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">--squash</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">abc1234</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-log">git log<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-log" class="hash-link" aria-label="Direct link to git log" title="Direct link to git log">​</a></h4>
<p><code>git log</code>는 Git 저장소의 커밋 히스토리를 확인하는 명령어입니다. 이 명령어는 커밋의 해시, 작성자, 날짜, 커밋 메시지 등을 확인할 때 사용됩니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git log</code></td><td>커밋 히스토리를 확인.</td></tr><tr><td><code>git log -n &lt;number&gt;</code></td><td>최근 N개의 커밋만 확인.</td></tr><tr><td><code>git log --oneline</code></td><td>커밋 정보를 한 줄로 간단히 확인.</td></tr><tr><td><code>git log --stat</code></td><td>커밋에서 변경된 파일의 통계를 확인.</td></tr><tr><td><code>git log --patch</code> 또는 <code>-p</code></td><td>커밋에서 변경된 내용을 패치 형식으로 확인.</td></tr><tr><td><code>git log --graph</code></td><td>커밋 히스토리를 그래프 형식으로 확인.</td></tr><tr><td><code>git log --pretty=&lt;format&gt;</code></td><td>커밋 정보를 예쁘게(pretty) 출력. (예: <code>oneline</code>, <code>short</code>, <code>full</code>, <code>fuller</code>)</td></tr><tr><td><code>git log --since=&lt;date&gt;</code></td><td>특정 날짜 이후의 커밋만 확인. (예: <code>2023-10-01</code>, <code>2.weeks.ago</code>)</td></tr><tr><td><code>git log --until=&lt;date&gt;</code></td><td>특정 날짜 이전의 커밋만 확인. (예: <code>2023-10-31</code>, <code>1.day.ago</code>)</td></tr><tr><td><code>git log --author=&lt;pattern&gt;</code></td><td>특정 작성자의 커밋만 확인.</td></tr><tr><td><code>git log --grep=&lt;pattern&gt;</code></td><td>커밋 메시지에서 특정 패턴과 일치하는 커밋만 확인.</td></tr><tr><td><code>git log -- &lt;path&gt;</code></td><td>특정 파일 또는 디렉토리의 커밋 히스토리만 확인.</td></tr><tr><td><code>git log --no-merges</code></td><td>머지 커밋을 제외하고 확인.</td></tr><tr><td><code>git log --decorate</code></td><td>브랜치와 태그 정보를 함께 확인.</td></tr><tr><td><code>git log --abbrev-commit</code></td><td>커밋 해시를 짧게 표시.</td></tr><tr><td><code>git log --name-only</code></td><td>변경된 파일의 이름만 확인.</td></tr><tr><td><code>git log --name-status</code></td><td>변경된 파일의 이름과 상태(추가, 수정, 삭제 등)를 확인.</td></tr><tr><td><code>git log --all</code></td><td>모든 참조(브랜치, 태그 등)의 커밋 히스토리를 확인.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 커밋 히스토리 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 최근 5개의 커밋만 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 정보를 한 줄로 간단히 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--oneline</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋에서 변경된 파일의 통계 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--stat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋에서 변경된 내용을 패치 형식으로 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 히스토리를 그래프 형식으로 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--graph</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 정보를 예쁘게(pretty) 출력</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--pretty</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">oneline</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 날짜 이후의 커밋만 확인 (예: 2023-10-01 이후)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--since</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2023-10-01"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 날짜 이전의 커밋만 확인 (예: 2023-10-31 이전)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--until</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"2023-10-31"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 작성자의 커밋만 확인 (예: 작성자 이름이 "John")</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--author</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"John"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지에서 특정 패턴과 일치하는 커밋만 확인 (예: "bugfix")</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--grep</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"bugfix"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일 또는 디렉토리의 커밋 히스토리만 확인 (예: src/main.c)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log -- src/main.c</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 머지 커밋을 제외하고 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log --no-merges</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치와 태그 정보를 함께 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--decorate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 해시를 짧게 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log --abbrev-commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름만 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log --name-only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름과 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log --name-status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 참조(브랜치, 태그 등)의 커밋 히스토리 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> log </span><span class="token parameter variable" style="color:#36acaa">--all</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-show">git show<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-show" class="hash-link" aria-label="Direct link to git show" title="Direct link to git show">​</a></h4>
<p><code>git show</code>는 특정 커밋, 태그, 또는 트리의 상세 정보를 보여주는 명령어입니다. 이 명령어는 커밋의 변경 사항, 작성자, 날짜, 커밋 메시지 등을 확인할 때 유용합니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git show &lt;commit&gt;</code></td><td>특정 커밋의 상세 정보를 보여줌.</td></tr><tr><td><code>git show &lt;tag&gt;</code></td><td>특정 태그가 가리키는 커밋의 상세 정보를 보여줌.</td></tr><tr><td><code>git show &lt;tree&gt;</code></td><td>특정 트리의 상세 정보를 보여줌.</td></tr><tr><td><code>git show --oneline</code></td><td>커밋 정보를 한 줄로 간단히 보여줌.</td></tr><tr><td><code>git show --stat</code></td><td>커밋에서 변경된 파일의 통계를 보여줌.</td></tr><tr><td><code>git show --patch</code> 또는 <code>-p</code></td><td>커밋에서 변경된 내용을 패치 형식으로 보여줌.</td></tr><tr><td><code>git show --name-only</code></td><td>변경된 파일의 이름만 보여줌.</td></tr><tr><td><code>git show --name-status</code></td><td>변경된 파일의 이름과 상태(추가, 수정, 삭제 등)를 보여줌.</td></tr><tr><td><code>git show --format=&lt;format&gt;</code></td><td>커밋 정보를 사용자 정의 형식으로 출력.</td></tr><tr><td><code>git show --no-patch</code></td><td>패치 정보를 표시하지 않음.</td></tr><tr><td><code>git show --color</code></td><td>출력에 색상을 적용.</td></tr><tr><td><code>git show --quiet</code></td><td>커밋 메시지만 출력하고 다른 정보는 생략.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋의 상세 정보 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 태그가 가리키는 커밋의 상세 정보 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 트리의 상세 정보 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show HEAD:path/to/file</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 정보를 한 줄로 간단히 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--oneline</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋에서 변경된 파일의 통계 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--stat</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋에서 변경된 내용을 패치 형식으로 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름만 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show --name-only abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경된 파일의 이름과 상태 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show --name-status abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 정보를 사용자 정의 형식으로 출력</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--format</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"%h - %an, %ar : %s"</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 패치 정보 없이 커밋 메시지만 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show --no-patch abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 출력에 색상 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--color</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지만 출력</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> show </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><span class="token plain"> abc1234</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-브랜치-관리">5. 브랜치 관리<a href="https://www.geuni.tech/en/git-commands-and-glossary#5-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EA%B4%80%EB%A6%AC" class="hash-link" aria-label="Direct link to 5. 브랜치 관리" title="Direct link to 5. 브랜치 관리">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-branch">git branch<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-branch" class="hash-link" aria-label="Direct link to git branch" title="Direct link to git branch">​</a></h4>
<p><code>git branch</code>는 Git에서 브랜치를 생성, 조회, 삭제하는 명령어입니다. 브랜치는 작업을 분리하고 병합하는 데 필수적인 기능으로, <code>git branch</code>를 통해 브랜치를 효과적으로 관리할 수 있습니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git branch</code></td><td>로컬 브랜치 목록을 확인.</td></tr><tr><td><code>git branch &lt;branch&gt;</code></td><td>새로운 브랜치를 생성.</td></tr><tr><td><code>git branch -d &lt;branch&gt;</code></td><td>브랜치를 삭제. (병합된 브랜치만 삭제 가능)</td></tr><tr><td><code>git branch -D &lt;branch&gt;</code></td><td>브랜치를 강제 삭제. (병합되지 않은 브랜치도 삭제 가능)</td></tr><tr><td><code>git branch -m &lt;new-branch&gt;</code></td><td>현재 브랜치의 이름을 변경.</td></tr><tr><td><code>git branch -a</code></td><td>모든 브랜치(로컬 + 원격)를 확인.</td></tr><tr><td><code>git branch -r</code></td><td>원격 브랜치 목록을 확인.</td></tr><tr><td><code>git branch --merged</code></td><td>현재 브랜치에 병합된 브랜치 목록을 확인.</td></tr><tr><td><code>git branch --no-merged</code></td><td>현재 브랜치에 병합되지 않은 브랜치 목록을 확인.</td></tr><tr><td><code>git branch --set-upstream-to=&lt;remote&gt;/&lt;branch&gt;</code></td><td>현재 브랜치의 업스트림(추적 브랜치)을 설정.</td></tr><tr><td><code>git branch --unset-upstream</code></td><td>현재 브랜치의 업스트림(추적 브랜치) 설정을 해제.</td></tr><tr><td><code>git branch --verbose</code> 또는 <code>-v</code></td><td>각 브랜치의 최신 커밋 메시지와 함께 브랜치 목록을 확인.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 로컬 브랜치 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 새로운 브랜치 생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치 삭제 (병합된 브랜치만 삭제 가능)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치 강제 삭제 (병합되지 않은 브랜치도 삭제 가능)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">-D</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 이름 변경</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> new-branch-name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 브랜치(로컬 + 원격) 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 브랜치 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치에 병합된 브랜치 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">--merged</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치에 병합되지 않은 브랜치 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch --no-merged</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 업스트림 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch --set-upstream-to</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">origin/main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 업스트림 설정 해제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch --unset-upstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 각 브랜치의 최신 커밋 메시지와 함께 브랜치 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> branch </span><span class="token parameter variable" style="color:#36acaa">--verbose</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-checkout">git checkout<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-checkout" class="hash-link" aria-label="Direct link to git checkout" title="Direct link to git checkout">​</a></h4>
<p><code>git checkout</code>은 Git에서 브랜치를 전환하거나, 특정 커밋이나 파일로 작업 디렉토리를 되돌리는 데 사용되는 명령어입니다. 브랜치 전환, 파일 상태 복원, 커밋 체크아웃 등 다양한 작업에 활용됩니다.</p>
<p>현재는 <code>git --help</code>에도 조회가 안되지만 많이들 사용하는 명령입니다.</p>
<blockquote>
<p>The git-checkout(1) command is seen by many as hard to understand
because it connects two somewhat unrelated features: switching between
branches and restoring worktree files from arbitrary revisions. In 2019,
we thus implemented two new commands git-switch(1) and git-restore(1) to
split out these separate concerns into standalone functions. (참고: <a href="https://github.com/git/git/commit/028bb23a61653dde0481671a2ac4a4e83ce061b8" target="_blank" rel="noopener noreferrer">Commit 028bb23</a>)</p>
</blockquote>
<p>명령어 하나로 브랜치 전환, 파일 복구 두 무관한 기능이 연결된다는게 사용자한테 혼란을 주고있다는 얘기입니다.
그래서 Git 2.23 이후로 <code>git checkout</code> 명령어는, 아래서 나오는 <code>git-switch</code>, <code>git-restore</code> 두 명령어로 분리가 되었습니다.</p>
<p>그래도 아직까지 광범위하게 사용되고 있는 관계로 deprecate계획은 없다고 하죠.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git checkout &lt;branch&gt;</code></td><td>특정 브랜치로 전환.</td></tr><tr><td><code>git checkout -b &lt;new-branch&gt;</code></td><td>새로운 브랜치를 생성하고 전환.</td></tr><tr><td><code>git checkout &lt;commit&gt;</code></td><td>특정 커밋으로 작업 디렉토리를 이동. (Detached HEAD 상태)</td></tr><tr><td><code>git checkout -- &lt;file&gt;</code></td><td>작업 디렉토리의 특정 파일을 최신 커밋 상태로 되돌림.</td></tr><tr><td><code>git checkout .</code></td><td>작업 디렉토리의 모든 변경 사항을 최신 커밋 상태로 되돌림.</td></tr><tr><td><code>git checkout -f</code></td><td>강제로 작업 디렉토리를 최신 커밋 상태로 되돌림. (변경 사항 무시)</td></tr><tr><td><code>git checkout --patch</code> 또는 <code>-p</code></td><td>변경 사항을 인터랙티브하게 선택하여 되돌림.</td></tr><tr><td><code>git checkout --track &lt;remote&gt;/&lt;branch&gt;</code></td><td>원격 브랜치를 추적하는 로컬 브랜치를 생성하고 전환.</td></tr><tr><td><code>git checkout --detach</code></td><td>현재 브랜치를 Detached HEAD 상태로 전환.</td></tr><tr><td><code>git checkout --merge</code></td><td>브랜치 전환 시 충돌이 발생하면 자동으로 병합을 시도.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 브랜치로 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 새로운 브랜치 생성 및 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">-b</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋으로 이동 (Detached HEAD 상태)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리의 특정 파일을 최신 커밋 상태로 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout -- file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리의 모든 변경 사항을 최신 커밋 상태로 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token builtin class-name">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 강제로 작업 디렉토리를 최신 커밋 상태로 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경 사항을 인터랙티브하게 선택하여 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 브랜치를 추적하는 로컬 브랜치 생성 및 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">--track</span><span class="token plain"> origin/feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치를 Detached HEAD 상태로 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">--detach</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치 전환 시 충돌이 발생하면 자동으로 병합 시도</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout </span><span class="token parameter variable" style="color:#36acaa">--merge</span><span class="token plain"> feature-branch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-switch">git switch<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-switch" class="hash-link" aria-label="Direct link to git switch" title="Direct link to git switch">​</a></h4>
<p><code>git switch</code>는 Git 2.23 버전부터 도입된 명령어로, git checkout의 브랜치 전환 기능을 더 명확하게 분리한 명령어입니다. git switch는 브랜치 전환에 특화되어 있으며, git checkout보다 더 직관적이고 안전하게 사용할 수 있습니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git switch &lt;branch&gt;</code></td><td>특정 브랜치로 전환.</td></tr><tr><td><code>git switch -c &lt;new-branch&gt;</code></td><td>새로운 브랜치를 생성하고 전환.</td></tr><tr><td><code>git switch --detach &lt;commit&gt;</code></td><td>특정 커밋으로 작업 디렉토리를 이동. (Detached HEAD 상태)</td></tr><tr><td><code>git switch --track &lt;remote&gt;/&lt;branch&gt;</code></td><td>원격 브랜치를 추적하는 로컬 브랜치를 생성하고 전환.</td></tr><tr><td><code>git switch --force</code></td><td>충돌이 발생해도 강제로 브랜치를 전환.</td></tr><tr><td><code>git switch --merge</code></td><td>브랜치 전환 시 충돌이 발생하면 자동으로 병합을 시도.</td></tr></tbody></table>
<p><strong>사용예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 브랜치로 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 새로운 브랜치 생성 및 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋으로 이동 (Detached HEAD 상태)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch </span><span class="token parameter variable" style="color:#36acaa">--detach</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 브랜치를 추적하는 로컬 브랜치 생성 및 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch </span><span class="token parameter variable" style="color:#36acaa">--track</span><span class="token plain"> origin/feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌이 발생해도 강제로 브랜치 전환</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch </span><span class="token parameter variable" style="color:#36acaa">--force</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 브랜치 전환 시 충돌이 발생하면 자동으로 병합 시도</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> switch </span><span class="token parameter variable" style="color:#36acaa">--merge</span><span class="token plain"> feature-branch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-merge">git merge<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-merge" class="hash-link" aria-label="Direct link to git merge" title="Direct link to git merge">​</a></h4>
<p><code>git merge</code>는 두 브랜치의 변경 사항을 하나로 합치는 명령어입니다. 주로 기능 개발이 완료된 브랜치를 메인 브랜치에 병합할 때 사용됩니다. 병합은 <code>Fast-forward</code>, <code>3-way merge</code>, <code>Conflict Resolution</code>(충돌해결) 등 다양한 방식으로 이루어질 수 있습니다.</p>
<p><strong>병합 방식:</strong></p>
<table><thead><tr><th>병합 방식</th><th>조건</th><th>설명</th></tr></thead><tbody><tr><td><code>-ff</code> (default)</td><td>분기 없음 또는 동일한 분기 내용</td><td>브랜치 포인터를 병합 대상 브랜치 끝으로 이동. 히스토리 선형 유지. 병합 커밋 생성되지 않음.</td></tr><tr><td><code>--no-ff</code></td><td>조건 없음</td><td>Fast-Forward 가능 여부와 상관없이 항상 병합 커밋 생성. 히스토리에 병합 작업을 명확히 표시.</td></tr><tr><td><code>--ff-only</code></td><td>분기 없음</td><td>Fast-Forward 병합만 허용. 불가능하면 병합 중단. 히스토리를 선형으로 유지해야 할 때 사용.</td></tr><tr><td><code>3-way</code></td><td>분기 있음</td><td>공통 조상을 기준으로 병합 커밋 생성. 히스토리에 분기 흔적 남음. 충돌 발생 시 수동 해결 필요.</td></tr><tr><td><code>--squash</code></td><td>조건 없음</td><td>병합 대상 브랜치의 모든 커밋을 하나로 압축하여 적용. 히스토리 선형 유지, 개별 커밋 히스토리는 남지 않음.</td></tr></tbody></table>
<p><strong>Fast-forward merge: <code>--ff</code> vs <code>--no-ff</code> :</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">* main 브랜치에서 feature 브랜치를 병합할 때</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - main:    A --- B --- C</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - feature:           D --- E --- F</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1. `git merge --no-ff feature` 실행</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - main:    A --- B --- C ------------------- M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      \                     /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - feature:           D --- E --- F ---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - 병합 커밋(M)이 생성됨</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - feature 브랜치의 히스토리가 main 브랜치에 그대로 유지됨</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. `git merge --ff feature` 실행 (Fast-Forward 가능한 경우)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - main:    A --- B --- C --- D --- E --- F</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - feature:           D --- E --- F</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - 병합 커밋이 생성되지 않음</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  - main 브랜치가 feature 브랜치의 최신 커밋으로 이동함</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git merge &lt;branch&gt;</code></td><td>현재 브랜치에 특정 브랜치를 병합.</td></tr><tr><td><code>git merge --no-ff &lt;branch&gt;</code></td><td>Fast-forward 병합을 비활성화하고 항상 새로운 병합 커밋을 생성.</td></tr><tr><td><code>git merge --ff-only &lt;branch&gt;</code></td><td>Fast-forward 병합만 허용. Fast-forward가 불가능하면 병합을 중단.</td></tr><tr><td><code>git merge --squash &lt;branch&gt;</code></td><td>특정 브랜치의 변경 사항을 현재 브랜치로 가져오되, 새로운 커밋으로 묶어서 병합.</td></tr><tr><td><code>git merge --abort</code></td><td>병합 중 충돌이 발생한 경우, 병합 프로세스를 중단하고 병합 전 상태로 되돌림.</td></tr><tr><td><code>git merge --continue</code></td><td>충돌을 해결한 후 병합 프로세스를 계속 진행.</td></tr><tr><td><code>git merge --no-commit &lt;branch&gt;</code></td><td>병합을 수행하지만 자동으로 커밋하지 않음.</td></tr><tr><td><code>git merge --stat</code></td><td>병합 후 변경 사항의 통계를 보여줌.</td></tr><tr><td><code>git merge --strategy=&lt;전략&gt;</code></td><td>병합 전략을 지정. 예: <code>recursive</code>, <code>ours</code>, <code>subtree</code> 등.</td></tr><tr><td><code>git merge --strategy-option=&lt;옵션&gt;</code></td><td>병합 전략에 대한 옵션을 지정. 예: <code>ours</code>, <code>theirs</code>, <code>patience</code> 등.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치에 특정 브랜치 병합</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Fast-forward 병합 비활성화 (항상 새로운 병합 커밋 생성)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge --no-ff feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Fast-forward 병합만 허용 (불가능하면 중단)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge --ff-only feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 브랜치의 변경 사항을 Squash하여 병합</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge </span><span class="token parameter variable" style="color:#36acaa">--squash</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합 중 충돌 발생 시 병합 중단 및 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge </span><span class="token parameter variable" style="color:#36acaa">--abort</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌 해결 후 병합 계속 진행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge </span><span class="token parameter variable" style="color:#36acaa">--continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합을 수행하지만 커밋하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge --no-commit feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합 후 변경 사항 통계 보기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge </span><span class="token parameter variable" style="color:#36acaa">--stat</span><span class="token plain"> feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합 전략 지정 (예: recursive)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge </span><span class="token parameter variable" style="color:#36acaa">--strategy</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">recursive feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합 전략 옵션 지정 (예: ours)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> merge --strategy-option</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">ours feature-branch</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-원격-저장소">6. 원격 저장소<a href="https://www.geuni.tech/en/git-commands-and-glossary#6-%EC%9B%90%EA%B2%A9-%EC%A0%80%EC%9E%A5%EC%86%8C" class="hash-link" aria-label="Direct link to 6. 원격 저장소" title="Direct link to 6. 원격 저장소">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-remote">git remote<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-remote" class="hash-link" aria-label="Direct link to git remote" title="Direct link to git remote">​</a></h4>
<p><code>git remote</code>는 원격 저장소를 관리하는 명령어입니다. 원격 저장소를 추가, 조회, 삭제하거나, 원격 저장소의 URL을 변경하는 등의 작업을 수행할 수 있습니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git remote</code></td><td>등록된 원격 저장소 목록을 확인.</td></tr><tr><td><code>git remote -v</code></td><td>등록된 원격 저장소 목록과 URL을 함께 확인.</td></tr><tr><td><code>git remote add &lt;name&gt; &lt;url&gt;</code></td><td>새로운 원격 저장소를 추가.</td></tr><tr><td><code>git remote remove &lt;name&gt;</code></td><td>등록된 원격 저장소를 삭제.</td></tr><tr><td><code>git remote rename &lt;old&gt; &lt;new&gt;</code></td><td>원격 저장소의 이름을 변경.</td></tr><tr><td><code>git remote set-url &lt;name&gt; &lt;url&gt;</code></td><td>원격 저장소의 URL을 변경.</td></tr><tr><td><code>git remote show &lt;name&gt;</code></td><td>특정 원격 저장소의 상세 정보를 확인.</td></tr><tr><td><code>git remote prune &lt;name&gt;</code></td><td>원격 저장소에서 삭제된 브랜치를 로컬에서 정리.</td></tr><tr><td><code>git remote update</code></td><td>원격 저장소의 모든 브랜치와 태그를 업데이트.</td></tr><tr><td><code>git remote get-url &lt;name&gt;</code></td><td>특정 원격 저장소의 URL을 확인.</td></tr><tr><td><code>git remote set-branches &lt;name&gt; &lt;branch&gt;</code></td><td>원격 저장소에서 추적할 브랜치를 지정.</td></tr><tr><td><code>git remote add --track &lt;branch&gt; &lt;name&gt; &lt;url&gt;</code></td><td>원격 저장소를 추가하면서 특정 브랜치를 추적하도록 설정.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 등록된 원격 저장소 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 등록된 원격 저장소 목록과 URL 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote </span><span class="token parameter variable" style="color:#36acaa">-v</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 새로운 원격 저장소 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> origin https://github.com/user/repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 등록된 원격 저장소 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote remove origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소 이름 변경</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote </span><span class="token function" style="color:#d73a49">rename</span><span class="token plain"> origin upstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소 URL 변경</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote set-url origin https://github.com/user/new-repo.git</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소의 상세 정보 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote show origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소에서 삭제된 브랜치를 로컬에서 정리</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote prune origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소의 모든 브랜치와 태그 업데이트</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소의 URL 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote get-url origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소에서 추적할 브랜치 지정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote set-branches origin main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소를 추가하면서 특정 브랜치 추적 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> remote </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--track</span><span class="token plain"> main origin https://github.com/user/repo.git</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-pull">git pull<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-pull" class="hash-link" aria-label="Direct link to git pull" title="Direct link to git pull">​</a></h4>
<p><code>git pull</code>은 원격 저장소의 변경 사항을 로컬 저장소로 가져와 병합하는 명령어입니다. <code>git fetch</code>와 <code>git merge</code>를 합친 기능으로, 원격 브랜치의 최신 상태를 로컬에 반영할 때 사용됩니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git pull</code></td><td>현재 브랜치의 원격 저장소 변경 사항을 가져와 병합.</td></tr><tr><td><code>git pull &lt;remote&gt; &lt;branch&gt;</code></td><td>특정 원격 저장소와 브랜치의 변경 사항을 가져와 병합.</td></tr><tr><td><code>git pull --rebase</code></td><td>변경 사항을 가져온 후 병합 대신 리베이스를 수행.</td></tr><tr><td><code>git pull --ff-only</code></td><td>Fast-forward 병합만 허용. Fast-forward가 불가능하면 중단.</td></tr><tr><td><code>git pull --no-ff</code></td><td>Fast-forward 병합을 비활성화하고 항상 새로운 병합 커밋을 생성.</td></tr><tr><td><code>git pull --autostash</code></td><td>작업 중인 변경 사항을 임시로 저장(stash)하고, 병합 후 다시 적용.</td></tr><tr><td><code>git pull --no-commit</code></td><td>병합을 수행하지만 자동으로 커밋하지 않음.</td></tr><tr><td><code>git pull --tags</code></td><td>원격 저장소의 모든 태그를 가져옴.</td></tr><tr><td><code>git pull --no-tags</code></td><td>태그를 가져오지 않음.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 원격 저장소 변경 사항을 가져와 병합</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소와 브랜치의 변경 사항을 가져와 병합</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull origin main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경 사항을 가져온 후 리베이스 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull </span><span class="token parameter variable" style="color:#36acaa">--rebase</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Fast-forward 병합만 허용 (불가능하면 중단)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull --ff-only</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Fast-forward 병합 비활성화 (항상 새로운 병합 커밋 생성)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull --no-ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 중인 변경 사항을 임시로 저장하고 병합 후 다시 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull </span><span class="token parameter variable" style="color:#36acaa">--autostash</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합을 수행하지만 커밋하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull --no-commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소의 모든 태그를 가져옴</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull </span><span class="token parameter variable" style="color:#36acaa">--tags</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 태그를 가져오지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> pull --no-tags</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-push">git push<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-push" class="hash-link" aria-label="Direct link to git push" title="Direct link to git push">​</a></h4>
<p><code>git push</code>는 로컬 저장소의 변경 사항을 원격 저장소에 업로드하는 명령어입니다. 주로 로컬에서 작업한 커밋을 원격 저장소와 동기화할 때 사용됩니다. 브랜치, 태그, 또는 특정 커밋을 원격 저장소로 푸시할 수 있습니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git push</code></td><td>현재 브랜치의 변경 사항을 원격 저장소에 푸시.</td></tr><tr><td><code>git push &lt;remote&gt; &lt;branch&gt;</code></td><td>특정 원격 저장소와 브랜치에 변경 사항을 푸시.</td></tr><tr><td><code>git push &lt;remote&gt; &lt;tag-name&gt;</code></td><td>특정 태그를 원격 저장소에 푸시.</td></tr><tr><td><code>git push --all</code></td><td>모든 브랜치의 변경 사항을 원격 저장소에 푸시.</td></tr><tr><td><code>git push --tags</code></td><td>모든 태그를 원격 저장소에 푸시.</td></tr><tr><td><code>git push --force</code> 또는 <code>-f</code></td><td>강제로 변경 사항을 푸시. (주의: 원격 저장소의 기존 커밋을 덮어씀)</td></tr><tr><td><code>git push --force-with-lease</code></td><td>강제로 푸시하되, 원격 브랜치가 로컬과 동일한 상태일 때만 수행.</td></tr><tr><td><code>git push --delete &lt;remote&gt; &lt;branch&gt;</code></td><td>원격 저장소의 특정 브랜치를 삭제.</td></tr><tr><td><code>git push --set-upstream &lt;remote&gt; &lt;branch&gt;</code></td><td>현재 브랜치를 원격 저장소에 푸시하고, 업스트림(추적) 브랜치로 설정.</td></tr><tr><td><code>git push --dry-run</code></td><td>푸시를 시뮬레이션. 실제로 푸시하지 않고 어떤 변경 사항이 푸시될지 확인.</td></tr><tr><td><code>git push --prune</code></td><td>원격 저장소에서 로컬에 존재하지 않는 브랜치를 삭제.</td></tr><tr><td><code>git push --no-verify</code></td><td>푸시 전 후크(hook) 스크립트를 실행하지 않음.</td></tr><tr><td><code>git push --follow-tags</code></td><td>푸시할 때 자동으로 태그를 함께 푸시.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 변경 사항을 원격 저장소에 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소와 브랜치에 변경 사항 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push origin main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 태그를 원격 저장소에 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push origin v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 브랜치의 변경 사항을 원격 저장소에 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 태그를 원격 저장소에 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">--tags</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 강제로 변경 사항 푸시 (주의: 원격 저장소의 기존 커밋을 덮어씀)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">--force</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 강제로 푸시하되, 원격 브랜치가 로컬과 동일한 상태일 때만 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push --force-with-lease</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소의 특정 브랜치 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">--delete</span><span class="token plain"> origin old-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치를 원격 저장소에 푸시하고 업스트림 브랜치로 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push --set-upstream origin feature-branch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 푸시를 시뮬레이션 (실제로 푸시하지 않음)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push --dry-run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소에서 로컬에 존재하지 않는 브랜치 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">--prune</span><span class="token plain"> origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 푸시 전 후크(hook) 스크립트를 실행하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push --no-verify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 푸시할 때 자동으로 태그를 함께 푸시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push --follow-tags</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-fetch">git fetch<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-fetch" class="hash-link" aria-label="Direct link to git fetch" title="Direct link to git fetch">​</a></h4>
<p><code>git fetch</code>는 원격 저장소의 변경 사항을 로컬 저장소로 가져오는 명령어입니다. <code>git pull</code>과 달리, fetch는 가져온 변경 사항을 자동으로 병합하지 않습니다. 따라서 원격 저장소의 상태를 확인하고, 필요할 때 수동으로 병합할 수 있어 보다 안전한 명령입니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git fetch</code></td><td>원격 저장소의 모든 변경 사항을 가져옴.</td></tr><tr><td><code>git fetch &lt;remote&gt;</code></td><td>지정한 원격 저장소의 모든 변경 사항을 가져옴.</td></tr><tr><td><code>git fetch &lt;remote&gt; &lt;branch&gt;</code></td><td>지정한 원격 저장소의 특정 브랜치만 가져옴.</td></tr><tr><td><code>git fetch --all</code></td><td>모든 원격 저장소의 데이터를 가져옴.</td></tr><tr><td><code>git fetch --prune</code></td><td>로컬에 없는 원격 브랜치를 제거.</td></tr><tr><td><code>git fetch --tags</code></td><td>원격 저장소의 모든 태그를 가져옴.</td></tr><tr><td><code>git fetch --force</code></td><td>로컬 브랜치의 변경 사항을 강제로 덮어쓰며 원격 데이터를 가져옴.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소의 모든 변경 사항 가져오기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소의 변경 사항 가져오기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch origin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 원격 저장소의 특정 브랜치 변경 사항 가져오기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch origin main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 원격 저장소의 변경 사항 가져오기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch </span><span class="token parameter variable" style="color:#36acaa">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소에서 삭제된 브랜치를 로컬에서 정리</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch </span><span class="token parameter variable" style="color:#36acaa">--prune</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 원격 저장소의 모든 태그 가져오기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch </span><span class="token parameter variable" style="color:#36acaa">--tags</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 강제로 변경 사항 가져오기 (원격 브랜치가 강제로 없데이트 되어, 원격 참조(브랜치, 태그, HEAD등)가 변한경우)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> fetch </span><span class="token parameter variable" style="color:#36acaa">--force</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="7-태그">7. 태그<a href="https://www.geuni.tech/en/git-commands-and-glossary#7-%ED%83%9C%EA%B7%B8" class="hash-link" aria-label="Direct link to 7. 태그" title="Direct link to 7. 태그">​</a></h3>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="git-tag">git tag<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-tag" class="hash-link" aria-label="Direct link to git tag" title="Direct link to git tag">​</a></h5>
<p><code>git tag</code>는 특정 커밋에 태그를 추가하거나 관리하는 명령어입니다. 태그는 일반적으로 릴리스 버전(예: v1.0.0)을 표시하는 데 사용되며, 커밋을 쉽게 참조할 수 있도록 합니다. 태그는 <code>Lightweight</code> 태그와 <code>Annotated</code> 태그로 구분됩니다.</p>
<ul>
<li><code>Lightweight</code> 태그: 단순히 커밋을 가리키는 이름입니다. 추가 정보(메시지, 서명 등)가 없습니다.(<code>git tag &lt;tagname&gt;</code>로 생성.)</li>
<li><code>Annotated</code> 태그: 태그 이름 외에 메시지, 서명, 작성자 정보 등을 포함합니다. 일반적으로 릴리스 버전을 표시할 때 사용됩니다. (<code>git tag -a &lt;tagname&gt;</code>로 생성.)</li>
<li>태그 푸시: 태그는 기본적으로 <code>git push</code>로 원격 저장소에 푸시되지 않습니다. 태그를 푸시하려면 명시적으로 지정해야 합니다.(<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-push">git push참고</a>
)</li>
<li>태그 삭제(<code>-d</code>) 후 원격 저장소에서 태그를 삭제하려면 <code>git push &lt;remote&gt; --delete &lt;tagname&gt;</code>을 사용해야 합니다.</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git tag</code></td><td>모든 태그 목록을 확인.</td></tr><tr><td><code>git tag &lt;tagname&gt;</code></td><td>현재 커밋에 Lightweight 태그를 추가.</td></tr><tr><td><code>git tag -a &lt;tagname&gt;</code></td><td>현재 커밋에 Annotated 태그를 추가. (메시지 입력 필요)</td></tr><tr><td><code>git tag -a &lt;tagname&gt; -m "&lt;message&gt;"</code></td><td>Annotated 태그를 추가하고 메시지를 함께 지정.</td></tr><tr><td><code>git tag &lt;tagname&gt; &lt;commit&gt;</code></td><td>특정 커밋에 태그를 추가.</td></tr><tr><td><code>git tag -d &lt;tagname&gt;</code></td><td>특정 태그를 삭제.</td></tr><tr><td><code>git tag -l "&lt;pattern&gt;"</code></td><td>특정 패턴과 일치하는 태그 목록을 확인. (예: <code>v1.*</code>)</td></tr><tr><td><code>git tag --contains &lt;commit&gt;</code></td><td>특정 커밋을 포함하는 태그 목록을 확인.</td></tr><tr><td><code>git tag --points-at &lt;commit&gt;</code></td><td>특정 커밋을 가리키는 태그 목록을 확인.</td></tr><tr><td><code>git tag --sort=&lt;key&gt;</code></td><td>태그 목록을 특정 키로 정렬. (예: <code>version:refname</code>, <code>-version:refname</code>)</td></tr><tr><td><code>git tag -f &lt;tagname&gt;</code></td><td>기존 태그를 강제로 덮어씀. (주의: 이미 공개된 태그는 덮어쓰지 않는 것이 좋음)</td></tr><tr><td><code>git tag --sign</code></td><td>태그에 GPG 서명을 추가. (Annotated 태그에서만 가능)</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 모든 태그 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 커밋에 Lightweight 태그 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 커밋에 Annotated 태그 추가 (메시지 입력 필요)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Annotated 태그 추가 및 메시지 지정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> v1.0.0 </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Release version 1.0.0"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋에 태그 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag v1.0.0 abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 태그 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 패턴과 일치하는 태그 목록 확인 (예: v1.*)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1.*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋을 포함하는 태그 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">--contains</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋을 가리키는 태그 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag --points-at abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 태그 목록을 버전 순으로 정렬</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">--sort</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">version:refname</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 태그 목록을 역순으로 정렬</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">--sort</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">-version:refname</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 기존 태그 강제로 덮어쓰기 (주의: 공개된 태그는 덮어쓰지 않는 것이 좋음)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> v1.0.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 태그에 GPG 서명 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag </span><span class="token parameter variable" style="color:#36acaa">--sign</span><span class="token plain"> v1.0.0</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="8-로그-및-변경이력">8. 로그 및 변경이력<a href="https://www.geuni.tech/en/git-commands-and-glossary#8-%EB%A1%9C%EA%B7%B8-%EB%B0%8F-%EB%B3%80%EA%B2%BD%EC%9D%B4%EB%A0%A5" class="hash-link" aria-label="Direct link to 8. 로그 및 변경이력" title="Direct link to 8. 로그 및 변경이력">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-log-1"><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-log">🔗git log</a><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-log-1" class="hash-link" aria-label="Direct link to git-log-1" title="Direct link to git-log-1">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-show-1"><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-show">🔗git show</a><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-show-1" class="hash-link" aria-label="Direct link to git-show-1" title="Direct link to git-show-1">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-blame">git blame<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-blame" class="hash-link" aria-label="Direct link to git blame" title="Direct link to git blame">​</a></h4>
<p><code>git blame</code>은 특정 파일의 각 줄을 마지막으로 수정한 커밋과 작성자를 확인하는 명령어입니다. 이 명령어는 코드의 특정 부분이 누구에 의해, 언제 수정되었는지 추적할 때 유용합니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git blame &lt;file&gt;</code></td><td>특정 파일의 각 줄을 마지막으로 수정한 커밋과 작성자를 확인.</td></tr><tr><td><code>git blame -L &lt;start&gt;,&lt;end&gt; &lt;file&gt;</code></td><td>특정 파일의 특정 줄 범위를 확인.</td></tr><tr><td><code>git blame -C &lt;file&gt;</code></td><td>파일 내에서 복사된 코드의 원본 커밋을 추적.</td></tr><tr><td><code>git blame -M &lt;file&gt;</code></td><td>파일 내에서 이동된 코드의 원본 커밋을 추적.</td></tr><tr><td><code>git blame -w</code></td><td>공백 변경을 무시하고 코드 변경만 확인.</td></tr><tr><td><code>git blame -e</code></td><td>작성자의 이메일 주소를 표시.</td></tr><tr><td><code>git blame -l</code></td><td>커밋 해시의 전체 길이를 표시.</td></tr><tr><td><code>git blame -t</code></td><td>커밋의 타임스탬프를 표시.</td></tr><tr><td><code>git blame -s</code></td><td>커밋 해시의 짧은 버전을 표시.</td></tr><tr><td><code>git blame --ignore-rev &lt;commit&gt;</code></td><td>특정 커밋을 무시하고 결과를 표시.</td></tr><tr><td><code>git blame --ignore-revs-file &lt;file&gt;</code></td><td>특정 파일에 나열된 커밋을 무시하고 결과를 표시.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일의 각 줄을 마지막으로 수정한 커밋과 작성자 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일의 10번째 줄부터 20번째 줄까지 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-L</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10,20</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 파일 내에서 복사된 코드의 원본 커밋 추적</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-C</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 파일 내에서 이동된 코드의 원본 커밋 추적</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-M</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 공백 변경을 무시하고 코드 변경만 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-w</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작성자의 이메일 주소 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 해시의 전체 길이 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋의 타임스탬프 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 해시의 짧은 버전 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋을 무시하고 결과 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame --ignore-rev abc1234 README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일에 나열된 커밋을 무시하고 결과 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> blame --ignore-revs-file .git-blame-ignore-revs README.md</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-reflog">git reflog<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-reflog" class="hash-link" aria-label="Direct link to git reflog" title="Direct link to git reflog">​</a></h4>
<p><code>git reflog</code>는 Reference Logs의 약자로, Git에서 HEAD와 브랜치의 이동 기록을 보여주는 명령어입니다. 이 명령어는 실수로 삭제한 브랜치나 커밋을 복구할 때 매우 유용합니다. reflog는 로컬 저장소에서만 유지되며, 원격 저장소와는 동기화되지 않습니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git reflog</code></td><td>HEAD의 이동 기록을 확인.</td></tr><tr><td><code>git reflog &lt;branch&gt;</code></td><td>특정 브랜치의 이동 기록을 확인.</td></tr><tr><td><code>git reflog --all</code></td><td>모든 참조(브랜치, 태그 등)의 이동 기록을 확인.</td></tr><tr><td><code>git reflog --date=&lt;format&gt;</code></td><td>날짜 형식을 지정하여 기록을 확인. (예: <code>iso</code>, <code>relative</code>, <code>local</code>)</td></tr><tr><td><code>git reflog --since=&lt;time&gt;</code></td><td>특정 시간 이후의 기록만 확인. (예: <code>2.weeks.ago</code>, <code>2023-10-01</code>)</td></tr><tr><td><code>git reflog --until=&lt;time&gt;</code></td><td>특정 시간 이전의 기록만 확인. (예: <code>1.day.ago</code>, <code>2023-10-31</code>)</td></tr><tr><td><code>git reflog --grep=&lt;pattern&gt;</code></td><td>특정 패턴과 일치하는 기록만 확인.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># HEAD의 이동 기록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 브랜치의 이동 기록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 참조(브랜치, 태그 등)의 이동 기록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog </span><span class="token parameter variable" style="color:#36acaa">--all</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 날짜 형식을 지정하여 기록 확인 (예: ISO 형식)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog </span><span class="token parameter variable" style="color:#36acaa">--date</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">iso</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 시간 이후의 기록만 확인 (예: 2주 전부터)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog </span><span class="token parameter variable" style="color:#36acaa">--since</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">.weeks.ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 시간 이전의 기록만 확인 (예: 1일 전까지)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog </span><span class="token parameter variable" style="color:#36acaa">--until</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">.day.ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 패턴과 일치하는 기록만 확인 (예: "merge"가 포함된 기록)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reflog </span><span class="token parameter variable" style="color:#36acaa">--grep</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">merge</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="9-파일-복구-및-취소">9. 파일 복구 및 취소<a href="https://www.geuni.tech/en/git-commands-and-glossary#9-%ED%8C%8C%EC%9D%BC-%EB%B3%B5%EA%B5%AC-%EB%B0%8F-%EC%B7%A8%EC%86%8C" class="hash-link" aria-label="Direct link to 9. 파일 복구 및 취소" title="Direct link to 9. 파일 복구 및 취소">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-checkout-1"><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-checkout">🔗git checkout</a><a href="https://www.geuni.tech/en/git-commands-and-glossary#git-checkout-1" class="hash-link" aria-label="Direct link to git-checkout-1" title="Direct link to git-checkout-1">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-reset">git reset<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-reset" class="hash-link" aria-label="Direct link to git reset" title="Direct link to git reset">​</a></h4>
<p><code>git reset</code>은 Git에서 커밋 히스토리를 되돌리거나, 스테이징 영역 및 작업 디렉토리의 상태를 변경하는 데 사용됩니다. 이 명령어는 커밋을 취소하거나, 파일을 스테이징 영역에서 제거하는 등 다양한 작업에 활용됩니다.</p>
<p><strong>리셋의 세 가지 모드:</strong></p>
<ul>
<li><code>--soft</code>: HEAD만 이동합니다. 스테이징 영역과 작업 디렉토리는 변경되지 않습니다.</li>
<li><code>--mixed</code> (기본): HEAD와 스테이징 영역을 리셋합니다. 작업 디렉토리는 변경되지 않습니다.</li>
<li><code>--hard</code>: HEAD, 스테이징 영역, 작업 디렉토리를 모두 리셋합니다. (<strong>주의필요: 변경사항 영구 삭제됨</strong>)</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git reset &lt;commit&gt;</code></td><td>현재 브랜치의 HEAD를 특정 커밋으로 이동. (기본: <code>--mixed</code>)</td></tr><tr><td><code>git reset --soft &lt;commit&gt;</code></td><td>HEAD를 특정 커밋으로 이동하지만, 스테이징 영역과 작업 디렉토리는 변경하지 않음.</td></tr><tr><td><code>git reset --mixed &lt;commit&gt;</code></td><td>HEAD를 특정 커밋으로 이동하고, 스테이징 영역을 리셋하지만 작업 디렉토리는 변경하지 않음. (기본 동작)</td></tr><tr><td><code>git reset --hard &lt;commit&gt;</code></td><td>HEAD를 특정 커밋으로 이동하고, 스테이징 영역과 작업 디렉토리를 모두 리셋. (주의: 변경 사항이 영구 삭제됨)</td></tr><tr><td><code>git reset &lt;file&gt;</code></td><td>특정 파일을 스테이징 영역에서 제거. (커밋되지 않은 변경 사항은 유지)</td></tr><tr><td><code>git reset --patch</code> 또는 <code>-p</code></td><td>변경 사항을 인터랙티브하게 선택하여 스테이징 영역에서 제거.</td></tr><tr><td><code>git reset --keep &lt;commit&gt;</code></td><td>HEAD를 특정 커밋으로 이동하지만, 작업 디렉토리의 변경 사항을 유지.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치의 HEAD를 특정 커밋으로 이동 (기본: --mixed)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># HEAD를 특정 커밋으로 이동하지만, 스테이징 영역과 작업 디렉토리는 변경하지 않음 (--soft)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset </span><span class="token parameter variable" style="color:#36acaa">--soft</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># HEAD를 특정 커밋으로 이동하고, 스테이징 영역을 리셋하지만 작업 디렉토리는 변경하지 않음 (--mixed)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset </span><span class="token parameter variable" style="color:#36acaa">--mixed</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># HEAD를 특정 커밋으로 이동하고, 스테이징 영역과 작업 디렉토리를 모두 리셋 (--hard)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset </span><span class="token parameter variable" style="color:#36acaa">--hard</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 파일을 스테이징 영역에서 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경 사항을 인터랙티브하게 선택하여 스테이징 영역에서 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># HEAD를 특정 커밋으로 이동하지만, 작업 디렉토리의 변경 사항을 유지 (--keep)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> reset </span><span class="token parameter variable" style="color:#36acaa">--keep</span><span class="token plain"> abc1234</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-restore">git restore<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-restore" class="hash-link" aria-label="Direct link to git restore" title="Direct link to git restore">​</a></h4>
<p><code>git restore</code>는 Git 2.23 버전부터 도입된 명령어로, 작업 디렉토리나 스테이징 영역의 파일을 복원하는 데 사용됩니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git restore &lt;file&gt;</code></td><td>작업 디렉토리의 파일을 최신 커밋 상태로 복원.</td></tr><tr><td><code>git restore --staged &lt;file&gt;</code></td><td>스테이징 영역의 파일을 최신 커밋 상태로 복원. (작업 디렉토리는 변경되지 않음)</td></tr><tr><td><code>git restore --source=&lt;commit&gt; &lt;file&gt;</code></td><td>특정 커밋의 파일 상태로 작업 디렉토리 또는 스테이징 영역을 복원.</td></tr><tr><td><code>git restore --worktree &lt;file&gt;</code></td><td>작업 디렉토리의 파일만 복원. (스테이징 영역은 변경되지 않음)</td></tr><tr><td><code>git restore --patch</code> 또는 <code>-p</code></td><td>변경 사항을 인터랙티브하게 선택하여 복원.</td></tr><tr><td><code>git restore --quiet</code></td><td>복원 과정에서 출력을 최소화.</td></tr><tr><td><code>git restore --ignore-unmerged</code></td><td>병합 충돌이 발생한 파일은 복원하지 않음.</td></tr><tr><td><code>git restore --recurse-submodules</code></td><td>서브모듈의 변경 사항도 함께 복원.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리의 파일을 최신 커밋 상태로 복원</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 스테이징 영역의 파일을 최신 커밋 상태로 복원</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore </span><span class="token parameter variable" style="color:#36acaa">--staged</span><span class="token plain"> file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋의 파일 상태로 작업 디렉토리 복원</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore </span><span class="token parameter variable" style="color:#36acaa">--source</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">HEAD~2 file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 디렉토리의 파일만 복원 (스테이징 영역은 변경되지 않음)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore </span><span class="token parameter variable" style="color:#36acaa">--worktree</span><span class="token plain"> file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경 사항을 인터랙티브하게 선택하여 복원</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore </span><span class="token parameter variable" style="color:#36acaa">--patch</span><span class="token plain"> file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 복원 과정에서 출력 최소화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore </span><span class="token parameter variable" style="color:#36acaa">--quiet</span><span class="token plain"> file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 병합 충돌이 발생한 파일은 복원하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore --ignore-unmerged file.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈의 변경 사항도 함께 복원</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> restore --recurse-submodules</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="10-리베이스">10. 리베이스<a href="https://www.geuni.tech/en/git-commands-and-glossary#10-%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4" class="hash-link" aria-label="Direct link to 10. 리베이스" title="Direct link to 10. 리베이스">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-rebase">git rebase<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-rebase" class="hash-link" aria-label="Direct link to git rebase" title="Direct link to git rebase">​</a></h4>
<p><code>git rebase</code>는 브랜치의 커밋 히스토리를 재구성하는 명령어입니다. 다른 브랜치의 최신 커밋을 기준으로 현재 브랜치의 커밋을 재배치하여 깔끔한 히스토리를 만들 수 있습니다. 주로 <code>git merge</code> 대신 사용되며, 커밋 히스토리를 선형적으로 유지하는 데 유용합니다.</p>
<ul>
<li>리베이스 중 충돌이 발생하면 충돌을 해결한 후 <code>git rebase --continue</code>를 실행해야 함.</li>
<li>인터랙티브(<code>-i</code>) 모드에서는 커밋을 수정, 삭제, 병합, 순서 변경 등 다양한 작업을 할 수 있음. (예를 들어, pick을 squash로 변경하여 여러 커밋을 하나로 합치는게 가능)</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git rebase &lt;branch&gt;</code></td><td>현재 브랜치를 특정 브랜치 위로 재배치.</td></tr><tr><td><code>git rebase -i &lt;commit&gt;</code></td><td>인터랙티브 모드로 커밋을 재배치. (커밋 수정, 삭제, 병합 등 가능)</td></tr><tr><td><code>git rebase --continue</code></td><td>충돌 해결 후 리베이스를 계속 진행.</td></tr><tr><td><code>git rebase --abort</code></td><td>리베이스를 중단하고 원래 상태로 되돌림.</td></tr><tr><td><code>git rebase --skip</code></td><td>충돌이 발생한 커밋을 건너뜀.</td></tr><tr><td><code>git rebase --onto &lt;newbase&gt;</code></td><td>현재 브랜치를 특정 커밋(<code>newbase</code>) 위로 재배치.</td></tr><tr><td><code>git rebase --autostash</code></td><td>작업 중인 변경 사항을 임시로 저장(stash)하고, 리베이스 후 다시 적용.</td></tr><tr><td><code>git rebase --root</code></td><td>최초 커밋부터 리베이스를 수행.</td></tr><tr><td><code>git rebase --no-verify</code></td><td>리베이스 전 후크(hook) 스크립트를 실행하지 않음.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치를 main 브랜치 위로 재배치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 인터랙티브 모드로 커밋 재배치 (커밋 수정, 삭제, 병합 등 가능)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> HEAD~3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌 해결 후 리베이스 계속 진행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 리베이스 중단 및 원래 상태로 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--abort</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌이 발생한 커밋 건너뛰기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--skip</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 브랜치를 특정 커밋(newbase) 위로 재배치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--onto</span><span class="token plain"> newbase oldbase</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 작업 중인 변경 사항을 임시로 저장하고 리베이스 후 다시 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--autostash</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 최초 커밋부터 리베이스 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase </span><span class="token parameter variable" style="color:#36acaa">--root</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 리베이스 전 후크(hook) 스크립트를 실행하지 않음</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> rebase --no-verify</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="11-서브모듈">11. 서브모듈<a href="https://www.geuni.tech/en/git-commands-and-glossary#11-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88" class="hash-link" aria-label="Direct link to 11. 서브모듈" title="Direct link to 11. 서브모듈">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-submodule">git submodule<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-submodule" class="hash-link" aria-label="Direct link to git submodule" title="Direct link to git submodule">​</a></h4>
<p><code>git submodule</code>은 Git 저장소 안에 다른 Git 저장소를 포함하는 기능입니다. 이는 프로젝트에서 외부 라이브러리나 다른 프로젝트를 의존성으로 사용할 때 유용합니다. 서브모듈은 독립적인 저장소로 관리되며, 부모 저장소에서 특정 커밋을 참조합니다.</p>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git submodule add &lt;repository&gt;</code></td><td>새로운 서브모듈을 추가.</td></tr><tr><td><code>git submodule init</code></td><td>서브모듈을 초기화. (<code>.gitmodules</code> 파일에 정의된 서브모듈을 로컬에 설정)</td></tr><tr><td><code>git submodule update</code></td><td>서브모듈을 업데이트. (부모 저장소에서 참조하는 커밋으로 서브모듈을 업데이트)</td></tr><tr><td><code>git submodule update --init</code></td><td>서브모듈을 초기화하고 업데이트.</td></tr><tr><td><code>git submodule update --remote</code></td><td>서브모듈을 원격 저장소의 최신 커밋으로 업데이트.</td></tr><tr><td><code>git submodule sync</code></td><td>서브모듈의 URL을 <code>.gitmodules</code> 파일과 동기화.</td></tr><tr><td><code>git submodule status</code></td><td>서브모듈의 상태를 확인.</td></tr><tr><td><code>git submodule deinit &lt;path&gt;</code></td><td>특정 서브모듈을 비활성화.</td></tr><tr><td><code>git submodule foreach &lt;command&gt;</code></td><td>모든 서브모듈에 대해 특정 명령어를 실행.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 새로운 서브모듈 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> https://github.com/user/repo.git path/to/submodule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈 초기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈 업데이트</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈 초기화 및 업데이트</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule update </span><span class="token parameter variable" style="color:#36acaa">--init</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈을 원격 저장소의 최신 커밋으로 업데이트</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule update </span><span class="token parameter variable" style="color:#36acaa">--remote</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈의 URL 동기화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule </span><span class="token function" style="color:#d73a49">sync</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서브모듈 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule status</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 서브모듈 비활성화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule deinit path/to/submodule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 모든 서브모듈에 대해 특정 명령어 실행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> submodule foreach </span><span class="token string" style="color:#e3116c">'git checkout main'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="12-기타-유용한-명령어">12. 기타 유용한 명령어<a href="https://www.geuni.tech/en/git-commands-and-glossary#12-%EA%B8%B0%ED%83%80-%EC%9C%A0%EC%9A%A9%ED%95%9C-%EB%AA%85%EB%A0%B9%EC%96%B4" class="hash-link" aria-label="Direct link to 12. 기타 유용한 명령어" title="Direct link to 12. 기타 유용한 명령어">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-cherry-pick">git cherry-pick<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-cherry-pick" class="hash-link" aria-label="Direct link to git cherry-pick" title="Direct link to git cherry-pick">​</a></h4>
<p><code>git cherry-pick</code>은 특정 커밋을 현재 브랜치에 적용하는 명령어입니다. 다른 브랜치의 특정 커밋만 선택적으로 현재 브랜치에 반영할 때 사용됩니다. 이는 특정 기능이나 버그 수정을 다른 브랜치로 포팅할 때 유용합니다.</p>
<ul>
<li>cherry-pick 중 충돌이 발생하면 충돌을 해결한 후 <code>git cherry-pick --continue</code>를 실행해야 합니다.</li>
<li>충돌 해결을 중단하려면 <code>git cherry-pick --abort</code>를 사용합니다.</li>
</ul>
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git cherry-pick &lt;commit&gt;</code></td><td>특정 커밋을 현재 브랜치에 적용.</td></tr><tr><td><code>git cherry-pick &lt;commit1&gt; &lt;commit2&gt;</code></td><td>여러 커밋을 현재 브랜치에 적용.</td></tr><tr><td><code>git cherry-pick &lt;start&gt;^..&lt;end&gt;</code></td><td>특정 범위의 커밋을 현재 브랜치에 적용.</td></tr><tr><td><code>git cherry-pick --continue</code></td><td>충돌 해결 후 cherry-pick을 계속 진행.</td></tr><tr><td><code>git cherry-pick --abort</code></td><td>cherry-pick을 중단하고 원래 상태로 되돌림.</td></tr><tr><td><code>git cherry-pick --skip</code></td><td>충돌이 발생한 커밋을 건너뜀.</td></tr><tr><td><code>git cherry-pick --no-commit</code></td><td>커밋을 생성하지 않고 변경 사항만 적용.</td></tr><tr><td><code>git cherry-pick --edit</code></td><td>커밋 메시지를 수정하며 cherry-pick을 수행.</td></tr><tr><td><code>git cherry-pick --signoff</code></td><td>커밋 메시지에 <code>Signed-off-by</code> 줄을 추가.</td></tr><tr><td><code>git cherry-pick --ff</code></td><td>가능한 경우 Fast-forward로 cherry-pick을 수행.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋을 현재 브랜치에 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 여러 커밋을 현재 브랜치에 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick abc1234 def5678</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 범위의 커밋을 현재 브랜치에 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick start-commit^</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">end-commit</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌 해결 후 cherry-pick 계속 진행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--continue</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># cherry-pick 중단 및 원래 상태로 되돌리기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--abort</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 충돌이 발생한 커밋 건너뛰기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--skip</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋을 생성하지 않고 변경 사항만 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick --no-commit abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지를 수정하며 cherry-pick 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--edit</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 커밋 메시지에 Signed-off-by 줄 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--signoff</span><span class="token plain"> abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 가능한 경우 Fast-forward로 cherry-pick 수행</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> cherry-pick </span><span class="token parameter variable" style="color:#36acaa">--ff</span><span class="token plain"> abc1234</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-bisect">git bisect<a href="https://www.geuni.tech/en/git-commands-and-glossary#git-bisect" class="hash-link" aria-label="Direct link to git bisect" title="Direct link to git bisect">​</a></h4>
<p><code>git bisect</code>는 이진 탐색(binary search)을 사용하여 버그가 발생한 커밋을 찾는 명령어입니다. 이 명령어는 특정 버그가 언제 도입되었는지 정확히 찾아낼 때 매우 유용합니다. <code>git bisect</code>는 좋은 상태(<code>good</code>)와 나쁜 상태(<code>bad</code>)를 지정한 후, 중간 커밋을 확인하며 버그가 발생한 커밋을 찾습니다.</p>
<img src="https://www.geuni.tech/img/post/bisect-overview.png" alt="locust" style="zoom:60%">
<table><thead><tr><th>명령어 및 옵션</th><th>설명</th></tr></thead><tbody><tr><td><code>git bisect start</code></td><td>이진 탐색을 시작.</td></tr><tr><td><code>git bisect good &lt;commit&gt;</code></td><td>특정 커밋이 좋은 상태(good)임을 표시.</td></tr><tr><td><code>git bisect bad &lt;commit&gt;</code></td><td>특정 커밋이 나쁜 상태(bad)임을 표시.</td></tr><tr><td><code>git bisect reset</code></td><td>이진 탐색을 종료하고 원래 브랜치로 돌아감.</td></tr><tr><td><code>git bisect run &lt;command&gt;</code></td><td>자동으로 이진 탐색을 수행. 지정한 명령어를 실행하여 좋은지 나쁜지 판단.</td></tr><tr><td><code>git bisect log</code></td><td>이진 탐색의 로그를 확인.</td></tr><tr><td><code>git bisect skip</code></td><td>현재 커밋을 건너뜀.</td></tr></tbody></table>
<p><strong>사용 예시:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 이진 탐색 시작</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect start</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 커밋이 나쁜 상태임을 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect bad</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 특정 커밋이 좋은 상태임을 표시</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect good abc1234</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 이진 탐색 종료 및 원래 브랜치로 돌아가기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect reset</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 자동으로 이진 탐색 수행 (테스트 스크립트 사용)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect run ./test-script.sh</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 이진 탐색 로그 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect log</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 커밋 건너뛰기</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> bisect skip</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>Git</category>
        </item>
        <item>
            <title><![CDATA[Effortlessly Build Your Blog with Docusaurus]]></title>
            <link>https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus</link>
            <guid>https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus</guid>
            <pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A complete guide to building a personal blog with Docusaurus, covering installation, migration, multilingual support, SEO optimization, code blocks, and deployment.]]></description>
            <content:encoded><![CDATA[<p>I had been using Jekyll to build my blog until I came across Docusaurus and was immediately intrigued. I decided to give it a try and migrate my blog.</p>
<p>Docusaurus offers a clean and intuitive user interface, powerful code block features, active community support, and a rich plugin ecosystem. Maintained by Meta (formerly Facebook), these advantages made me fall in love with it instantly.</p>
<p>During the migration process, I compiled steps from basic installation to meeting my personal customization needs.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-docusaurus">What is Docusaurus?<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#what-is-docusaurus" class="hash-link" aria-label="Direct link to What is Docusaurus?" title="Direct link to What is Docusaurus?">​</a></h3>
<p>Docusaurus is an open-source static site generator based on React and MDX, maintained by Meta. It is designed to allow users to create documentation websites quickly and effortlessly.</p>
<p>Here are some of its main features:</p>
<ul>
<li><strong>Documentation and Blog Features</strong>: It provides out-of-the-box documentation features but can be used to create any kind of site (personal website, product, blog, marketing landing pages, etc).</li>
<li><strong>Powered by MDX</strong>: Combines Markdown syntax and React components, enabling extensible content creation.</li>
<li><strong>i18n Support</strong>: Easily create multilingual websites.</li>
<li><strong>SEO-Friendly</strong>: Automatically generates sitemaps and meta tags.</li>
<li><strong>Code Blocks</strong>: Supports powerful syntax highlighting.</li>
<li><strong>Easy Deployment</strong>: Easily deployable on platforms like Vercel, GitHub Pages, Netlify.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="installation">Installation<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#installation" class="hash-link" aria-label="Direct link to Installation" title="Direct link to Installation">​</a></h3>
<p>After installing <a href="https://nodejs.org/en/download/package-manager" target="_blank" rel="noopener noreferrer">Node.js</a>, you can create a new Docusaurus project with the following commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npx create-docusaurus@latest my-site classic </span><span class="token parameter variable" style="color:#36acaa">--typescript</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Start the local development server</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> my-site</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Once running, visit <a href="http://localhost:3000/" target="_blank" rel="noopener noreferrer"><code>http://localhost:3000</code></a> to see the default Docusaurus page.
<img decoding="async" loading="lazy" alt="Docusaurus" src="https://www.geuni.tech/en/assets/images/create-docusaurus-9452b43be60f63e9b8b308533cffe3f5.webp" width="3072" height="1668" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="blog-only-mode">Blog-Only Mode<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#blog-only-mode" class="hash-link" aria-label="Direct link to Blog-Only Mode" title="Direct link to Blog-Only Mode">​</a></h3>
<p>If you don’t need a dedicated landing page and want to display the blog's post list page as the homepage, you can make the following changes:</p>
<ol>
<li>Delete the <code>./src/pages/index.{js,tsx}</code> file to avoid multiple files mapping to the same path.</li>
<li>edit <code>docusaurus.config.ts</code>, set the <code>routeBasePath</code> for the blog module to the root path <code>/</code>:</li>
</ol>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">docs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Optional: disable the docs plugin</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">blog</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">routeBasePath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Serve the blog at the site's root</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="internationalization">Internationalization<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#internationalization" class="hash-link" aria-label="Direct link to Internationalization" title="Direct link to Internationalization">​</a></h3>
<p>With tools like ChatGPT, managing and operating a multilingual blog has become much easier. Docusaurus has built-in i18n support, enabling you to add multiple languages with minimal setup.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-i18n-configuration">1. i18n Configuration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#1-i18n-configuration" class="hash-link" aria-label="Direct link to 1. i18n Configuration" title="Direct link to 1. i18n Configuration">​</a></h4>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">i18n</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">defaultLocale</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ko'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">locales</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'ko'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'zh-Hans'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'en'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">localeConfigs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">       </span><span class="token string-property property" style="color:#36acaa">'ko'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">label</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'한국어'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">htmlLang</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ko'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'zh-Hans'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">label</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'中文'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">htmlLang</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zh-CN'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">themeConfig</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">navbar</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">items</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'localeDropdown'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">position</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'left'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-generate-translation-files">2. Generate translation files<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#2-generate-translation-files" class="hash-link" aria-label="Direct link to 2. Generate translation files" title="Direct link to 2. Generate translation files">​</a></h4>
<p>Use the <code>write-translations</code> command to automatically generate i18n directories and JSON files according to the configured languages, storing content for each language for subsequent translation.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run write-translations -- </span><span class="token parameter variable" style="color:#36acaa">--locale</span><span class="token plain"> zh-Hans</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run write-translations -- </span><span class="token parameter variable" style="color:#36acaa">--locale</span><span class="token plain"> en</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> my</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">site@</span><span class="token number" style="color:#36acaa">0.0</span><span class="token number" style="color:#36acaa">.0</span><span class="token plain"> write</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">translations</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> docusaurus write</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">translations </span><span class="token operator" style="color:#393A34">--</span><span class="token plain">locale en</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token constant" style="color:#36acaa">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">78</span><span class="token plain"> translations will be written at </span><span class="token string" style="color:#e3116c">"i18n/en/code.json"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token constant" style="color:#36acaa">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> translations will be written at </span><span class="token string" style="color:#e3116c">"i18n/en/docusaurus-theme-classic/navbar.json"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token constant" style="color:#36acaa">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> translations will be written at </span><span class="token string" style="color:#e3116c">"i18n/en/docusaurus-theme-classic/footer.json"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token constant" style="color:#36acaa">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> translations will be written at </span><span class="token string" style="color:#e3116c">"i18n/en/docusaurus-plugin-content-docs/current.json"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token constant" style="color:#36acaa">INFO</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> translations will be written at </span><span class="token string" style="color:#e3116c">"i18n/en/docusaurus-plugin-content-blog/options.json"</span><span class="token punctuation" style="color:#393A34">.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Articles in the default language specified by <code>defaultLocale</code> should be stored in the /blog directory. These articles can then be copied to the <code>my-site/i18n/[locale]/docusaurus-plugin-content-blog</code> directory for subsequent translation.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">my-site/i18n/[locale]/docusaurus-plugin-content-blog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ # translations for website/blog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── authors.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── first-blog-post.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── second-blog-post.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ # translations for the plugin options that will be rendered</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── options.json</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="seo---sitemap-configuration">SEO - Sitemap Configuration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#seo---sitemap-configuration" class="hash-link" aria-label="Direct link to SEO - Sitemap Configuration" title="Direct link to SEO - Sitemap Configuration">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>production only</div><div class="admonitionContent_BuS1"><p>This plugin is always inactive in development and <strong>only active in production</strong> to avoid polluting the analytics statistics.</p></div></div>
<p>Docusaurus integrates the <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-sitemap" target="_blank" rel="noopener noreferrer">plugin-sitemap</a> by default. You can enable it with minimal configuration:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">sitemap</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">lastmod</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'date'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">changefreq</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'weekly'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">priority</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">ignorePatterns</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'/tags/**'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">filename</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sitemap.xml'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token function-variable function" style="color:#d73a49">createSitemapItems</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">params</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">defaultCreateSitemapItems</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">rest</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> params</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> items </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">defaultCreateSitemapItems</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">rest</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> items</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">item</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">item</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">url</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/page/'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>When i18n is configured, each language generates its own sitemap.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="code-blocks">Code blocks<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#code-blocks" class="hash-link" aria-label="Direct link to Code blocks" title="Direct link to Code blocks">​</a></h3>
<p>Docusaurus has robust code block features. Although many programming languages are supported by default, some commonly used ones (e.g., Java, Bash) may require manual addition (<a href="https://github.com/FormidableLabs/prism-react-renderer/blob/master/packages/generate-prism-languages/index.ts#L9-L23" target="_blank" rel="noopener noreferrer">default supported languages</a>):</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">themeConfig</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">prism</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">theme</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> prismThemes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">github</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">darkTheme</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> prismThemes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dracula</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">additionalLanguages</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'bash'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'java'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'properties'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Additionally, you can use annotations like <code>highlight-next-line</code>, <code>highlight-start</code>, <code>highlight-end</code> for<a href="https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting" target="_blank" rel="noopener noreferrer">line-highlighting</a>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="google-integration">Google Integration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#google-integration" class="hash-link" aria-label="Direct link to Google Integration" title="Direct link to Google Integration">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="google-analytics-configuration">Google Analytics Configuration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#google-analytics-configuration" class="hash-link" aria-label="Direct link to Google Analytics Configuration" title="Direct link to Google Analytics Configuration">​</a></h4>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>production only</div><div class="admonitionContent_BuS1"><p>This plugin is always inactive in development and <strong>only active in production</strong> to avoid polluting the analytics statistics.</p></div></div>
<p>Docusaurus integrates Google Analytics easily via the  <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-google-gtag#ex-config" target="_blank" rel="noopener noreferrer">preset options</a>:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">gtag</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">trackingID</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'G-999X9XX9XX'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">anonymizeIP</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="google-adsense-integration">Google Adsense Integration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#google-adsense-integration" class="hash-link" aria-label="Direct link to Google Adsense Integration" title="Direct link to Google Adsense Integration">​</a></h4>
<p>Google Adsense can be integrated by loading the appropriate script. Use the <a href="https://docusaurus.io/docs/api/docusaurus-config#scripts" target="_blank" rel="noopener noreferrer">Docusaurus Scripts</a> feature to achieve this.</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">scripts</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">src</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXX'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">async</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">crossorigin</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'anonymous'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="migration">Migration<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#migration" class="hash-link" aria-label="Direct link to Migration" title="Direct link to Migration">​</a></h3>
<p>When transitioning to a new blog setup, changes in URL structures can lead to broken links. To prevent this, URL migration work is typically required, which can often be a concern.</p>
<p>Docusaurus allows for URL migration through the use of the <code>slug</code> setting in Markdown front matter or by employing redirection methods.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="front-matter---slug">Front Matter - <code>slug</code><a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#front-matter---slug" class="hash-link" aria-label="Direct link to front-matter---slug" title="Direct link to front-matter---slug">​</a></h4>
<p>Using the <code>slug</code> property in Docusaurus's front matter, you can freely configure the URL for blog posts or pages.</p>
<p>For example, by setting the <code>slug</code> value as shown below, you can change a URL in the format <code>/2024/12/24/welcome</code> to <code>/welcome</code>.</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">title</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e3116c">"welcome"</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">slug</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e3116c">"/welcome"</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">tags</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> </span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">[</span><span class="token front-matter-block front-matter yaml language-yaml string" style="color:#e3116c">"docusaurus"</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">]</span><span class="token front-matter-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">my doc</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="redirection">Redirection<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#redirection" class="hash-link" aria-label="Direct link to Redirection" title="Direct link to Redirection">​</a></h4>
<p>Redirection is another common approach for URL migration. Docusaurus supports client-side redirects.</p>
<p>For those experienced with SEO, you might already know that server-side redirects are more SEO-friendly than client-side redirects.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="server-side-redirect-recommended">Server-Side Redirect (Recommended)<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#server-side-redirect-recommended" class="hash-link" aria-label="Direct link to Server-Side Redirect (Recommended)" title="Direct link to Server-Side Redirect (Recommended)">​</a></h5>
<p>Using server-side redirects for URL migration ensures that there’s no impact on page ranking, as stated by Google.</p>
<p>Google documentation: <a href="https://developers.google.com/search/docs/crawling-indexing/site-move-with-url-changes#general_recommendations_for_site_moves" target="_blank" rel="noopener noreferrer">General best practices for site moves</a></p>
<blockquote>
<p>301, 302, and other server side redirects don't cause a loss in PageRank.</p>
</blockquote>
<p>In contrast, client-side redirects can sometimes be misinterpreted by search engines, leading to incomplete evaluations of the redirected pages.</p>
<p>Please refer to the following document for redirection setup instructions based on your specific hosting method.</p>
<ul>
<li>Vercel: <a href="https://vercel.com/docs/projects/project-configuration#redirects" target="_blank" rel="noopener noreferrer">Vercel: redirects</a></li>
<li>Netlify: <a href="https://docs.netlify.com/routing/redirects/" target="_blank" rel="noopener noreferrer">Netlify: redirects</a></li>
<li>Self hosting: <a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects#implement-server-side-redirects" target="_blank" rel="noopener noreferrer">Google Documentation</a></li>
<li>GitHub Pages: Server-side redirects are not supported.</li>
</ul>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="client-side-redirect">Client-Side Redirect<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#client-side-redirect" class="hash-link" aria-label="Direct link to Client-Side Redirect" title="Direct link to Client-Side Redirect">​</a></h5>
<p>If server-side redirection isn’t feasible, or SEO isn’t a major concern, you can easily implement client-side redirection using <code>@docusaurus/plugin-client-redirects</code>.</p>
<p>Install the plugin:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--save</span><span class="token plain"> @docusaurus/plugin-client-redirects</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Example configuration:</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">plugins</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/plugin-client-redirects'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">fromExtensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'html'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'htm'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// /myPage.html -&gt; /myPage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">toExtensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'exe'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zip'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// /myAsset -&gt; /myAsset.zip (if latter exists)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">redirects</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// /docs/oldDoc -&gt; /docs/newDoc</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">to</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/newDoc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/oldDoc'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// Redirect from multiple old paths to the new path</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">to</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/newDoc2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'/docs/oldDocFrom2019'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/legacyDocFrom2016'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">createRedirects</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">existingPath</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">existingPath</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">includes</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/community'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic">// Redirect from /docs/team/X to /community/X and /docs/support/X to /community/X</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              existingPath</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/community'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/team'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              existingPath</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">replace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/community'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/docs/support'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword nil" style="color:#00009f">undefined</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Return a falsy value: no redirect created</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deployment-cicd">Deployment (CI/CD)<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#deployment-cicd" class="hash-link" aria-label="Direct link to Deployment (CI/CD)" title="Direct link to Deployment (CI/CD)">​</a></h3>
<p>For hosting platforms, Vercel, GitHub Pages, and Netlify are all great choices.</p>
<p>As a long-time Vercel user, I highly recommend it for beginners because of its extremely simple setup process. A few clicks can import a GitHub project and configure the CI/CD pipeline.</p>
<p>Official Guide: <a href="https://vercel.com/guides/deploying-docusaurus-with-vercel" target="_blank" rel="noopener noreferrer">How to Deploy a Docusaurus Site with Vercel</a></p>
<img src="https://www.geuni.tech/img/post/vercel.webp" alt="locust" style="zoom:50%">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://www.geuni.tech/en/creating-a-personal-blog-using-docusaurus#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>It took me a weekend to complete the migration from Jekyll to Docusaurus.</p>
<p>In this article, I’ve summarized the key steps and practical tips from basic setup to migration. I hope this helps those who want to build their ideal website effortlessly.</p>]]></content:encoded>
            <category>Docusaurus</category>
            <category>Blog</category>
        </item>
        <item>
            <title><![CDATA[Practice Exam for RHCE 9(EX294)]]></title>
            <link>https://www.geuni.tech/en/linux/rhce_practice</link>
            <guid>https://www.geuni.tech/en/linux/rhce_practice</guid>
            <pubDate>Fri, 27 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Lab Environment]]></description>
            <content:encoded><![CDATA[<h4 class="anchor anchorWithStickyNavbar_LWe7" id="lab-environment">Lab Environment<a href="https://www.geuni.tech/en/linux/rhce_practice#lab-environment" class="hash-link" aria-label="Direct link to Lab Environment" title="Direct link to Lab Environment">​</a></h4>
<table><thead><tr><th><strong>FQDN</strong></th><th><strong>Description</strong></th><th><strong>IP Addresses</strong></th><th><strong>Roles</strong></th></tr></thead><tbody><tr><td>control.lab.example.com</td><td>control</td><td>172.25.250.254</td><td>ansible control node</td></tr><tr><td>classroom.lab.example.com</td><td>classroom</td><td>172.25.250.254</td><td>materials</td></tr><tr><td>content.lab.example.com</td><td>content</td><td>172.25.250.254</td><td>YUM repo</td></tr><tr><td>node1.lab.example.com</td><td>node1</td><td>172.25.250.9</td><td>ansible managed node</td></tr><tr><td>node2.lab.example.com</td><td>node2</td><td>172.25.250.10</td><td>ansible managed node</td></tr><tr><td>node3.lab.example.com</td><td>node3</td><td>172.25.250.11</td><td>ansible managed node</td></tr><tr><td>node4.lab.example.com</td><td>node4</td><td>172.25.250.12</td><td>ansible managed node</td></tr><tr><td>node5.lab.example.com</td><td>node5</td><td>172.25.250.13</td><td>ansible managed node</td></tr><tr><td>utility.lab.example.com</td><td>utilit</td><td>172.25.250.220</td><td>utility</td></tr></tbody></table>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-install-and-configure-ansible">1. Install and configure Ansible<a href="https://www.geuni.tech/en/linux/rhce_practice#1-install-and-configure-ansible" class="hash-link" aria-label="Direct link to 1. Install and configure Ansible" title="Direct link to 1. Install and configure Ansible">​</a></h4>
<p>Install and configure Ansible on the control node <em><strong>control.lab.example.com</strong></em> as follows:</p>
<ul>
<li>Install the required packages.</li>
<li>Create a static inventory file called <em><strong>/home/greg/ansible/inventory</strong></em> so that:<!-- -->
<ul>
<li><em><strong>node1</strong></em> is a member of the <em><strong>dev</strong></em> host group</li>
<li><em><strong>node2</strong></em> is a member of the <em><strong>test</strong></em> host group</li>
<li><em><strong>node3</strong></em> and node4 are members of the <em><strong>prod</strong></em> host group</li>
<li><em><strong>node5</strong></em> is a member of the <em><strong>balancers</strong></em> host group</li>
<li>The <em><strong>prod</strong></em> group is a member of the <em><strong>webservers</strong></em> host gorup</li>
</ul>
</li>
<li>Create a configuration file called <em><strong>/home/greg/ansible/ansible.cfg</strong></em> so that:<!-- -->
<ul>
<li>The host inventory file is <em><strong>/home/greg/ansible/inventory</strong></em></li>
<li>The default roles directoty is <em><strong>/home/greg/ansible/roles</strong></em></li>
<li>The default content collections directory is <em><strong>/home/greg/ansible/mycollection</strong></em></li>
</ul>
</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> greg@control</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> dnf </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> ansible-automation-platform-common.noarch ansible-navigator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> /home/greg/ansible/roles</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /home/greg/ansible/mycollection</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> ansible/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-config init </span><span class="token parameter variable" style="color:#36acaa">--disabled</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /home/greg/ansible/ansible.cfg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> ansible.cfg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">defaults</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">inventory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> /home/greg/ansible/inventory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">remote_user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> greg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">host_key_checking </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> False</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">roles_path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> /home/greg/ansible/roles:/usr/share/ansible/roles</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">collections_path </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ./mycollection/:.ansible/collections:/usr/share/ansible/collections</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">privilege_escalation</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">become</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">True</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible </span><span class="token parameter variable" style="color:#36acaa">--version</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/inventory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">prod</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">balancers</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">webservers:children</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">prod</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-inventory </span><span class="token parameter variable" style="color:#36acaa">--graph</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>During the exam, <em><strong>ansible-navigator</strong></em> is available for use. When using <em><strong>ansible-navigator</strong></em>, make sure to log in to Podman beforehand:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> login utility.lab.example.com </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> admin </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> redhat</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator images</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator collections</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-create-yum-repositories">2. Create yum repositories<a href="https://www.geuni.tech/en/linux/rhce_practice#2-create-yum-repositories" class="hash-link" aria-label="Direct link to 2. Create yum repositories" title="Direct link to 2. Create yum repositories">​</a></h4>
<p>As a systemm adminstrator, you will need to install software on the managed nodes.</p>
<p>Create the playbook  <em><strong>/home/greg/ansible/yum_repo.yml</strong></em> which creates the following yum repositories on each of the managend</p>
<ul>
<li>
<p><strong>Repository1:</strong>:</p>
<ul>
<li>The name of repository is <em><strong>EX294_BASE</strong></em></li>
<li>The description is <em><strong>EX294 base software</strong></em></li>
<li>The base URL is <em><strong><a href="http://content/rhel9.0/x86_64/dvd/BaseOS" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/BaseOS</a></strong></em></li>
<li>GPG signature checking is enabled</li>
<li>The GPG key url is <em><strong><a href="http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release</a></strong></em></li>
<li>The repository is enable</li>
</ul>
</li>
<li>
<p><strong>Repository2:</strong>:</p>
<ul>
<li>The name of repository is <em><strong>EX294_STREAM</strong></em></li>
<li>The description is <em><strong>EX294 stream software</strong></em></li>
<li>The base URL is <em><strong><a href="http://content/rhel9.0/x86_64/dvd/AppStream" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/AppStream</a></strong></em></li>
<li>GPG signature checking is <em><strong>enabled</strong></em></li>
<li>The GPG key url is <em><strong><a href="http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release</a></strong></em></li>
<li>The repository is enable</li>
</ul>
</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> yum</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc yum_repository</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/yum_repo.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Configure YUM repositories</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Configure EX294_BASE repository</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">yum_repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EX294_BASE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EX294_BASE</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EX294 base software"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">baseurl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//content/rhel9.0/x86_64/dvd/BaseOS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">gpgcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">gpgkey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//content/rhel9.0/x86_64/dvd/RPM</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">GPG</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">KEY</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">redhat</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Configure EX294_STREAM repository</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">yum_repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EX294_STREAM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EX294_STREAM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"EX294 stream software"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">baseurl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//content/rhel9.0/x86_64/dvd/AppStream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">gpgcheck</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">gpgkey</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//content/rhel9.0/x86_64/dvd/RPM</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">GPG</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">KEY</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">redhat</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run yum_repo.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'yum repoinfo'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'yum -y install ftp'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rpm -q ftp'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-install-packages">3. Install packages<a href="https://www.geuni.tech/en/linux/rhce_practice#3-install-packages" class="hash-link" aria-label="Direct link to 3. Install packages" title="Direct link to 3. Install packages">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/packages.yml</strong></em> that:</p>
<ul>
<li>Installs the <em><strong>php</strong></em> and <em><strong>mariadb</strong></em> packages on hosts in the <em><strong>dev</strong></em>, <em><strong>test</strong></em> and <em><strong>prod</strong></em> host groups</li>
<li>Install the <em><strong>RPM develpment Tools</strong></em> packages group on hosts in the dev host group</li>
<li>Updates all packages to the latest version on hosts in the dev host group</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc yum</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/packages.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install php and mariadb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">test</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">prod</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install required packages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">yum</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> php</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> mariadb</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> present</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install RPM Development Tools and upgrade packages</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install RPM Development Tools group</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">yum</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@RPM Development Tools"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> present</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Upgrade all packages to the latest version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">yum</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> latest</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run packages.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev,test,prod </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rpm -q php mariadb'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'yum grouplist'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'yum update'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="4use-a-role">4.Use a role<a href="https://www.geuni.tech/en/linux/rhce_practice#4use-a-role" class="hash-link" aria-label="Direct link to 4.Use a role" title="Direct link to 4.Use a role">​</a></h4>
<p>Create a palybook called <em><strong>/home/greg/ansible/selinux.yml</strong></em> that:</p>
<ul>
<li>Runs on <em><strong>all managed nodes</strong></em></li>
<li>Uses a <em><strong>selinux role</strong></em></li>
<li>Configures SElinux policy as <em><strong>targeted</strong></em></li>
<li>Sets SElinux state as <em><strong>enforcing</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">yum search role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> yum </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> rhel-system-roles</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy list</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> /usr/share/doc/rhel-system-roles/selinux/example-selinux-playbook.yml /home/greg/ansible/selinux.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> selinux.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Enable line numbers and delete unnecessary content (since line numbers may vary depending on the version, verify and delete manually).</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">:set nu</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">:43,51d</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">:11,39d</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>final content:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">become</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">become_method</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sudo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">become_user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> root</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vars</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Use "targeted" SELinux policy type</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">selinux_policy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> targeted</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Set "enforcing" mode</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">selinux_state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Prepare the prerequisites required for this playbook</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> execute the role and catch errors</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">block</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Include selinux role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">include_role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rhel</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">roles.selinux</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rescue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Fail if failed for a different reason than selinux_reboot_required.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> handle errors</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">fail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">msg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"role failed"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> not selinux_reboot_required</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> restart managed host</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">reboot</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> wait for managed host to come back</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">wait_for_connection</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">delay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> reapply the role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">include_role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rhel</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">roles.selinux</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Roles installed via RPM packages should be executed using ansible-playbook, while roles installed as collections should be executed using ansible-navigator.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-playbook selinux.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'grep ^SELINUX= /etc/selinux/config; getenforce'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SELINUX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SELINUX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SELINUX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SELINUX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SELINUX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">enforcing</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Enforcing</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="5install-a-collection">5.Install a Collection<a href="https://www.geuni.tech/en/linux/rhce_practice#5install-a-collection" class="hash-link" aria-label="Direct link to 5.Install a Collection" title="Direct link to 5.Install a Collection">​</a></h4>
<ul>
<li>Install the following collection artifacts available from <em><strong><a href="http://classroom/materials/" target="_blank" rel="noopener noreferrer">http://classroom/materials/</a></strong></em>  to <em><strong>control</strong></em>
<ul>
<li><em><strong>redhat-insights-1.0.7.tar.gz</strong></em></li>
<li><em><strong>community-general-5.5.0.tar.gz</strong></em></li>
<li><em><strong>redhat-rhel_system_roles-1.19.3.tar.gz</strong></em></li>
</ul>
</li>
<li>The collections should be installed into the default collections directory <em><strong>/home/greg/ansible/mycollection</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> requirements.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">collections</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//classroom/materials/redhat</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">insights</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.0.7.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//classroom/materials/community</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">general</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">5.5.0.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//classroom/materials/redhat</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">rhel_system_roles</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">1.19.3.tar.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy collection </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> requirements.yml </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> /home/greg/ansible/mycollection</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator collections</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator doc community.general.filesystem </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="6-install-roles-using-ansible-galaxy">6. Install roles using Ansible Galaxy<a href="https://www.geuni.tech/en/linux/rhce_practice#6-install-roles-using-ansible-galaxy" class="hash-link" aria-label="Direct link to 6. Install roles using Ansible Galaxy" title="Direct link to 6. Install roles using Ansible Galaxy">​</a></h4>
<p>Use <em><strong>Ansible Galaxy</strong></em> with a requirements file called <em><strong>/home/greg/ansible/roles/requirements.yml</strong></em> to download and install roles to the default <em><strong>/home/greg/ansible/roles</strong></em> from the following URLs:</p>
<ul>
<li><em><strong><a href="http://classroom/materials/haproxy.tar" target="_blank" rel="noopener noreferrer">http://classroom/materials/haproxy.tar</a></strong></em>
The name of this role should be <em><strong>balancer</strong></em></li>
<li><em><strong><a href="http://classroom/materials/phpinfo.tar" target="_blank" rel="noopener noreferrer">http://classroom/materials/phpinfo.tar</a></strong></em>
The name of this role should be <em><strong>phpinfo</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/roles/requirements.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">src</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//classroom/materials/haproxy.tar</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> balancer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">src</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//classroom/materials/phpinfo.tar</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> phpinfo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> /home/greg/ansible/roles/requirements.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy list</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="7create-and-use-a-role">7.Create and use a role<a href="https://www.geuni.tech/en/linux/rhce_practice#7create-and-use-a-role" class="hash-link" aria-label="Direct link to 7.Create and use a role" title="Direct link to 7.Create and use a role">​</a></h4>
<p>Create a role called <em><strong>apache</strong></em> in <em><strong>/home/greg/ansible/roles</strong></em> with the following requirements:</p>
<ul>
<li>The <em><strong>httpd</strong></em> package is installed <em><strong>enabled</strong></em> on boot, and <em><strong>started</strong></em></li>
<li>The firewall is <em><strong>enabled</strong></em> and running with a rule to allow access to the web server</li>
<li>A template file <strong>index.html.j2</strong> exists and is used to create the file <em><strong>/var/www/html/index.html</strong></em> with the following output:
<em>Welcome to HOSTNAME on IPADDRESS</em><br>
<!-- -->where <em><strong>HOSTNAME</strong></em> is the fully qualified domain name of the managed node and <em><strong>IPADDRESS</strong></em> is the IP address of the managed node.</li>
</ul>
<p>Create a playbook called <em><strong>/home/greg/ansible/apache.yml</strong></em> that uses this role as follows:</p>
<ul>
<li>The playbook runs on hosts in the <em><strong>webservers</strong></em> host group</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-galaxy role init --init-path /home/greg/ansible/roles apache</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/roles/apache/tasks/main.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install Apache</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">yum</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> httpd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> latest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Start and enable Apache service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">systemd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> httpd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> started</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Start and enable firewalld</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">systemd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> firewalld</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> started</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Configure firewalld to allow HTTP</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">firewalld</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">permanent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> enabled</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">immediate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deploy index.html template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">src</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> index.html.j2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /var/www/html/index.html</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/roles/apache/templates/index.html.j2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Welcome to </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> ansible_fqdn </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> on </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> ansible_default_ipv4.address </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/apache.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deploy Apache role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> webservers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> apache</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run apache.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible webservers </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'systemctl status httpd'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible webservers </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'firewall-cmd --list-all'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible webservers --list-hosts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://node4</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="8use-roles-from-ansible-galaxy">8.Use roles from Ansible Galaxy<a href="https://www.geuni.tech/en/linux/rhce_practice#8use-roles-from-ansible-galaxy" class="hash-link" aria-label="Direct link to 8.Use roles from Ansible Galaxy" title="Direct link to 8.Use roles from Ansible Galaxy">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/roles.yml</strong></em> with the following requirements:</p>
<ul>
<li>The playbook contains a play that runs on hosts in the <em><strong>balancers</strong></em> host group and uses the <em><strong>balancer</strong></em> role<!-- -->
<ul>
<li>This role configures a service to load balance web server requests between hosts in the <em><strong>webservers</strong></em> host group.</li>
<li>Browsing to hosts in the balancers host group(for example <em><strong><a href="http://172.25.250.13/" target="_blank" rel="noopener noreferrer">http://172.25.250.13</a></strong></em>) produces the following output:<br>
<em><strong>Welcome to node3.lab.example.com on 172.25.250.11</strong></em>  <br>
Reloading the browser produces output from the alternate web server:<br>
<em><strong>Welcome to node4.lab.example.com on 172.25.250.12</strong></em></li>
</ul>
</li>
<li>The playbook contains a play that runs on hosts in the <em><strong>webservers</strong></em> host group and uses the <em><strong>phpinfo</strong></em> role<!-- -->
<ul>
<li>Browsing to hosts in the webservers host group with the URL <em><strong>/hello.php</strong></em> produces the following output:<br>
<em><strong>Hello PHP World from FQDN</strong></em> <br>
wherer FQDN is the fully qualified domain name of the host. For example, browsing to <em><strong><a href="http://172.25.250.11/hello.php" target="_blank" rel="noopener noreferrer">http://172.25.250.11/hello.php</a></strong></em> produces the following output:<br>
<em><strong>Hello PHP World from node3.lab.example.com</strong></em>   <br>
along with various details of the PHP configuration including the version of PHP that is installed. <br>
Similarly, browsing to <em><strong><a href="http://172.25.250.12/hello.php" target="_blank" rel="noopener noreferrer">http://172.25.250.12/hello.php</a></strong></em> produces the following output:<br>
<em><strong>Hello PHP World from node4.lab.example.com</strong></em>  <br>
along with various details of the PHP  configuration including the version of PHP that is installed</li>
</ul>
</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/roles.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Use phpinfo role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> webservers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> phpinfo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Use balancer role</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> balancers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">roles</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> balancer</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run /home/greg/ansible/roles.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://172.25.250.13</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://node3/hello.php</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://node4/hello.php</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="9-create-and-use-a-logical-volume">9. Create and use a logical volume<a href="https://www.geuni.tech/en/linux/rhce_practice#9-create-and-use-a-logical-volume" class="hash-link" aria-label="Direct link to 9. Create and use a logical volume" title="Direct link to 9. Create and use a logical volume">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/lv.yml</strong></em> that runs on <em><strong>all managed nodes</strong></em> that does the following:</p>
<ul>
<li>Create a logical volume with these requirements:<!-- -->
<ul>
<li>The logical volume is created in the <em><strong>research</strong></em> volume gorup</li>
<li>The logical volume name is <em><strong>data</strong></em></li>
<li>The logical volume size is <em><strong>1500 MiB</strong></em></li>
</ul>
</li>
<li>Formats the logical volume with the <em><strong>ext4</strong></em> filesystem</li>
<li>If the requested logical volume size cannot be created the error message
<em><strong>'Cloud not create logical volume of that size'</strong></em>
should be displayed and the size <em><strong>800 MiB</strong></em> should be used instead</li>
<li>If the volume group research does not exist, the error message
<em><strong>'Volume group does not exist'</strong></em>，  should be displayed</li>
<li>Does NOT mount the logical volume in any way</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc community.general.lvol</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc community.general.filesystem</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc debug</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc </span><span class="token function" style="color:#d73a49">stat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/lv.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create LVM</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">block</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lv 1500M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">community.general.lvol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">vg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> research</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">lv</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1500</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create ext4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">community.general.filesystem</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">fstype</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ext4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">dev</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /dev/research/data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rescue</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Could not create lvm</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.debug</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">msg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Could not create logical volume of that size</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lv 800M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">community.general.lvol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">vg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> research</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">lv</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">800</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create ext4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">community.general.filesystem</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">fstype</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ext4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">dev</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /dev/research/data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ansible_lvm.vgs.research is defined</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">debug</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">msg</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Volume group does not exist</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ansible_lvm.vgs.research is not defined</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run /home/greg/ansible/lv.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># check the execution process to ensure it proceeds as expected.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PLAY </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Create LVM</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ***************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Gathering Facts</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> **********************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">lv 1500M</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> *****************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">fatal: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: FAILED</span><span class="token operator" style="color:#393A34">!</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"changed"</span><span class="token builtin class-name">:</span><span class="token plain"> false, </span><span class="token string" style="color:#e3116c">"err"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"  Volume group </span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c">research</span><span class="token string entity" style="color:#36acaa">\"</span><span class="token string" style="color:#e3116c"> has insufficient free space (31 extents): 47 required.</span><span class="token string entity" style="color:#36acaa">\n</span><span class="token string" style="color:#e3116c">"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"msg"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Creating logical volume 'data' failed"</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">"rc"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Create ext4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> **************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Could not create lvm</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> *****************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"msg"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Could not create logical volume of that size"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">lv 800M</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ******************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Create ext4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> **************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">debug</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ********************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node5</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"msg"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Volume group does not exist"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">4</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># LVS Check</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#   - node3， LV creation of 800M due to insufficient VG free space</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#   - node1， LV creation failed because the VG could not be found</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'lvs'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  LV   VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  data research -wi-a----- </span><span class="token number" style="color:#36acaa">800</span><span class="token plain">.00m                                                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  data research -wi-a----- </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">.47g                                                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  data research -wi-a----- </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">.47g                                                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  LV   VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  data research -wi-a----- </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">.47g                                                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># check fstype</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'blkid /dev/research/data'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/research/data: </span><span class="token assign-left variable" style="color:#36acaa">UUID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"83229b4c-dcba-4dcb-aab3-fe8601d3c75a"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">BLOCK_SIZE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"4096"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">TYPE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ext4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/research/data: </span><span class="token assign-left variable" style="color:#36acaa">UUID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cdd60647-19a7-48e7-969f-9bd685fcc718"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">BLOCK_SIZE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"4096"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">TYPE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ext4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/research/data: </span><span class="token assign-left variable" style="color:#36acaa">UUID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"1ee8f698-7b79-410f-bc48-0a1ab781a542"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">BLOCK_SIZE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"4096"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">TYPE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ext4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/research/data: </span><span class="token assign-left variable" style="color:#36acaa">UUID</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"71b9cf21-efae-4926-aef2-80ef3c74b8d2"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">BLOCK_SIZE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"4096"</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">TYPE</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"ext4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> FAILED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">non-zero </span><span class="token builtin class-name">return</span><span class="token plain"> code</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="10-generate-a-hosts-file">10. Generate a hosts file<a href="https://www.geuni.tech/en/linux/rhce_practice#10-generate-a-hosts-file" class="hash-link" aria-label="Direct link to 10. Generate a hosts file" title="Direct link to 10. Generate a hosts file">​</a></h4>
<ul>
<li>Download an initial template file from <em><strong><a href="http://classroom/materials/hosts.j2" target="_blank" rel="noopener noreferrer">http://classroom/materials/hosts.j2</a></strong></em> to <em><strong>/home/greg/ansible</strong></em></li>
<li>Complete the template so that it can be used to generate a file with a line for each inventory host in the same format as <em><strong>/etc/hosts</strong></em></li>
<li>Download the file from <em><strong><a href="http://classroom/materials/hosts.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/hosts.yml</a></strong></em> to <em><strong>/home/greg/ansible</strong></em>. This playbook will use the template to generate the file <em><strong>/etc/myhosts</strong></em> on hosts in the <em><strong>dev</strong></em> host group.</li>
</ul>
<p>Do not make any changes the play book</p>
<p>When the playbook is run, the file <em><strong>/etc/myhosts</strong></em> on hosts in the <em><strong>dev</strong></em> host group should have a line for each managed host:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">172.25.250.9 node1.lab.example.com node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">172.25.250.10 node2.lab.example.com node2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">172.25.250.11 node3.lab.example.com node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">172.25.250.12 node4.lab.example.com node4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">172.25.250.13 node5.lab.example.com node5</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>NOTE: The order in which the inventory host names appear is not important.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://classroom/materials/hosts.j2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> hosts.j2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{% for i in groups.all %}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{{ hostvars[i].ansible_facts.default_ipv4.address }} {{ hostvars[i].ansible_facts.fqdn }} {{ i }}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{% endfor %}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run hosts.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /etc/myhosts'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">127.0</span><span class="token plain">.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">::1 localhost localhost.localdomain localhost6 localhost6.localdomain6</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.9 node1.lab.example.com node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.10 node2.lab.example.com node2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.13 node5.lab.example.com node5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.11 node3.lab.example.com node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.12 node4.lab.example.com node4</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="11-modify-file-content">11. Modify file content<a href="https://www.geuni.tech/en/linux/rhce_practice#11-modify-file-content" class="hash-link" aria-label="Direct link to 11. Modify file content" title="Direct link to 11. Modify file content">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/issue.yml</strong></em> as follows:</p>
<ul>
<li>The playbook runs an <em><strong>all inventory hosts</strong></em></li>
<li>The playbook replaces the contests of <em><strong>/etc/issue</strong></em> with a single line of text as follow:<!-- -->
<ul>
<li>On hosts in the <em><strong>dev</strong></em> hosts group, the line reads: <em><strong>'Development'</strong></em></li>
<li>On hosts in the <em><strong>test</strong></em> host group, the line reads: <em><strong>'Test'</strong></em></li>
<li>On hosts in the <em><strong>prod</strong></em> host group, the line reads: <em><strong>'Production'</strong></em></li>
</ul>
</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc copy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc </span><span class="token function" style="color:#d73a49">stat</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/issue.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Modify /etc/issue file content</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update content for dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.copy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Development'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /etc/issue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> inventory_hostname in groups.dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update content for test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.copy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Test'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /etc/issue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> inventory_hostname in groups.test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Update content for prod</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.copy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Production'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /etc/issue</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> inventory_hostname in groups.prod</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run issue.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /etc/issue'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible </span><span class="token builtin class-name">test</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /etc/issue'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible prod </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /etc/issue'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="12-create-a-web-content-directory">12. Create a web content directory<a href="https://www.geuni.tech/en/linux/rhce_practice#12-create-a-web-content-directory" class="hash-link" aria-label="Direct link to 12. Create a web content directory" title="Direct link to 12. Create a web content directory">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/webcontent.yml</strong></em> as follows:</p>
<ul>
<li>The playbook runs on managed nodes in the <em><strong>dev</strong></em> host group</li>
<li>Create the directory <em><strong>/webdev</strong></em> with the following requirements:<!-- -->
<ul>
<li>It is owned by the <em><strong>webdev</strong></em> group</li>
<li>It has regular permissions: <em><strong>owner=read+write+execute, group=read+write+execute, other=read+execute</strong></em></li>
<li>It has special permissions: <em><strong>set group ID</strong></em></li>
</ul>
</li>
<li>Symbolically link <em><strong>/var/www/html/webdev</strong></em> to <em><strong>/webdev</strong></em></li>
<li>Create the file <em><strong>/webdev/index.html</strong></em> with a single line of text that reads: <em><strong>'Development'</strong></em></li>
<li>Browsing this directoryu on hosts in the <em><strong>dev</strong></em> host group (for example <a href="http://172.25.250.9/webdev/" target="_blank" rel="noopener noreferrer">http://172.25.250.9/webdev/</a>) produces the following output: <em><strong>'Development'</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc copy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ls -ldZ /var/www/html'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/webcontent.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create Web Content Directory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create /webdev directory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /webdev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> directory</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> webdev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'2775'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create symbolic link for /webdev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.file</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">src</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /webdev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /var/www/html/webdev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create /webdev/index.html file</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.copy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">content</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span><br></span><span class="token-line" style="color:#393A34"><span class="token scalar string" style="color:#e3116c">          Development</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /webdev/index.html</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">setype</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> httpd_sys_content_t</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run webcontent.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://172.25.250.9/webdev/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="13-generate-a-hardware-report">13. Generate a hardware report<a href="https://www.geuni.tech/en/linux/rhce_practice#13-generate-a-hardware-report" class="hash-link" aria-label="Direct link to 13. Generate a hardware report" title="Direct link to 13. Generate a hardware report">​</a></h4>
<p>Create a playbook called <em><strong>home/greg/ansible/hwreport.yml</strong></em> that produces an output file called <em><strong>/root/hwreport.txt</strong></em> on all managed nodes with the following information:</p>
<ul>
<li>Inventory host name</li>
<li>Total memory in MB</li>
<li>BIOS version</li>
<li>Size of disk device vda</li>
<li>Size of disk device vdb</li>
<li>Each line of the output file contains a single key = value pair.</li>
</ul>
<p>Your Playbook should:</p>
<ul>
<li>Download the file from <em><strong><a href="http://classroom/materials/hwreport.empty" target="_blank" rel="noopener noreferrer">http://classroom/materials/hwreport.empty</a></strong></em> and save it as <em><strong>/root/hwreport.txt</strong></em></li>
<li>Modify <em><strong>/root/hwreport.txt</strong></em> with the correct values</li>
<li>If a hardware item does not exist, the associated value should be set to <em><strong>NONE</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> setup </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> mem</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> setup </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> bios</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> setup </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'filter=*device*'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://materials/hwreport.empty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/hwreport.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Generate hardware report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> all</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Download empty report template</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.get_url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> http</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//materials/hwreport.empty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">dest</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add hostname to the report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.lineinfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">regexp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^HOST='</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">line</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"HOST={{ inventory_hostname }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add memory size to the report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.lineinfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">regexp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^MEMORY='</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">line</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MEMORY={{ ansible_memtotal_mb | default('NONE', true) }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add BIOS version to the report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.lineinfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">regexp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^BIOS='</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">line</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"BIOS={{ ansible_bios_version | default('NONE', true) }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add vda disk size to the report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.lineinfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">regexp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^DISK_SIZE_VDA='</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">line</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DISK_SIZE_VDA={{ ansible_devices.vda.size | default('NONE', true) }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add vdb disk size to the report</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ansible.builtin.lineinfile</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /root/hwreport.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">regexp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'^DISK_SIZE_VDB='</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">line</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DISK_SIZE_VDB={{ ansible_devices.vdb.size | default('NONE', true) }}"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run hwreport.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible all </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'cat /root/hwreport.txt'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hardware report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">HOST</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">node4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">MEMORY</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">960</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">BIOS</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.15</span><span class="token plain">.0-1.el9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDA</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDB</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hardware report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">HOST</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">node2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">MEMORY</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">960</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">BIOS</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.15</span><span class="token plain">.0-1.el9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDA</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDB</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node5 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hardware report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">HOST</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">node5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">MEMORY</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">960</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">BIOS</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.15</span><span class="token plain">.0-1.el9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDA</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDB</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hardware report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">HOST</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">MEMORY</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">960</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">BIOS</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.15</span><span class="token plain">.0-1.el9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDA</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDB</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1 </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> CHANGED </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">rc</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Hardware report</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">HOST</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">MEMORY</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5668</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">BIOS</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.15</span><span class="token plain">.0-1.el9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDA</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">20.00</span><span class="token plain"> GB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DISK_SIZE_VDB</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">NONE</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="14-create-a-password-vault">14. Create a password vault<a href="https://www.geuni.tech/en/linux/rhce_practice#14-create-a-password-vault" class="hash-link" aria-label="Direct link to 14. Create a password vault" title="Direct link to 14. Create a password vault">​</a></h4>
<p>Create an Ansible vault to store user passwords as follows:</p>
<ul>
<li>The name of the vault is <em><strong>/home/greg/ansible/locker.yml</strong></em></li>
<li>The vault contains two variables with names:<!-- -->
<ul>
<li><em><strong>pw_developer</strong></em> with value <em><strong>Imadev</strong></em></li>
<li><em><strong>pw_manager</strong></em> with value <em><strong>Imamgr</strong></em></li>
</ul>
</li>
<li>The password to encrypt and decrypt the vault is <em>whenyouwlshuponastar</em></li>
<li>The password is stored in the file <em><strong>/home/greg/ansible/secret.txt</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"whenyouwishuponastar"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /home/greg/ansible/secret.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> ansible.cfg</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">vault_password_file</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/home/greg/ansible/secret.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-vault create /home/greg/ansible/locker.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">---</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pw_developer: Imadev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pw_manager: Imamgr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /home/greg/ansible/locker.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token variable" style="color:#36acaa">$ANSIBLE_VAULT</span><span class="token punctuation" style="color:#393A34">;</span><span class="token number" style="color:#36acaa">1.1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">AES256</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">32316462663839316261653164376664376432313863333238383462396230663138323362363132</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3361363734323065373531343431303234616232333135380a396530626436383566356337633966</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">64393365623237303333373037366461646638376164376130613637646434383537383636336265</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">3061666131656238320a303337366163633337313533376632646631316434323765326135396562</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">32393031383338386533643865653965366264653034633132396666666331663064626337333734</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">6136653065306631643466356531393031666339346165316637</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="15-create-user-accounts">15. Create user accounts<a href="https://www.geuni.tech/en/linux/rhce_practice#15-create-user-accounts" class="hash-link" aria-label="Direct link to 15. Create user accounts" title="Direct link to 15. Create user accounts">​</a></h4>
<ul>
<li>Download a list of users to be created from <em><strong><a href="http://classroom/materials/user_list.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/user_list.yml</a></strong></em> and save it to <em><strong>/home/greg/ansible</strong></em></li>
<li>Using the password vault <em><strong>/home/greg/ansible/locker.yml</strong></em> created elsewhere in this exam create a playbook called <em><strong>/home/greg/ansible/users.yml</strong></em> that creates user accounts as follows:<!-- -->
<ul>
<li>Users wich a job description of <em><strong>developer</strong></em> should be:<!-- -->
<ul>
<li>created on managed nodes in the <em><strong>dev</strong></em> and <em><strong>test</strong></em> host group</li>
<li>assigned the password from the <em><strong>pw_developer</strong></em> variable and should have password that expire after <em><strong>30</strong></em> days</li>
<li>a member of supplementary group <em><strong>devops</strong></em></li>
</ul>
</li>
<li>Users with a job description of <em><strong>manager</strong></em> should be:<!-- -->
<ul>
<li>created on managed nodes in the <em><strong>prod</strong></em> host gorup</li>
<li>assigned the password from the <em><strong>pw_manager</strong></em> variable should have password that expire after 30 days</li>
<li>a member of supplementary group <em><strong>opsmgr</strong></em></li>
</ul>
</li>
</ul>
</li>
<li>password should use the SHA512 hash format</li>
<li>Your playbook should work using the vault password file <em><strong>/home/greg/ansible/secret.txt</strong></em> created elsewhere in this exam.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://classroom/materials/user_list.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> user_list.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/users.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create User1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vars_files</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /home/greg/ansible/locker.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /home/greg/ansible/user_list.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add group1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> devops</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> present</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add user1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ item.name }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> devops</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ pw_developer | password_hash('sha512') }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">password_expire_max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ item.password_expire_max }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">loop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ users }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> item.job == 'developer'</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create User2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> prod</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">vars_files</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /home/greg/ansible/locker.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> /home/greg/ansible/user_list.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add group2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> opsmgr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">state</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> present</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Add user2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ item.name }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> opsmgr</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ pw_manager | password_hash('sha512') }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">password_expire_max</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ item.password_expire_max }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">loop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"{{ users }}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">when</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> item.job == 'manager'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run users.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PLAY </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Create User1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> *************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Gathering Facts</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> **********************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Add group1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ***************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Add user1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ****************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bob'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sally'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'manager'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3001</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bob'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sally'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'manager'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3001</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fred'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3002</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fred'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3002</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PLAY </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Create User2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> *************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Gathering Facts</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> **********************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ok: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Add group2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ***************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TASK </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Add user2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> ****************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bob'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'bob'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3000</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sally'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'manager'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3001</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fred'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3002</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">changed: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sally'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'manager'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3001</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">skipping: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">node3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">item</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">'name'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'fred'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'job'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'developer'</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'password_expire_max'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30</span><span class="token plain">, </span><span class="token string" style="color:#e3116c">'uid'</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3002</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PLAY RECAP **********************************************************************************************************************************************************************************************************************************************************************</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node1                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node2                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node3                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">node4                      </span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ok</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">3</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">changed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">unreachable</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">failed</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">skipped</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">rescued</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ignored</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">   </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible dev,test </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'id bob; id fred'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible prod </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> shell </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'id sally'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> bob@node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bob@node1</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">'s password: Imadev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> sally@node3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sally@node3</span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain">'s password: Imamgr</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="16-rekey-an-ansible-vault">16. Rekey an Ansible vault<a href="https://www.geuni.tech/en/linux/rhce_practice#16-rekey-an-ansible-vault" class="hash-link" aria-label="Direct link to 16. Rekey an Ansible vault" title="Direct link to 16. Rekey an Ansible vault">​</a></h4>
<p>Rekey an existing ansible vault as follows:</p>
<ul>
<li>Download the Ansible vault from <em><strong><a href="http://classroom/materials/salaries.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/salaries.yml</a></strong></em> to  <em><strong>/home/greg/ansible</strong></em></li>
<li>The current vault password is <em>insecure4sure</em></li>
<li>The new vault password is <em>bbe2de98389b</em></li>
<li>The vault remains in an encrypted state with the new password</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://classroom/materials/salaries.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-vault rekey --ask-vault-pass /home/greg/ansible/salaries.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Vault password: insecure8sure</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">New Vault password: bbs2you9527</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Confirm New Vault password: bbs2you9527</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Rekey successful</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible-vault view --ask-vault-pass salaries.yml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Vault password: bbs2you9527</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">haha</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="17-configure-a-cron-job">17. Configure a cron job<a href="https://www.geuni.tech/en/linux/rhce_practice#17-configure-a-cron-job" class="hash-link" aria-label="Direct link to 17. Configure a cron job" title="Direct link to 17. Configure a cron job">​</a></h4>
<p>Create a playbook called <em><strong>/home/greg/ansible/cron.yml</strong></em> that runs on hosts in the <em><strong>dev</strong></em> host group and creates a cron job for user natasha as follows:</p>
<ul>
<li>The user <em><strong>natasha</strong></em> must configure a cron job that runs <em><strong>every 2 minutes</strong></em> and executes logger <em><strong>"EX294 in progress"</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-doc </span><span class="token function" style="color:#d73a49">cron</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/cron.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cron</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">hosts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">tasks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cron job</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cron</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cron job1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">minute</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*/2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">job</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'logger "EX200 in progress"'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> natasha</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ansible-navigator run cron.yml </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> stdout</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ansible </span><span class="token builtin class-name">test</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'crontab -l -u natasha'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>Linux</category>
            <category>RHCE</category>
        </item>
        <item>
            <title><![CDATA[RHCSA 9 연습/기출문제 (EX200)]]></title>
            <link>https://www.geuni.tech/en/linux/rhcsa_practice</link>
            <guid>https://www.geuni.tech/en/linux/rhcsa_practice</guid>
            <pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[RHCSA 9 (EX200) 시험 대비를 위한 완벽 가이드! 네트워크 설정, YUM, SELinux, LVM, podman, systemd 등 핵심 주제별 연습 문제 및 상세 해설 제공. rd.break를 이용한 root 비밀번호 복구 방법까지 완벽 정리]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1네트웍-설정">1、네트웍 설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#1%EB%84%A4%ED%8A%B8%EC%9B%8D-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 1、네트웍 설정" title="Direct link to 1、네트웍 설정">​</a></h3>
<p>node1의 네트웍구성을 아래와 같이 변경하세요.</p>
<ul>
<li>Host Name: <em><strong>node1.domain250.example.com</strong></em></li>
<li>IPv4 address: <em><strong>172.25.250.100</strong></em></li>
<li>Subnet mask： <em><strong>255.255.255.0</strong></em></li>
<li>Gateway： <em><strong>172.25.250.254</strong></em></li>
<li>DNS： <em><strong>172.25.250.254</strong></em></li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># hostname변경 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">hostnamectl set-hostname node1.domain250.example.com </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># connection정보 조회</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nmcli con show</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 기존설정 조회를 통하여 옵션명 확인가능</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nmcli con show </span><span class="token string" style="color:#e3116c">'Wired connection 1'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-E</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ipv4|autoconn'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ipv4설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nmcli con modify </span><span class="token string" style="color:#e3116c">'Wired connection 1'</span><span class="token plain"> autoconnect </span><span class="token function" style="color:#d73a49">yes</span><span class="token plain"> ipv4.method manual ipv4.addresses </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.100/24 ipv4.gateway </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.254 ipv4.dns </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.250.254</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># connection active (이미 up된 상태에서는 재구동 역할을 하게됨)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">nmcli con up </span><span class="token string" style="color:#e3116c">'Wired connection 1'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경여부 확인 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> a</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2yum-저장소-설정">2、Yum 저장소 설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#2yum-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 2、Yum 저장소 설정" title="Direct link to 2、Yum 저장소 설정">​</a></h3>
<p>YUM 기본 저장소를 아래와 같이 변경하세요.</p>
<p>아래와 같은 YUM 저장소가 사용가능합니다.</p>
<ul>
<li><em><strong><a href="http://content/rhel9.0/x86_64/dvd/BaseOS" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/BaseOS</a></strong></em></li>
<li><em><strong><a href="http://content/rhel9.0/x86_64/dvd/Appstream" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/Appstream</a></strong></em></li>
</ul>
<p>YUM 기본저장소를 위에 제공되는 저장소를 사용하도록 시스템을 구성하세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/yum.repos.d/rhel.repo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BaseOS</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> BaseOS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">baseurl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> http://content/rhel9.0/x86_64/dvd/BaseOS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">enabled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gpgcheck </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Appstream</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Appstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">baseurl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> http://content/rhel9.0/x86_64/dvd/Appstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">enabled </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gpgcheck </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 변경여부 확인 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dnf repolist </span><span class="token parameter variable" style="color:#36acaa">-v</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>혹은 <em><strong>dnf config-manager</strong></em> 사용가능, <em><strong>config-manager</strong></em>사용시 생성된 repo파일에 <em><strong>gpgcheck = 0</strong></em> 수동으로 추가해주도록.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dnf config-manager --add-repo </span><span class="token string" style="color:#e3116c">'http://content/rhel9.0/x86_64/dvd/BaseOS'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dnf config-manager --add-repo </span><span class="token string" style="color:#e3116c">'http://content/rhel9.0/x86_64/dvd/Appstream'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-debug-selinux">3. Debug SELinux<a href="https://www.geuni.tech/en/linux/rhcsa_practice#3-debug-selinux" class="hash-link" aria-label="Direct link to 3. Debug SELinux" title="Direct link to 3. Debug SELinux">​</a></h3>
<p>비표준 포트 82에서 실행 중인 웹 서버가 서비스 제공 시 문제를 겪고 있다. 다음 조건을 충족하도록 트러블슈팅을 하라 :</p>
<ul>
<li>시스템의 웹 서버가 <em><strong>/var/www/html</strong></em>에 있는 모든 기존 HTML 파일을 제공할 수 있어야 한다. (참고: 기존 파일의 내용을 삭제하거나 수정하지 말것)</li>
<li>웹 서버가 포트 <em><strong>82</strong></em>로 서비스가 되도록 하라</li>
<li>웹 서버가 시스템이 시작될 때 <em><strong>자동으로</strong></em> 시작되어야 한다.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># httpd서비스 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status httpd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># file context확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ll </span><span class="token parameter variable" style="color:#36acaa">-Z</span><span class="token plain"> /var/www/html/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">semanage fcontext </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> httpd_sys_content_t /var/www/html/file1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">restorecon </span><span class="token parameter variable" style="color:#36acaa">-Rv</span><span class="token plain"> /var/www/html</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">semanage port </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> http_port_t </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> tcp </span><span class="token number" style="color:#36acaa">82</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">82</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-service</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--reload</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서비스 구동 및 enable처리</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> httpd</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-사용자-계정-관리">4. 사용자 계정 관리<a href="https://www.geuni.tech/en/linux/rhcsa_practice#4-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B3%84%EC%A0%95-%EA%B4%80%EB%A6%AC" class="hash-link" aria-label="Direct link to 4. 사용자 계정 관리" title="Direct link to 4. 사용자 계정 관리">​</a></h3>
<p>아래와 같이 사용자/그룹 생성을 하라.</p>
<ul>
<li><em><strong>sysmgrs</strong></em>라는 그룹을 생성하세요.</li>
<li><em><strong>natasha</strong></em> 사용자를 생성하고, 보조 그룹으로 <em><strong>sysmgrs</strong></em>에 속하게 하세요.</li>
<li><em><strong>harry</strong></em> 사용자를 생성하고, 보조 그룹으로 <em><strong>sysmgrs</strong></em>에 속하게 하세요.</li>
<li><em><strong>sarah</strong></em> 사용자는 시스템에서 상호작용 shell에 접근할 수 없으며, <em><strong>sysmgrs</strong></em> 그룹의 구성원이 아닙니다.</li>
<li><em><strong>natasha</strong></em>, <em><strong>harry</strong></em>, <em><strong>sarah</strong></em>의 비밀번호는 모두 <em><strong>flectrag</strong></em>로 설정하세요.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">groupadd</span><span class="token plain"> sysmgrs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">useradd</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-G</span><span class="token plain"> sysmgrs natasha</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">useradd</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-G</span><span class="token plain"> sysmgrs harry</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">useradd</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> /usr/sbin/nologin sarah</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> natasha </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> harry </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> sarah의 </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="5-cron-job설정">5. cron job설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#5-cron-job%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 5. cron job설정" title="Direct link to 5. cron job설정">​</a></h3>
<p><em><strong>harry</strong></em> 사용자로 <em><strong>매일 14:23</strong></em>에 <em><strong>/usr/bin/echo hello</strong></em>를 실행하는 <em><strong>cron</strong></em> 작업을 설정하라</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status crond</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> crond</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">crontab</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> harry </span><span class="token parameter variable" style="color:#36acaa">-e</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">23</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">14</span><span class="token plain"> * * * /usr/bin/echo hello</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># job list확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">crontab</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> harry </span><span class="token parameter variable" style="color:#36acaa">-l</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="6-협력-디렉토리-생성">6. 협력 디렉토리 생성<a href="https://www.geuni.tech/en/linux/rhcsa_practice#6-%ED%98%91%EB%A0%A5-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to 6. 협력 디렉토리 생성" title="Direct link to 6. 협력 디렉토리 생성">​</a></h3>
<p>다음 특징을 가진 협업 디렉토리 <em><strong>/home/managers</strong></em>를 생성하세요:</p>
<ul>
<li><em><strong>/home/managers</strong></em>의 그룹 소유자는 <em><strong>sysmgrs</strong></em>여야 합니다.</li>
<li>디렉토리는 <em><strong>sysmgrs</strong></em> 그룹의 구성원만 읽기, 쓰기 및 접근할 수 있으며, 다른 사용자는 이러한 권한을 가지지 않습니다. (물론, root 사용자는 시스템의 모든 파일과 디렉토리에 접근할 수 있습니다.)</li>
<li><em><strong>/home/managers</strong></em>에 생성된 파일은 자동으로 그룹 소유권이 <em><strong>sysmgrs</strong></em> 그룹으로 설정되어야 합니다.</li>
</ul>
<blockquote>
<p>Setting Special Permissions</p>
<ul>
<li>Symbolic : setuid = u+s; setgid = g+s; sticky = o+t</li>
<li>Octal : In the added fourth preceding digit; setuid = 4; setgid = 2; sticky = 1</li>
</ul>
</blockquote>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /home/managers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> :sysmgrs /home/managers/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2770</span><span class="token plain"> /home/managers/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 혹은 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">770</span><span class="token plain"> /home/managers/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> g+s /home/managers/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="7-ntp설정">7. NTP설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#7-ntp%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 7. NTP설정" title="Direct link to 7. NTP설정">​</a></h3>
<p>시스템을 <em><strong>materials.example.com</strong></em>의 <em><strong>NTP</strong></em> 클라이언트로 구성하세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status chronyd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> chronyd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/chrony.conf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 추가</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">server materials.example.com iburst</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서비스 재구동</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl restart chronyd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">chronyc sources</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="8-autofs설정">8. autofs설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#8-autofs%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 8. autofs설정" title="Direct link to 8. autofs설정">​</a></h3>
<p><em><strong>autofs</strong></em>를 설정하여 원격 사용자의 홈 디렉토리를 아래 요구대로 자동으로 마운트되독록 하세요.</p>
<ul>
<li><em><strong>materials.example.com (172.25.254.254)</strong></em> 에는 NFS 공유 드렉토리 <em><strong>/rhome</strong></em> 있습니다. 이 파일 시스템에는 사용자 <em><strong>remoteuser1</strong></em> 대해 사전 구성된 홈 디렉토리가 포함됩니다.</li>
<li><em><strong>remoteuser1</strong></em>의 홈 디렉토리는 <em><strong>materials.example.com:/rhome/remoteuser1</strong></em>입니다.</li>
<li><em><strong>remoteuser1</strong></em>의 홈 디렉토리는 로컬의 <em><strong>/rhome</strong></em> 디렉토리 하위의 <em><strong>/rhome/remoteuser1</strong></em>로 자동으로 마운트되어야 합니다.</li>
<li>홈 디렉토리는 사용자가 쓰기 가능해야 합니다.</li>
</ul>
<p><em><strong>remoteuser1</strong></em>의 비밀번호는 <em><strong>flectrag</strong></em>입니다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dnf </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> autofs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> autofs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/auto.master</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/rhome /etc/auto.rhome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/auto.rhome</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/remoteuser1 </span><span class="token parameter variable" style="color:#36acaa">-rw</span><span class="token plain"> materials.example.com:/rhome/remoteuser1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl restart autofs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="9-계정-생성">9. 계정 생성<a href="https://www.geuni.tech/en/linux/rhcsa_practice#9-%EA%B3%84%EC%A0%95-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to 9. 계정 생성" title="Direct link to 9. 계정 생성">​</a></h3>
<p><em><strong>사용자 ID</strong></em>가 <em><strong>3533</strong></em>인 사용자 <em><strong>manalo</strong></em>를 생성하라. 비밀번호는 <em><strong>flectrag</strong></em>.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">useradd</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3533</span><span class="token plain"> manalo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> manalo </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="10-파일-찾기-find">10. 파일 찾기 (find)<a href="https://www.geuni.tech/en/linux/rhcsa_practice#10-%ED%8C%8C%EC%9D%BC-%EC%B0%BE%EA%B8%B0-find" class="hash-link" aria-label="Direct link to 10. 파일 찾기 (find)" title="Direct link to 10. 파일 찾기 (find)">​</a></h3>
<p><em><strong>jacques</strong></em>가 소유한 모든 파일을 찾아 그 복사본을 <em><strong>/root/findfiles</strong></em> 디렉토리에 넣으세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /root/findfiles</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">find</span><span class="token plain"> / </span><span class="token parameter variable" style="color:#36acaa">-user</span><span class="token plain"> jacques </span><span class="token parameter variable" style="color:#36acaa">-exec</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> /root/findfiles </span><span class="token punctuation" style="color:#393A34">\</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="11-문자열-찾기-grep">11. 문자열 찾기 (grep)<a href="https://www.geuni.tech/en/linux/rhcsa_practice#11-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%B0%BE%EA%B8%B0-grep" class="hash-link" aria-label="Direct link to 11. 문자열 찾기 (grep)" title="Direct link to 11. 문자열 찾기 (grep)">​</a></h3>
<p>파일 <em><strong>/usr/share/xml/iso-codes/iso_639_3.xml</strong></em>에서 문자열 <em><strong>ng가 포함</strong></em>된 모든 행을 찾아 이 모든 행을 원래 순서대로 <em><strong>/root/list</strong></em> 파일에 복사하세요.
<em><strong>/root/list</strong></em>에는 빈 행이 없어야 하며, 모든 행은 <em><strong>/usr/share/xml/iso-codes/iso_639_3.xml</strong></em> 파일의 원래 행과 정확히 일치해야 합니다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> ng /usr/share/xml/iso-codes/iso_639_3.xml </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /root/list</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="12-아카이브-생성">12. 아카이브 생성<a href="https://www.geuni.tech/en/linux/rhcsa_practice#12-%EC%95%84%EC%B9%B4%EC%9D%B4%EB%B8%8C-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to 12. 아카이브 생성" title="Direct link to 12. 아카이브 생성">​</a></h3>
<p><em><strong>/usr/local</strong></em>의 내용을 포함하는 <em><strong>tar</strong></em> 아카이브를 생성하고, 이를 <em><strong>bzip2</strong></em>로 압축하여 <em><strong>/root/backup.tar.bz2</strong></em>로 저장하세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-cvjf</span><span class="token plain"> /root/backup.tart.bz2 /usr/local</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 압축내역 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-tf</span><span class="token plain"> /root/backup.tar.bz2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="13-podman---build">13. podman - build<a href="https://www.geuni.tech/en/linux/rhcsa_practice#13-podman---build" class="hash-link" aria-label="Direct link to 13. podman - build" title="Direct link to 13. podman - build">​</a></h3>
<ul>
<li><em><strong>wallah</strong></em> 사용자로 <em><strong><a href="http://classroom/Containerfile" target="_blank" rel="noopener noreferrer">http://classroom/Containerfile</a></strong></em> 을(를) 다운로드하세요.</li>
<li>이 파일의 내용을 수정하지 말고, 이미지 이름을 <em><strong>pdf</strong></em>로 하여 빌드하세요.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dnf </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> container-tools</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> wallah@node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> http://classroom/Containerfile</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> login </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> admin </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> redhat321 registry.lab.example.com</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> build </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> pdf </span><span class="token builtin class-name">.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="14-podman---container를-systemd로-구성">14. podman - container를 systemd로 구성<a href="https://www.geuni.tech/en/linux/rhcsa_practice#14-podman---container%EB%A5%BC-systemd%EB%A1%9C-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Direct link to 14. podman - container를 systemd로 구성" title="Direct link to 14. podman - container를 systemd로 구성">​</a></h3>
<p>사용자 <em><strong>wallah</strong></em>로 컨테이너에 대한 <em><strong>systemd</strong></em> 서비스를 구성합니다.</p>
<ul>
<li>컨테이너 이름: <em><strong>ascii2pdf</strong></em></li>
<li>앞서 생성한 <em><strong>pdf</strong></em> 이미지를 사용하세요.</li>
<li>수동 개입 없이 시스템 재부팅시 <em><strong>자동으로</strong></em> 서비스를 시작합니다.</li>
<li>컨테이너 시작 시 <em><strong>/opt/file</strong></em>을 <em><strong>/dir1</strong></em>에, <em><strong>/opt/progress</strong></em>를 <em><strong>/dir2</strong></em>에 자동으로 마운트하도록 서비스를 구성합니다.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 디렉토리 생성 및 소유자 변경</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /opt/</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">file,progress</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> wallah:wallah /opt/</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">file,progress</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--name</span><span class="token plain"> ascii2pdf </span><span class="token parameter variable" style="color:#36acaa">-v</span><span class="token plain"> /opt/file:/dir1:Z </span><span class="token parameter variable" style="color:#36acaa">-v</span><span class="token plain"> /opt/progress:/dir2:Z pdf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># systemd unit파일생성 및 지정위치로 이동</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> generate systemd </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> ascii2pdf </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--new</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> .config/systemd/user</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> ~/container-ascii2pdf.service ~/.config/systemd/user/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서비스 구동 및 활성화</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token parameter variable" style="color:#36acaa">--user</span><span class="token plain"> daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--user</span><span class="token plain"> container-ascii2pdf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">loginctl enable-linger</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">loginctl show-user wallah</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">reboot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ssh</span><span class="token plain"> wallah@node1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">podman</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ps</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="15-sudo설정">15. sudo설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#15-sudo%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 15. sudo설정" title="Direct link to 15. sudo설정">​</a></h3>
<p><em><strong>sysmgrs</strong></em> 그룹 구성원이 <em><strong>sudo</strong></em>를 사용할 때 비밀번호를 입력하지 않도록 허용하세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'%sysmgrs ALL=(ALL) NOPASSWD: ALL'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> /etc/sudoers.d/sysmgrs-group</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 혹은 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">visudo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># append해주도록</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">%sysmgrs </span><span class="token assign-left variable" style="color:#36acaa">ALL</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ALL</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> NOPASSWD: ALL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">su</span><span class="token plain"> - natasha</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cat</span><span class="token plain"> /etc/shadow</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="16-root비번-설정-rdbreakinitbinbash">16. root비번 설정 (rd.break，init=/bin/bash)<a href="https://www.geuni.tech/en/linux/rhcsa_practice#16-root%EB%B9%84%EB%B2%88-%EC%84%A4%EC%A0%95-rdbreakinitbinbash" class="hash-link" aria-label="Direct link to 16. root비번 설정 (rd.break，init=/bin/bash)" title="Direct link to 16. root비번 설정 (rd.break，init=/bin/bash)">​</a></h3>
<p><em><strong>node2</strong></em>의 <em><strong>root</strong></em> 비밀번호를 <em><strong>flectrag</strong></em>로 설정하세요. 이를 수행하려면 시스템 접근 권한이 필요합니다.</p>
<blockquote>
<p><em><strong>rd.break</strong></em>, <em><strong>init=/bin/bash</strong></em> 두가지 풀이법이 있다.<br>
<!-- -->참고로 rd.break가 안먹힌다고 하는 소문이 있으나, RH134 교재내용에서는 rd.break방식에 대한 언급밖에 없다. 안될 이유가?<br>
<!-- -->일단 rd.break, init=/bin/bash 두가지 풀이법 모두 익숙하도록</p>
</blockquote>
<p>원본 교재내용 참고：</p>
<blockquote>
<p>To access that root shell, follow these steps:</p>
</blockquote>
<ol>
<li>Reboot the system.</li>
<li>Interrupt the boot-loader countdown by pressing any key, except Enter.</li>
<li><strong>Move the cursor to the rescue kernel entry to boot</strong> (the one with the word rescue in its name).</li>
<li>Press e to edit the selected entry.</li>
<li>Move the cursor to the kernel command line (the line that starts with linux).</li>
<li>Append <em><strong>rd.break</strong></em>. With that option, the system breaks just before the system hands control from the initramfs to the actual system.</li>
<li>Press Ctrl+x to boot with the changes.</li>
<li>Press Enter to perform maintenance when prompted.</li>
</ol>
<p><strong><em><code>rd.break</code></em> 방식 :</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># grub menu -&gt; rescue kernel 선택 -&gt; e클릭, rescue kernel이 안보일때 일반적으로 기본kernel이 같은 기능을 해줄수 있음.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># linux로 시작하는 행끝에 rd.break 추가 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">rd.break</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ctrl + x</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#  rw 모드로 다시 mount</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> remount,rw /sysroot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 파일 시스템의 루트 변경</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chroot</span><span class="token plain"> /sysroot</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 비밀번호 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> root </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># relabel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">touch</span><span class="token plain"> /.autorelabel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># exit chroot</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># exit initramfs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exit</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong><em><code>init=/bin/bash</code></em> 방식 :</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># grub메뉴에서 e클릭</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># linux로 시작하는 행끝에 init=/bin.bash 추가 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">init</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/bin.bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ctrl + x</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">#  rw 모드로 다시 mount</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-o</span><span class="token plain"> remount,rw /</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 비밀번호 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> flectrag </span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">passwd</span><span class="token plain"> root </span><span class="token parameter variable" style="color:#36acaa">--stdin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># relabel</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">touch</span><span class="token plain"> /.autorelabel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 시스템 구동</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">exec</span><span class="token plain"> /sbin/init </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="17-yum-저장소-설정">17. Yum 저장소 설정<a href="https://www.geuni.tech/en/linux/rhcsa_practice#17-yum-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Direct link to 17. Yum 저장소 설정" title="Direct link to 17. Yum 저장소 설정">​</a></h3>
<p>YUM 기본 저장소를 아래와 같이 변경하세요.</p>
<p>아래와 같은 YUM 저장소가 사용가능합니다.</p>
<ul>
<li><em><strong><a href="http://content/rhel9.0/x86_64/dvd/BaseOS" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/BaseOS</a></strong></em></li>
<li><em><strong><a href="http://content/rhel9.0/x86_64/dvd/Appstream" target="_blank" rel="noopener noreferrer">http://content/rhel9.0/x86_64/dvd/Appstream</a></strong></em></li>
</ul>
<p>YUM 기본저장소를 위에 제공되는 저장소를 사용하도록 시스템을 구성하세요.</p>
<blockquote>
<p>Node1 2번 문제 참고, Node1에서 생성된 repo파일 scp 명령으로 가져와두 됨</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="18-lvm---lvextend">18. LVM - lvextend<a href="https://www.geuni.tech/en/linux/rhcsa_practice#18-lvm---lvextend" class="hash-link" aria-label="Direct link to 18. LVM - lvextend" title="Direct link to 18. LVM - lvextend">​</a></h3>
<p>논리 볼륨 vo의 파일 시스템 크기를 230MiB로 조정하세요. 파일 시스템의 내용은 그대로 유지되어야 합니다. 참고로, 파티션 크기가 요청된 크기와 정확히 일치하지 않는 경우가 많으므로, 213MiB에서 243MiB 범위의 크기는 허용됩니다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># List all logical volumes in all volume groups</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lvscan</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lvextend </span><span class="token parameter variable" style="color:#36acaa">-L</span><span class="token plain"> 230M /dev/myvol/vo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">resize2fs /dev/myvol/vo</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="19-swap-partition">19. Swap partition<a href="https://www.geuni.tech/en/linux/rhcsa_practice#19-swap-partition" class="hash-link" aria-label="Direct link to 19. Swap partition" title="Direct link to 19. Swap partition">​</a></h3>
<p>시스템에 <em><strong>512MiB</strong></em>의 추가 스왑 파티션을 추가하세요. 스왑 파티션은 시스템이 부팅될 때 자동으로 마운트되어야 합니다. 시스템에 있는 기존 스왑 파티션은 삭제하거나 변경하지 마세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># fdisk나 parted 편한 명령어를 사용하면 됨</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parted</span><span class="token plain"> /dev/vdb unit mib print</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parted</span><span class="token plain"> /dev/vdb mkpart my-swap linux-swap 722MiB 1234MiB</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parted</span><span class="token plain"> /dev/vdb print</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkswap</span><span class="token plain"> /dev/vdb3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/fstab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/vdb3 swap swap defaults </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">swapon</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-a</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">swapon</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--show</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="20--lvm---lvcreate">20.  LVM - lvcreate<a href="https://www.geuni.tech/en/linux/rhcsa_practice#20--lvm---lvcreate" class="hash-link" aria-label="Direct link to 20.  LVM - lvcreate" title="Direct link to 20.  LVM - lvcreate">​</a></h3>
<ul>
<li><em><strong>qa</strong></em>라는 이름의 논리 볼륨을 <em><strong>qagroup</strong></em> 볼륨 그룹에 생성하고, 크기는 <em><strong>60개의 익스텐트 블록</strong></em>으로 설정하세요.</li>
<li><em><strong>qagroup</strong></em> 볼륨 그룹 내 논리 볼륨의 <em><strong>익스텐트 블록 size</strong></em>는 <em><strong>16MiB</strong></em>여야 합니다.</li>
<li>새 논리 볼륨을 <em><strong>vfat</strong></em> 파일 시스템으로 포맷하고, 시스템 부팅 시 <em><strong>/mnt/qa</strong></em>에 자동으로 마운트되도록 설정하세요.</li>
</ul>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 60PEs x 16MiB = 960MiB , pv 크기는 960M보다 커야 된다. (넉넉히 잡아주도록)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start position확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parted</span><span class="token plain"> /dev/vdb unit mib print</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 퍼티션 생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">parted</span><span class="token plain"> /dev/vdb mkpart primary 1235mib 2500mib</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># pv생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pvcreate /dev/vdb4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># vg생성 및 블록size를 16M로 지정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vgcreate qagroup </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> 16M /dev/vdb4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># lv생성 및 블록size 지정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">lvcreate </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> qa </span><span class="token parameter variable" style="color:#36acaa">-l</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token plain"> qagroup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 파일시스템  생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mkfs.vfat /dev/qagroup/qa</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /mnt/qa</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/fstab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/dev/qagroup/qa /mnt/qa vfat defaults </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl daemon-reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> /mnt/qa</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mount</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> /mnt/qa</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="21--tuned">21.  tuned<a href="https://www.geuni.tech/en/linux/rhcsa_practice#21--tuned" class="hash-link" aria-label="Direct link to 21.  tuned" title="Direct link to 21.  tuned">​</a></h3>
<p>시스템에 권장되는 <em><strong>tuned</strong></em> 프로파일을 선택하고 기본 설정으로 설정하세요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 설치 및 구동</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dnf </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-y</span><span class="token plain"> tuned</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token builtin class-name">enable</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> tuned</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># active profile확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tuned-adm active</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 권장 profile확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tuned-adm recommend</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 권장 profile 지정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tuned-adm profile virtual-guest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 검증, active profile 다시 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">tuned-adm active</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>Linux</category>
            <category>RHCSA</category>
        </item>
        <item>
            <title><![CDATA[High-Availability Nginx Load Balancing with Keepalived and HAProxy]]></title>
            <link>https://www.geuni.tech/en/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy</link>
            <guid>https://www.geuni.tech/en/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy</guid>
            <pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This article introduces how to set up a high-availability load balancing architecture for Nginx using the combination of Keepalived and HAProxy.]]></description>
            <content:encoded><![CDATA[<p>This article introduces how to set up a high-availability load balancing architecture for <em><strong>Nginx</strong></em> using the combination of <em><strong>Keepalived</strong></em> and <em><strong>HAProxy</strong></em>.</p>
<p>First, let's see what are the problems or drawbacks when using Keepalived or HAProxy alone.</p>
<p><strong>1. Nginx + Keepalived :</strong></p>
<p>This approach has the drawback of inefficient resource utilization and is suitable only for low-throughput scenarios.
Without using LVS, we can only implement an Active-Passive architecture. Since the backup server has to stay online, why not build an SLB (Server Load Balancer) with an Active-Active architecture?</p>
<p>While the Keepalived + LVS method can achieve load balancing, LVS operates at Layer 4 (Transport Layer) and has limited functionality. HAProxy, with its application-layer load balancing capabilities, offers a clear advantage.</p>
<p><strong>2. Nginx + HAProxy :</strong></p>
<p>This approach suffers from a single point of failure. If the single HAProxy server goes down, the entire service becomes unavailable.</p>
<p><strong>3. Nginx + Keepalived + HAProxy :</strong></p>
<p>This setup supports high concurrency and addresses the single point of failure issue.</p>
<p>To understand the features of Keepalived and HAProxy, we will implement the architecture in two steps:</p>
<ol>
<li>Use Nginx + Keepalived to achieve a high-availability Active-Passive architecture.</li>
<li>Extend this with HAProxy to achieve high-availability load balancing.</li>
</ol>
<p><strong>Prerequisites</strong></p>
<p>OS:  Ubuntu 22.04.4 LTS</p>
<p>Nginx: 1.18.0</p>
<p>Keepalived: v2.2.4</p>
<p>HAProxy:  2.4.24</p>
<table><thead><tr><th>No.</th><th>host name</th><th>IP</th><th>node roles</th></tr></thead><tbody><tr><td>#1</td><td>svr1</td><td>172.25.254.131</td><td>Keepalived(master), Nginx, HAProxy</td></tr><tr><td>#2</td><td>svr2</td><td>172.25.254.132</td><td>Keepalived(backup), Nginx, HAProxy</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="configuring-keepalived-for-active-passive-ha">Configuring keepalived for Active-Passive HA<a href="https://www.geuni.tech/en/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#configuring-keepalived-for-active-passive-ha" class="hash-link" aria-label="Direct link to Configuring keepalived for Active-Passive HA" title="Direct link to Configuring keepalived for Active-Passive HA">​</a></h3>
<p>In the first phase, the architecture aims to allow users to access Nginx through a Virtual IP (VIP). If server #1 fails, the VIP will switch to server #2, ensuring service continuity.</p>
<p><img decoding="async" loading="lazy" alt="keepalived-active-passive" src="https://www.geuni.tech/en/assets/images/image-20240508165429517-06e97905cf39c1aa7e385cf273d2204e.png" width="1089" height="576" class="img_ev3q"></p>
<p><strong>install</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> keepalived</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> nginx</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Edit the Keepalived configuration file on both servers.</p>
<p><strong>Server #1 Configuration</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/keepalived/keepalived.conf </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">global_defs </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  router_id nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Nginx health check script</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vrrp_script check_nginx </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  script </span><span class="token string" style="color:#e3116c">"/etc/keepalived/check_nginx.sh"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  interval </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  weight </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vrrp_instance VI_1 </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Initial instance state (MASTER or BACKUP)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    state MASTER            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Network interface for VRRP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    interface ens33    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Virtual router ID (0-255)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    virtual_router_id </span><span class="token number" style="color:#36acaa">62</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Priority, higher priority becomes master</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    priority </span><span class="token number" style="color:#36acaa">151</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># VRRP advertisement interval (in seconds)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    advert_int </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Non-preemptive mode, allows a lower-priority node to remain master</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nopreempt			</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Source IP for VRRP unicast</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unicast_src_ip </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Peer IP for VRRP unicast</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unicast_peer </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Authentication for node communication (must match on both nodes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    authentication </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        auth_type PASS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        auth_pass </span><span class="token number" style="color:#36acaa">1111</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Virtual IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    virtual_ipaddress </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.130      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Health check script</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    track_script </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        check_nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Server #2 Configuration</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/keepalived/keepalived.conf </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">global_defs </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  router_id nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Nginx health check script</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vrrp_script check_nginx </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  script </span><span class="token string" style="color:#e3116c">"/etc/keepalived/check_nginx.sh"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  interval </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  weight </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">vrrp_instance VI_1 </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Initial instance state (MASTER or BACKUP)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    state BACKUP            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Network interface for VRRP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    interface ens33    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Virtual router ID (0-255)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    virtual_router_id </span><span class="token number" style="color:#36acaa">62</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># higher priority becomes master</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    priority </span><span class="token number" style="color:#36acaa">150</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># VRRP advertisement interval (in seconds)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    advert_int </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Non-preemptive mode, allows a lower-priority node to remain master</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    nopreempt			</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Source IP for VRRP unicast</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unicast_src_ip </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Peer IP for VRRP unicast</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    unicast_peer </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Authentication for node communication (must match on both nodes)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    authentication </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        auth_type PASS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        auth_pass </span><span class="token number" style="color:#36acaa">1111</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Virtual IP</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    virtual_ipaddress </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.130      </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Health check script</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    track_script </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        check_nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Create the following script on both servers to monitor the status of Nginx:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/keepalived/check_nginx.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token shebang important">#!/bin/sh</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-z</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">`</span><span class="token string variable" style="color:#36acaa">/usr/bin/pidof nginx</span><span class="token string variable" style="color:#36acaa">`</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  systemctl stop keepalived</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token builtin class-name">exit</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fi</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Add execution permissions:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /etc/keepalived/check_nginx.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Starting Services</strong></p>
<p>Start Nginx and check its status:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl start nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status nginx</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">● nginx.service - A high performance web server and a reverse proxy server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Loaded: loaded </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">/lib/systemd/system/nginx.service</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> vendor preset: enabled</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Active: active </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">running</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> since Tue </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-05-07 07:22:43 UTC</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> 37s ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       Docs: man:nginx</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">8</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Process: </span><span class="token number" style="color:#36acaa">205677</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ExecStartPre</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/sbin/nginx </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-q</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> daemon on</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> master_process on</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">code</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">exited, </span><span class="token assign-left variable" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">/SUCCESS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Process: </span><span class="token number" style="color:#36acaa">205678</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">ExecStart</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/sbin/nginx </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> daemon on</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> master_process on</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">code</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">exited, </span><span class="token assign-left variable" style="color:#36acaa">status</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">/SUCCESS</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Main PID: </span><span class="token number" style="color:#36acaa">205679</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">nginx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Tasks: </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">limit: </span><span class="token number" style="color:#36acaa">4515</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Memory: </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">.3M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        CPU: 52ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     CGroup: /system.slice/nginx.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             ├─205679 </span><span class="token string" style="color:#e3116c">"nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             ├─205680 </span><span class="token string" style="color:#e3116c">"nginx: worker process"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             └─205681 </span><span class="token string" style="color:#e3116c">"nginx: worker process"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:22:43 svr1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Starting A high performance web server and a reverse proxy server</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:22:43 svr1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Started A high performance web server and a reverse proxy server.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Start keepalived and check its status:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> systemctl start keepalived</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status keepalived</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">● keepalived.service - Keepalive Daemon </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">LVS and VRRP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Loaded: loaded </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">/lib/systemd/system/keepalived.service</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> enabled</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> vendor preset: enabled</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Active: active </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">running</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> since Tue </span><span class="token number" style="color:#36acaa">2024</span><span class="token plain">-05-07 07:25:20 UTC</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> 18s ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Main PID: </span><span class="token number" style="color:#36acaa">205688</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">keepalived</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Tasks: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">limit: </span><span class="token number" style="color:#36acaa">4515</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Memory: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">.0M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        CPU: 265ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     CGroup: /system.slice/keepalived.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             ├─205688 /usr/sbin/keepalived --dont-fork</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             └─205689 /usr/sbin/keepalived --dont-fork</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205688</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Starting VRRP child process, </span><span class="token assign-left variable" style="color:#36acaa">pid</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">205689</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: keepalived.service: Got notification message from PID </span><span class="token number" style="color:#36acaa">205689</span><span class="token plain">, but reception only permitted </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> main PID </span><span class="token number" style="color:#36acaa">205688</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: WARNING - default user </span><span class="token string" style="color:#e3116c">'keepalived_script'</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> script execution does not exist - please create.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: SECURITY VIOLATION - scripts are being executed but script_security not enabled.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205688</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Startup complete</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Started Keepalive Daemon </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">LVS and VRRP</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">VI_1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> Entering BACKUP STATE </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">init</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: VRRP_Script</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">check_nginx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> succeeded</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:20 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">VI_1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> Changing effective priority from </span><span class="token number" style="color:#36acaa">101</span><span class="token plain"> to </span><span class="token number" style="color:#36acaa">151</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">May 07 07:25:24 svr1 Keepalived_vrrp</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">205689</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">VI_1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> Entering MASTER STATE</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>After starting Keepalived, verify that the VIP is assigned on the master server.</p>
<p><strong>#1 Server (Master)</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ip addr</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 127.0.0.1/8 scope host lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 ::1/128 scope host </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether 00:0c:29:a1:d7:ea brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    altname enp2s1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.131/24 brd 172.25.254.255 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.130/32 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 fe80::20c:29ff:fea1:d7ea/64 scope link </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>#2 Server (Backup)</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> addr</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 127.0.0.1/8 scope host lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 ::1/128 scope host </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether 00:0c:29:5c:c4:91 brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    altname enp2s1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.132/24 brd 172.25.254.255 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 fe80::20c:29ff:fe5c:c491/64 scope link </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Failover Testing</strong></p>
<p>Stop Nginx on the master server and check if failover occurs:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo systemctl stop nginx</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Verify that the VIP is now assigned to the backup server.</p>
<p><strong>#1 Server (Master)</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">ip</span><span class="token plain"> addr</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 127.0.0.1/8 scope host lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 ::1/128 scope host </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether 00:0c:29:a1:d7:ea brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    altname enp2s1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.131/24 brd 172.25.254.255 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 fe80::20c:29ff:fea1:d7ea/64 scope link </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>#2 Server (Backup)</strong></p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ip addr</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 127.0.0.1/8 scope host lo</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 ::1/128 scope host </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2: ens33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    link/ether 00:0c:29:5c:c4:91 brd ff:ff:ff:ff:ff:ff</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    altname enp2s1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.132/24 brd 172.25.254.255 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet 172.25.254.130/32 scope global ens33</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    inet6 fe80::20c:29ff:fe5c:c491/64 scope link </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       valid_lft forever preferred_lft forever</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The VIP should transition seamlessly to the backup server.</p>
<p><img decoding="async" loading="lazy" alt="keepalived_failover" src="https://www.geuni.tech/en/assets/images/keepalived_failover-89bf8e6ad8b50aeefed2fc0aa3e92a60.gif" width="1944" height="587" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="adding-haproxy-for-active-active-load-balancing">Adding HAProxy for Active-Active Load Balancing<a href="https://www.geuni.tech/en/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#adding-haproxy-for-active-active-load-balancing" class="hash-link" aria-label="Direct link to Adding HAProxy for Active-Active Load Balancing" title="Direct link to Adding HAProxy for Active-Active Load Balancing">​</a></h3>
<p>Building upon the previous architecture, introduce HAProxy to enable active-active load balancing.</p>
<p><img decoding="async" loading="lazy" alt="keepalived_haproxy" src="https://www.geuni.tech/en/assets/images/image-20240508162845399-2a73dcc5c0b8147899d9ee34cd2ce389.png" width="925" height="748" class="img_ev3q"></p>
<p>Install HAProxy on both servers:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> haproxy</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Edit the HAProxy configuration file:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/haproxy/haproxy.cfg</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">global</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        log /dev/log    local0 info</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        log /dev/log    local1 warning</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">chroot</span><span class="token plain"> /var/lib/haproxy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stats socket /run/haproxy/admin.sock mode </span><span class="token number" style="color:#36acaa">660</span><span class="token plain"> level admin expose-fd listeners</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stats </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> 30s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        user haproxy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        group haproxy</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        maxconn </span><span class="token number" style="color:#36acaa">60000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        daemon</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">defaults</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        log     global</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        mode    http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        option  httplog</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        option  dontlognull</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        retries </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> http-request 10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> connect 3s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> client  10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> server  10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> http-keep-alive 10s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">timeout</span><span class="token plain"> check           2s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">400</span><span class="token plain"> /etc/haproxy/errors/400.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">403</span><span class="token plain"> /etc/haproxy/errors/403.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">408</span><span class="token plain"> /etc/haproxy/errors/408.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">500</span><span class="token plain"> /etc/haproxy/errors/500.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">502</span><span class="token plain"> /etc/haproxy/errors/502.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">503</span><span class="token plain"> /etc/haproxy/errors/503.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        errorfile </span><span class="token number" style="color:#36acaa">504</span><span class="token plain"> /etc/haproxy/errors/504.http</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">frontend http-in</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token builtin class-name">bind</span><span class="token plain"> *:8000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    maxconn </span><span class="token number" style="color:#36acaa">20000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default_backend servers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">backend servers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    balance roundrobin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    server server1 </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:80 check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    server server2 </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132:80 check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="testing-load-balancing-and-high-availability">Testing Load Balancing and High Availability<a href="https://www.geuni.tech/en/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#testing-load-balancing-and-high-availability" class="hash-link" aria-label="Direct link to Testing Load Balancing and High Availability" title="Direct link to Testing Load Balancing and High Availability">​</a></h3>
<p>Perform tests to ensure HAProxy and Keepalived are functioning as expected with active-active load balancing across the two servers.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">while sleep 1 ; do curl http://172.25.254.130:8000 ; done</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="keepalived_haproxy" src="https://www.geuni.tech/en/assets/images/keepalived_haproxy_test-7fa62a7273547128ae9664bbff077788.gif" width="1935" height="660" class="img_ev3q"></p>]]></content:encoded>
            <category>Keepalived</category>
            <category>HAProxy</category>
            <category>Nginx</category>
        </item>
        <item>
            <title><![CDATA[Redis 설치 및 Sentinel을 이용한 failover환경 구성하기]]></title>
            <link>https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration</link>
            <guid>https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration</guid>
            <pubDate>Mon, 25 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Redis 설치 및 Replication 구성, Sentinel을 이용한 failover환경 구성 등 방법을 상세하게 소개합니다.]]></description>
            <content:encoded><![CDATA[<p><strong>설치환경 및 Redis소스버전</strong></p>
<p>OS:  Ubuntu 22.04.3 LTS</p>
<p>Redis: 7.2.3</p>
<p>아래와 같이 3개의 VM을 준비한다.</p>
<table><thead><tr><th>No.</th><th>host name</th><th>IP</th><th>node roles</th></tr></thead><tbody><tr><td>#1</td><td>redis-server1</td><td>172.25.254.131</td><td>redis (master), sentinel</td></tr><tr><td>#2</td><td>redis-server2</td><td>172.25.254.132</td><td>redis (slave), sentinel</td></tr><tr><td>#3</td><td>redis-server3</td><td>172.25.254.133</td><td>redis (slave), sentinel</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="빌드-패키지-설치">빌드 패키지 설치<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#%EB%B9%8C%EB%93%9C-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Direct link to 빌드 패키지 설치" title="Direct link to 빌드 패키지 설치">​</a></h3>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> update</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> build-essential</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># systemd로 서비스관리를 원할 경우libsystemd-dev(Debian/Ubuntu) 혹은 systemd-devel(CentOS) 패키지 설치 필요</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> libsystemd-dev</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># sudo yum -y install systemd-devel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>redis 소스폴더 README참고:</p>
<blockquote>
<p>To build with systemd support, you'll need systemd development libraries (such
as <strong>libsystemd-dev on Debian/Ubuntu</strong> or <strong>systemd-devel on CentOS</strong>) and run:</p>
<p>% make USE_SYSTEMD=yes</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="redis-소스다운로드-및-컴파일-설치">Redis 소스다운로드 및 컴파일 설치<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#redis-%EC%86%8C%EC%8A%A4%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EC%BB%B4%ED%8C%8C%EC%9D%BC-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Direct link to Redis 소스다운로드 및 컴파일 설치" title="Direct link to Redis 소스다운로드 및 컴파일 설치">​</a></h3>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 소스 다운로드</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-O</span><span class="token plain"> https://download.redis.io/redis-stable.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># or</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://download.redis.io/redis-stable.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 압축 해제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xzvf</span><span class="token plain"> redis-stable.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> redis-stable</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 소스 컴파일 및 설치, systemd 지원옵션은 필요여부에 따라 넣으면 됨</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">USE_SYSTEMD</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">PREFIX</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/local/redis-server </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># redis 및 sentinel의 config template 복사</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">cp</span><span class="token plain"> redis.conf sentinel.conf /usr/local/redis-server/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log 디렉토리 생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> /usr/local/redis-server/logs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="redis-사용자-계정-생성">Redis 사용자 계정 생성<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#redis-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B3%84%EC%A0%95-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to Redis 사용자 계정 생성" title="Direct link to Redis 사용자 계정 생성">​</a></h3>
<p>사용자 계정 생성 및 권한설정</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> adduser </span><span class="token parameter variable" style="color:#36acaa">--system</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--group</span><span class="token plain"> --no-create-home redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">chown</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-R</span><span class="token plain"> redis:redis /usr/local/redis-server</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="replication구성-master--slave">Replication구성 (Master / Slave)<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#replication%EA%B5%AC%EC%84%B1-master--slave" class="hash-link" aria-label="Direct link to Replication구성 (Master / Slave)" title="Direct link to Replication구성 (Master / Slave)">​</a></h3>
<p>서버별로 아래와 같이 <code>redis.conf</code>파일 편집</p>
<p><strong>master서버 #1 (172.25.254.131)</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /usr/local/redis-server/redis.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># listening IP, 개발환경 같은 경우 편이성을 위하여 코멘트 처리 하거나 0.0.0.0으로 bind해도 되나</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 인터넷에 노출된 서버이거나 운영환경일 경우 보안을 고려하여 IP를 세팅해주자.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">bind</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 워킹 디렉토리(working directory), rdb, aof파일이 저장되는 위치, Redis는 해당 경로에 대한 R/W권한이 필히 필요함.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">dir</span><span class="token plain"> /usr/local/redis-server/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># replication을 위하여 slave가 master에 접속시 사용되는 비번</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># failover를 고려하여 master, slave 무관하게 masterauth, requirepass 같게 설정할것을 권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">masterauth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 비번설정, 다른 명령 실행시 "AUTH &lt;PASSWORD&gt;" 명령으로 인증후 실행가능.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">requirepass mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log파일 위치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logfile </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/logs/redis.log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># redis주기적으로 RDB(dump)파일을 떨구지만, 장애 발생시 미치 떨구지 못한 데이터는 유실되게 된다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 데이터 유실 최소화를 원한다면 AOF 기능을 사용할것을 권장한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendonly </span><span class="token function" style="color:#d73a49">yes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># appendonly가 yes로 설정했을때 적용되며, aof파일에 append(file sync)하는 주기를 뜻한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no, always, everysec 3개의 옵션이 있으며, </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no: 디스크에 쓰는 시점을 운영체제에 맡긴다</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># always: 비권장 옵션이다. write명령이 실행될 때 마다 aof파일을 쓰므로 성능에 매우 영향을 준다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># everysec: 데이터를 모아서 1초 마다 디스크에 쓴다. 성능과 데이터 보존측면에서 적절한 옵션이다. 판단이 어려울때 everysec권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># If unsure, use "everysec".</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendfsync everysec</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>slave 서버 #2 (172.25.254.132)</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /usr/local/redis-server/redis.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># listening IP, 개발환경 같은 경우 편이성을 위하여 코멘트 처리 하거나 0.0.0.0으로 bind해도 되나</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 인터넷에 노출된 서버이거나 운영환경일 경우 보안을 고려하여 IP를 세팅해주자.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">bind</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 워킹 디렉토리(working directory), rdb, aof파일이 저장되는 위치, Redis는 해당 경로에 대한 R/W권한히 필히 필요함.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">dir</span><span class="token plain"> /usr/local/redis-server/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># replication을 위하여 slave가 master에 접속시 사용되는 비번</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># failover를 고려하여 master, slave 무관하게 masterauth, requirepass 같게 설정할것을 권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">masterauth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 비번설정, 다른 명령 실행시 "AUTH &lt;PASSWORD&gt;" 명령으로 인증후 실행가능.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">requirepass mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># master의 ip/port ( master만 해당옵션을 코멘트 처리해주자 )</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">replicaof </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131 </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log파일 위치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logfile </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/logs/redis.log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># redis주기적으로 RDB(dump)파일을 떨구지만, 장애 발생시 미치 떨구지 못한 데이터는 유실되게 된다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 데이터 유실 최소화를 원한다면 AOF 기능을 사용할것을 권장한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendonly </span><span class="token function" style="color:#d73a49">yes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># appendonly가 yes로 설정했을때 적용되며, aof파일에 append(file sync)하는 주기를 뜻한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no, always, everysec 3개의 옵션이 있으며, </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no: 디스크에 쓰는 시점을 운영체제에 맡긴다</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># always: 비권장 옵션이다. write명령이 실행될 때 마다 aof파일을 쓰므로 성능에 매우 영향을 준다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># everysec: 데이터를 모아서 1초 마다 디스크에 쓴다. 성능과 데이터 보존측면에서 적절한 옵션이다. 판단이 어려울때 everysec권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># If unsure, use "everysec".</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendfsync everysec</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>slave 서버 #3 (172.25.254.133)</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /usr/local/redis-server/redis.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># listening IP, 개발환경 같은 경우 편이성을 위하여 코멘트 처리 하거나 0.0.0.0으로 bind해도 되나</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 인터넷에 노출된 서버이거나 운영환경일 경우 보안을 고려하여 IP를 세팅해주자.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">bind</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.133</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 워킹 디렉토리(working directory), rdb, aof파일이 저장되는 위치, Redis는 해당 경로에 대한 R/W권한히 필히 필요함.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">dir</span><span class="token plain"> /usr/local/redis-server/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># master의 ip/port ( master만 해당옵션을 코멘트 처리해주자 )</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">replicaof </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131 </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># replication을 위하여 slave가 master에 접속시 사용되는 비번</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># failover를 고려하여 master, slave 무관하게 masterauth, requirepass 같게 설정할것을 권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">masterauth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 비번설정, 다른 명령 실행시 "AUTH &lt;PASSWORD&gt;" 명령으로 인증후 실행가능.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">requirepass mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log파일 위치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logfile </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/logs/redis.log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># redis주기적으로 RDB(dump)파일을 떨구지만, 장애 발생시 미치 떨구지 못한 데이터는 유실되게 된다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 데이터 유실 최소화를 원한다면 AOF 기능을 사용할것을 권장한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendonly </span><span class="token function" style="color:#d73a49">yes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># appendonly가 yes로 설정했을때 적용되며, aof파일에 append(file sync)하는 주기를 뜻한다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no, always, everysec 3개의 옵션이 있으며, </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># no: 디스크에 쓰는 시점을 운영체제에 맡긴다</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># always: 비권장 옵션이다. write명령이 실행될 때 마다 aof파일을 쓰므로 성능에 매우 영향을 준다.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># everysec: 데이터를 모아서 1초 마다 디스크에 쓴다. 성능과 데이터 보존측면에서 적절한 옵션이다. 판단이 어려울때 everysec권장</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># If unsure, use "everysec".</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">appendfsync everysec</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>systemd Unit파일 생성</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /etc/systemd/system/redis-server.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=Redis data structure server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Documentation=https://redis.io/documentation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Wants=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/local/redis-server/bin/redis-server /usr/local/redis-server/redis.conf --supervised systemd --daemonize no</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LimitNOFILE=10032</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NoNewPrivileges=yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=notify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TimeoutStartSec=infinity</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TimeoutStopSec=infinity</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UMask=0077</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">User=redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Group=redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>서버별로 redis instance 각각 구동</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl start redis-server</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>구동후 서비스 상태 확인:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status redis-server</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">● redis-server.service - Redis data structure server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Loaded: loaded </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">/etc/systemd/system/redis-server.service</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> disabled</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> vendor preset: enabled</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Active: active </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">running</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> since Fri </span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-22 05:19:08 UTC</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> 6s ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       Docs: https://redis.io/documentation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Main PID: </span><span class="token number" style="color:#36acaa">48121</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">redis-server</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Status: </span><span class="token string" style="color:#e3116c">"Ready to accept connections"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Tasks: </span><span class="token number" style="color:#36acaa">6</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">limit: </span><span class="token number" style="color:#36acaa">2178</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Memory: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">.3M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        CPU: 19ms</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     CGroup: /system.slice/redis-server.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             └─48121 </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/bin/redis-server *:6379"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Dec </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> 05:19:08 kafka-server1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Starting Redis data structure server</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Dec </span><span class="token number" style="color:#36acaa">22</span><span class="token plain"> 05:19:08 kafka-server1 systemd</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">: Started Redis data structure server.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Replication확인</p>
<p>master replication상태 확인</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /usr/local/redis-server/bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./redis-cli </span><span class="token parameter variable" style="color:#36acaa">-h</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> auth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> info replication</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Replication</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">role:master</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">connected_slaves:2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave0:ip</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.133,port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain">,state</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">online,offset</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">95561</span><span class="token plain">,lag</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave1:ip</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132,port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">6379</span><span class="token plain">,state</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">online,offset</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">95561</span><span class="token plain">,lag</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_failover_state:no-failover</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_replid:e396c5f17b331fc17d89f9c03e27e8a4548214f9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_replid2:b950d0774916c8901184640d4652864788e2a51e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_repl_offset:95561</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">second_repl_offset:94277	</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_active:1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_size:1048576</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_first_byte_offset:94277</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_histlen:1285</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>slave replication상태 확인</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 두대의 slave상태 각각 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./redis-cli </span><span class="token parameter variable" style="color:#36acaa">-h</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> auth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> info replication</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Replication</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">role:slave</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_host:172.25.254.131</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_port:6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_link_status:up</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_last_io_seconds_ago:3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_sync_in_progress:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave_read_repl_offset:95603</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave_repl_offset:95603</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave_priority:100</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">slave_read_only:1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">replica_announced:1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">connected_slaves:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_failover_state:no-failover</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_replid:e396c5f17b331fc17d89f9c03e27e8a4548214f9</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_replid2:b950d0774916c8901184640d4652864788e2a51e</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master_repl_offset:95603</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">second_repl_offset:94277</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_active:1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_size:1048576</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_first_byte_offset:93577</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">repl_backlog_histlen:2027</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>서비스 활성화:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl enable redis-server</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel-구성">Sentinel 구성<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#sentinel-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Direct link to Sentinel 구성" title="Direct link to Sentinel 구성">​</a></h3>
<p>서버별로 <code>sentinel.conf</code>편집</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo vim /usr/local/redis-server/sentinel.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># pid파일 위치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pidfile </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/logs/redis-sentinel.pid"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log파일 위치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logfile </span><span class="token string" style="color:#e3116c">"/usr/local/redis-server/logs/sentinel.log"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># monitoring대상 master정보 및 O_DOWN판정(failover)에 필요한 최저 투표수</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># sentinel monitor &lt;master-name&gt; &lt;ip&gt; &lt;port&gt; &lt;quorum&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel monitor mymaster </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131 </span><span class="token number" style="color:#36acaa">6379</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># master비번</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel auth-pass mymaster mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># master S_DOWN판정 시간</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel down-after-milliseconds mymaster </span><span class="token number" style="color:#36acaa">6000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel failover-timeout mymaster </span><span class="token number" style="color:#36acaa">180000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>systemd Unit파일 생성</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">sudo vim /etc/systemd/system/redis-sentinel.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=Redis sentinel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Documentation=https://redis.io/docs/management/sentinel/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Wants=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/usr/local/redis-server/bin/redis-sentinel /usr/local/redis-server/sentinel.conf --supervised systemd --daemonize no</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LimitNOFILE=10032</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NoNewPrivileges=yes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=notify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TimeoutStartSec=infinity</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TimeoutStopSec=infinity</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">UMask=0077</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">User=redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Group=redis</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>서버별로 sentinel instance 각각 구동</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl start redis-sentinel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>구동후 서비스 상태 확인:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status redis-sentinel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">● redis-sentinel.service - Redis sentinel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Loaded: loaded (/etc/systemd/system/redis-sentinel.service; disabled; vendor preset: enabled)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Active: active (running) since Fri 2023-12-22 07:47:47 UTC; 16min ago</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">       Docs: https://redis.io/docs/management/sentinel/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   Main PID: 85260 (redis-sentinel)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Status: "Ready to accept connections"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      Tasks: 5 (limit: 2178)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     Memory: 2.1M</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        CPU: 3.497s</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">     CGroup: /system.slice/redis-sentinel.service</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             └─85260 "/usr/local/redis-server/bin/redis-sentinel *:26379 [sentinel]" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Dec 22 07:47:47 kafka-server3 systemd[1]: Starting Redis sentinel...</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Dec 22 07:47:47 kafka-server3 systemd[1]: Started Redis sentinel.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Sentinel 상태정보 확인</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /usr/local/redis-server/bin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./redis-cli </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">26379</span><span class="token plain"> info sentinel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Sentinel</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_masters:1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_tilt:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_tilt_since_seconds:-1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_running_scripts:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_scripts_queue_length:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sentinel_simulate_failure_flags:0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">master0:name=mymaster,status=ok,address=172.25.254.131:6379,slaves=2,sentinels=3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>서비스 활성화:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">systemctl enable redis-sentinel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="failover-테스트">Failover 테스트<a href="https://www.geuni.tech/en/redis/redis_install_from_source_and_sentinel_configuration#failover-%ED%85%8C%EC%8A%A4%ED%8A%B8" class="hash-link" aria-label="Direct link to Failover 테스트" title="Direct link to Failover 테스트">​</a></h3>
<p>이 단계에서 failover 테스트를 해보자.  master process를 kill 혹은 sleep 처리하여 구성정보가 정상적으로 변경되였는지 확인하면 된다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./bin/redis-cli</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">127.0</span><span class="token plain">.0.1:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> auth mypass</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># debug명령은 redis.conf의 enable-debug-command옵션을 "local" 혹은 "yes"로 변경후 사용가능하다</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">127.0</span><span class="token plain">.0.1:637</span><span class="token operator file-descriptor important" style="color:#393A34">9</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> debug </span><span class="token function" style="color:#d73a49">sleep</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token plain">.01s</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>log확인</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.033 # +sdown master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.088 # +odown master mymaster 172.25.254.131 6379 #quorum 2/2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.088 # +new-epoch 11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.088 # +try-failover master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.093 * Sentinel new configuration saved on disk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.093 # +vote-for-leader 8a8d49f48649f665877ae3821c411d2511f1e084 11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.100 * 79aafc906bc392865fbb1c6f1c9d4f38d8996332 voted for 8a8d49f48649f665877ae3821c411d2511f1e084 11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.100 * d5e27cf5588cc89870ba1454872b6eedf8f4cae7 voted for 8a8d49f48649f665877ae3821c411d2511f1e084 11</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.155 # +elected-leader master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.155 # +failover-state-select-slave master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.215 # +selected-slave slave 172.25.254.133:6379 172.25.254.133 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.215 * +failover-state-send-slaveof-noone slave 172.25.254.133:6379 172.25.254.133 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:57.272 * +failover-state-wait-promotion slave 172.25.254.133:6379 172.25.254.133 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:58.159 * Sentinel new configuration saved on disk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:58.159 # +promoted-slave slave 172.25.254.133:6379 172.25.254.133 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:58.159 # +failover-state-reconf-slaves master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:58.258 * +slave-reconf-sent slave 172.25.254.132:6379 172.25.254.132 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.177 * +slave-reconf-inprog slave 172.25.254.132:6379 172.25.254.132 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.177 * +slave-reconf-done slave 172.25.254.132:6379 172.25.254.132 6379 @ mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.231 # -odown master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.231 # +failover-end master mymaster 172.25.254.131 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.231 # +switch-master mymaster 172.25.254.131 6379 172.25.254.133 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.231 * +slave slave 172.25.254.132:6379 172.25.254.132 6379 @ mymaster 172.25.254.133 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.231 * +slave slave 172.25.254.131:6379 172.25.254.131 6379 @ mymaster 172.25.254.133 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:30:59.233 * Sentinel new configuration saved on disk</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">122668:X 25 Dec 2023 01:31:10.692 * +convert-to-slave slave 172.25.254.131:6379 172.25.254.131 6379 @ mymaster 172.25.254.133 6379</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>대체적으로 아래와 같은 과정을 거쳐 failover가 완료된다.</p>
<ol>
<li>master의 다운상태 감지후 +sdown(주관적 다운)이벤트가 발생</li>
<li>+sdown(주관적 다운) 상태에 대한 기타 sentine의 동의를 거친후 +odown(객관적 다운)상태로 승격</li>
<li>sentinel leader 선출</li>
<li>failover 수행</li>
</ol>
<p>신규 master정보 조회</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./redis-cli -p 26379 sentinel get-master-addr-by-name mymaster</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">1) "172.25.254.133"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2) "6379"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>master ip가 172.25.254.131에서 172.25.254.133으로 변한것을 확인할수 있다.</p>]]></content:encoded>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[Kafka Installation and Cluster Setup]]></title>
            <link>https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster</link>
            <guid>https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster</guid>
            <pubDate>Fri, 01 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[This guide walks you through Kafka installation, cluster setup using Kraft or Zookeeper, topic creation, and message testing.  Learn how to optimize your Kafka cluster for performance and scalability.]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-kafka">What is Kafka?<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#what-is-kafka" class="hash-link" aria-label="Direct link to What is Kafka?" title="Direct link to What is Kafka?">​</a></h3>
<p>Kafka is a distributed event streaming platform designed for large-scale data collection, processing, storage, and integration. Its use cases include distributed data streams, stream processing, data integration, and pub/sub messaging.</p>
<p>To better understand Kafka, we first need to grasp the concept of an event.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-an-event">What is an Event?<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#what-is-an-event" class="hash-link" aria-label="Direct link to What is an Event?" title="Direct link to What is an Event?">​</a></h3>
<p>An event is any type of action, occurrence, or change that an application recognizes or records. Examples include a payment transaction, a webpage click, a temperature reading, or any description of what has occurred.</p>
<p>An event can be seen as a combination of notification and state. The notification is the time-sensitive element that triggers the next event, while the state is the description of the event itself.</p>
<p>We often use familiar data formats like JSON to express this state information, and we frequently refer to it as a message.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="kafka-architecture-and-core-concepts">Kafka Architecture and Core Concepts<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#kafka-architecture-and-core-concepts" class="hash-link" aria-label="Direct link to Kafka Architecture and Core Concepts" title="Direct link to Kafka Architecture and Core Concepts">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="topic">Topic<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#topic" class="hash-link" aria-label="Direct link to Topic" title="Direct link to Topic">​</a></h4>
<p>The most fundamental unit in Kafka is a <em><strong>topic</strong></em>, which is analogous to a table in a relational database.</p>
<p>You can create different topics to store various types of events or filtered and transformed versions of the same events.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="partition">Partition<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#partition" class="hash-link" aria-label="Direct link to Partition" title="Direct link to Partition">​</a></h4>
<p>As a distributed system, Kafka offers partitioning for topics to achieve higher read/write throughput and enable horizontal scalability.</p>
<p>Partitions divide a single topic log into multiple logs, each residing on a separate node in the Kafka cluster. This allows the workload of storing messages, writing new messages, and processing existing messages to be distributed across many nodes in the cluster.</p>
<p>In essence, a topic consists of multiple partitions distributed across servers. Topics are logical splits of data, while partitions are physical splits.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="brokers">Brokers<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#brokers" class="hash-link" aria-label="Direct link to Brokers" title="Direct link to Brokers">​</a></h4>
<p>Each node/server in a Kafka cluster is referred to as a <em><strong>broker</strong></em>, and brokers host multiple partitions of a topic.</p>
<p>Brokers handle all read/write requests for events in partitions, as well as data replication across partitions.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="replication">Replication<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#replication" class="hash-link" aria-label="Direct link to Replication" title="Direct link to Replication">​</a></h4>
<p>If a partition is stored on a single broker, node failures can result in data loss. To ensure high availability, each partition has redundant replicas managed by multiple brokers.</p>
<p>The primary replica of a partition is called the <em><strong>leader replica</strong></em>, which handles all read/write requests, while <em><strong>follower replicas</strong></em> synchronize data from the leader but do not serve external requests.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="installation-and-cluster-configuration">Installation and Cluster Configuration<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#installation-and-cluster-configuration" class="hash-link" aria-label="Direct link to Installation and Cluster Configuration" title="Direct link to Installation and Cluster Configuration">​</a></h3>
<p>Here, we set up a Kafka cluster environment using three virtual machines:</p>
<table><thead><tr><th>No.</th><th>host name</th><th>IP</th><th>node roles</th></tr></thead><tbody><tr><td>#1</td><td>kafka-server1</td><td>172.25.254.131</td><td>broker,Kraft controller (or zookeeper)</td></tr><tr><td>#2</td><td>kafka-server2</td><td>172.25.254.132</td><td>broker,Kraft controller (or zookeeper)</td></tr><tr><td>#3</td><td>kafka-server3</td><td>172.25.254.133</td><td>broker, Kraft controller (or zookeeper)</td></tr></tbody></table>
<p>download and extract kafka</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-xvf</span><span class="token plain"> kafka_2.13-3.6.0.tgz </span><span class="token parameter variable" style="color:#36acaa">-C</span><span class="token plain"> /usr/local/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> /usr/local/kafka_2.13-3.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># create a log directory</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-pv</span><span class="token plain"> logs/kraft-combined-logs</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="kafka-cluster-setup-based-on-kraft">Kafka Cluster Setup Based on <code>Kraft</code><a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#kafka-cluster-setup-based-on-kraft" class="hash-link" aria-label="Direct link to kafka-cluster-setup-based-on-kraft" title="Direct link to kafka-cluster-setup-based-on-kraft">​</a></h4>
<p>Navigate to the Kafka directory and edit the Kraft server configuration file for each node:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /usr/local/kafka_2.13-3.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/kraft/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">server #1</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">server #2</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">server #3</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/kraft/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">process.roles</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">broker,controller</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">controller.quorum.voters</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">1@172.25.254.131:9093,2@172.25.254.132:9093,3@172.25.254.133:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Socket Server Settings #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.131:9092,CONTROLLER://172.25.254.131:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.131:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs/kraft-combined-logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/kraft/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">process.roles</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">broker,controller</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">controller.quorum.voters</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">1@172.25.254.131:9093,2@172.25.254.132:9093,3@172.25.254.133:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Socket Server Settings #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.132:9092,CONTROLLER://172.25.254.132:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.132:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs/kraft-combined-logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/kraft/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">process.roles</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">broker,controller</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">node.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">controller.quorum.voters</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">1@172.25.254.131:9093,2@172.25.254.132:9093,3@172.25.254.133:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Socket Server Settings #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.133:9092,CONTROLLER://172.25.254.133:9093</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.133:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs/kraft-combined-logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>generate cluster UUID and format storage</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># generate cluster UUID</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-storage.sh random-uuid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">A_D5kj5zTbi2EDTeXHDH3g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># format storage on each node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> ./bin/kafka-storage.sh </span><span class="token function" style="color:#d73a49">format</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> A_D5kj5zTbi2EDTeXHDH3g </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> ./config/kraft/server.properties</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Formatting /usr/local/kafka_2.13-3.6.0/kraft-logs/kraft-combined-logs with metadata.version </span><span class="token number" style="color:#36acaa">3.6</span><span class="token plain">-IV2.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>start the services</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> ./bin/kafka-server-start.sh </span><span class="token parameter variable" style="color:#36acaa">-daemon</span><span class="token plain"> ./config/kraft/server.properties</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> logs/server.log </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,231</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Awaiting socket connections on </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.network.DataPlaneAcceptor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the authorizer futures to be completed </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Finished waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the authorizer futures to be completed </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the SocketServer Acceptors to be started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Finished waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the SocketServer Acceptors to be started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Transition from STARTING to STARTED </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka version: </span><span class="token number" style="color:#36acaa">3.6</span><span class="token plain">.0 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka commitId: 60e845626d8a465a </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka startTimeMs: </span><span class="token number" style="color:#36acaa">1701395564243</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,247</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">KafkaRaftServer </span><span class="token assign-left variable" style="color:#36acaa">nodeId</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Kafka Server started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.KafkaRaftServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>check cluster and node status</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># check cluster status</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-metadata-quorum.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092,172.25.254.132:9092,172.25.254.133:9092 describe </span><span class="token parameter variable" style="color:#36acaa">--status</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ClusterId:              A_D5kj5zTbi2EDTeXHDH3g</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LeaderId:               </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">LeaderEpoch:            </span><span class="token number" style="color:#36acaa">81</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HighWatermark:          </span><span class="token number" style="color:#36acaa">24195</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MaxFollowerLag:         </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MaxFollowerLagTimeMs:   </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CurrentVoters:          </span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1,2</span><span class="token plain">,3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">CurrentObservers:       </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># check node status</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-metadata-quorum.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092,172.25.254.132:9092,172.25.254.133:9092 describe </span><span class="token parameter variable" style="color:#36acaa">--replication</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NodeId	LogEndOffset	Lag	LastFetchTimestamp	LastCaughtUpTimestamp	Status  	</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">1</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">22633</span><span class="token plain">       	</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  	</span><span class="token number" style="color:#36acaa">1701407094365</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">1701407094365</span><span class="token plain">        	Leader  	</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">2</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">22633</span><span class="token plain">       	</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  	</span><span class="token number" style="color:#36acaa">1701407093990</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">1701407093990</span><span class="token plain">        	Follower	</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token number" style="color:#36acaa">3</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">22633</span><span class="token plain">       	</span><span class="token number" style="color:#36acaa">0</span><span class="token plain">  	</span><span class="token number" style="color:#36acaa">1701407093989</span><span class="token plain">     	</span><span class="token number" style="color:#36acaa">1701407093989</span><span class="token plain">        	Follower	</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="kafka-cluster-setup-based-on-zookeeper">Kafka Cluster Setup Based on <code>Zookeeper</code><a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#kafka-cluster-setup-based-on-zookeeper" class="hash-link" aria-label="Direct link to kafka-cluster-setup-based-on-zookeeper" title="Direct link to kafka-cluster-setup-based-on-zookeeper">​</a></h4>
<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">server #1</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">server #2</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">server #3</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">broker.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.131:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.131:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Zookeeper #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">zookeeper.connect</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2181,172.25.254.132:2181,172.25.254.133:2181</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/zookeeper.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/zookeeper.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">dataDir</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/zookeeper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">tickTime</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">initLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">syncLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.1</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.2</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.132:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.3</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.133:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">broker.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.132:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.132:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Zookeeper #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">zookeeper.connect</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2181,172.25.254.132:2181,172.25.254.133:2181</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/zookeeper.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/zookeeper.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">dataDir</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/zookeeper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">tickTime</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">initLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">syncLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.1</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.2</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.132:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.3</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.133:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/server.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">############################# Server Basics #############################</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">broker.id</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.133:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">advertised.listeners</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">PLAINTEXT://172.25.254.133:9092</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Log Basics #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">log.dirs</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/logs</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">num.partitions</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Internal Topic Settings  #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">offsets.topic.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.replication.factor</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">transaction.state.log.min.isr</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">############################# Zookeeper #############################</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">zookeeper.connect</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2181,172.25.254.132:2181,172.25.254.133:2181</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/zookeeper.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">config/zookeeper.properties</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key attr-name" style="color:#00a4db">dataDir</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">/usr/local/kafka_2.13-3.6.0/zookeeper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">tickTime</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">2000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">initLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">syncLimit</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">5</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.1</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.131:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.2</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.132:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">server.3</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">172.25.254.133:2888:3888</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>
<p>set myid for each node:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> /usr/local/kafka_2.13-3.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mkdir</span><span class="token plain"> zookeeper</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># for kafka-server1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> zookeeper/myid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># for kafka-server2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> zookeeper/myid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># for kafka-server3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token operator" style="color:#393A34">|</span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">tee</span><span class="token plain"> zookeeper/myid</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>start the services</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Start Zookeeper</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">nohup</span><span class="token plain"> ./bin/zookeeper-server-start.sh config/zookeeper.properties </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token file-descriptor important">&amp;1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Start Kafka</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">nohup</span><span class="token plain"> ./bin/kafka-server-start.sh config/server.properties </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token file-descriptor important">&amp;1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> logs/server.log </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="topic-creation-and-message-testing">Topic Creation and Message Testing<a href="https://www.geuni.tech/en/kafka/kafka_introduce_install_cluster#topic-creation-and-message-testing" class="hash-link" aria-label="Direct link to Topic Creation and Message Testing" title="Direct link to Topic Creation and Message Testing">​</a></h4>
<p>Create a topic:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-topics.sh </span><span class="token parameter variable" style="color:#36acaa">--create</span><span class="token plain"> --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092 --replication-factor </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--partitions</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--topic</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Created topic test.</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>View topic details:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-topics.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092 </span><span class="token parameter variable" style="color:#36acaa">--describe</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--topic</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Topic: </span><span class="token builtin class-name">test</span><span class="token plain">	TopicId: Fdm-gBQ9TcuvuCKjm1caWg	PartitionCount: </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">	ReplicationFactor: </span><span class="token number" style="color:#36acaa">3</span><span class="token plain">	Configs: </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Topic: </span><span class="token builtin class-name">test</span><span class="token plain">	Partition: </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">	Leader: </span><span class="token number" style="color:#36acaa">0</span><span class="token plain">	Replicas: </span><span class="token number" style="color:#36acaa">0,1</span><span class="token plain">,2	Isr: </span><span class="token number" style="color:#36acaa">0,1</span><span class="token plain">,2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Topic: </span><span class="token builtin class-name">test</span><span class="token plain">	Partition: </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">	Leader: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">	Replicas: </span><span class="token number" style="color:#36acaa">2,0</span><span class="token plain">,1	Isr: </span><span class="token number" style="color:#36acaa">2,0</span><span class="token plain">,1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	Topic: </span><span class="token builtin class-name">test</span><span class="token plain">	Partition: </span><span class="token number" style="color:#36acaa">2</span><span class="token plain">	Leader: </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">	Replicas: </span><span class="token number" style="color:#36acaa">1,2</span><span class="token plain">,0	Isr: </span><span class="token number" style="color:#36acaa">1,2</span><span class="token plain">,0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Start a Producer on Node 1:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 172.25.254.131</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-console-producer.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092 </span><span class="token parameter variable" style="color:#36acaa">--topic</span><span class="token plain"> </span><span class="token builtin class-name">test</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Start Consumers on Node 2 and Node 3:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 172.25.254.132</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-console-consumer.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.132:9092 </span><span class="token parameter variable" style="color:#36acaa">--topic</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"> --from-beginning  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 172.25.254.133</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./bin/kafka-console-consumer.sh --bootstrap-server </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.133:9092 </span><span class="token parameter variable" style="color:#36acaa">--topic</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"> --from-beginning  </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>When messages are entered into the producer terminal, they will appear on both consumer terminals, confirming the cluster is functioning correctly.</p>
<p><img decoding="async" loading="lazy" alt="kafka_produce_consume" src="https://www.geuni.tech/en/assets/images/kafka_produce_consume-3cdf03f67f13cfb20686dabd495feec1.gif" width="2843" height="1599" class="img_ev3q"></p>]]></content:encoded>
            <category>Kafka</category>
        </item>
        <item>
            <title><![CDATA[Redis Sentinel, failover과정 정리]]></title>
            <link>https://www.geuni.tech/en/redis/redis_sentinel_failover_process</link>
            <guid>https://www.geuni.tech/en/redis/redis_sentinel_failover_process</guid>
            <pubDate>Thu, 24 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Redis Sentinel의 Failover 과정을 단계별로 분석합니다. Sentinel 기능, Leader 선출, Master 승격, 통신 방식 등 핵심 내용을 상세히 설명하여 Redis 고가용성 구성 및 장애 대응 전략 수립에 도움을 드립니다.]]></description>
            <content:encoded><![CDATA[<p>Redis Sentinel은 Redis HA솔루션이다.  Redis는 Redis Cluster라고 하는 Cluster제품이 따로 있으며 Sentinel은 Redis Cluster와 관련이 없다. Sentinel은 cluster가 필요없는 사용자들에게 간단한 failover기능을 제공하는 제품이다.</p>
<p>Sentinel은 기능을 알아보자.</p>
<ul>
<li>Monitoring : Sentinel은 failover 자동화를 목적으로 master/slave 상태를 지속적으로 모니터링한다.</li>
<li>Notification: redis instance down 혹은 failover 발생시 Pub/Sub 기능으로 client에 알리거나 shell script실행을 통한 notify기능을 할수있다.</li>
<li>Automatic failover: master가 장애발생시 failover process가 시작되며 sentinel은 slave중 적합한 대상을 찾아 master로 승격시키고 기타 slave들이 새 master를 바라보도록 재구성작업을 하게된다.</li>
<li>Configuration provider: Sentinel은 client에 service discovery역할을 해준다. client에 master,slave등의 구성정보를 제공하여  read/write 분리기능 등이 가능하도록 하게해준다. sentinel은 client에 구정정보를 제공할뿐 proxy서버가 아니다.</li>
</ul>
<p>Sentinel에 대하여 알아야할 기본지식</p>
<ul>
<li>
<p>안정적인 HA구성을 위하여 최소 3개의 sentinel instance가 필요함. 투표 효율성을 위하여 홀수 instance 추천(짝수case에서 50%투표율일때 재투표로 이어짐 )</p>
</li>
<li>
<p>각 instance를 상대적으로 독립적인 VM, 물리서법 혹은 가용영역(AZ)에 설치하여 장애영향을 가능한 줄일것</p>
</li>
<li>
<p>Sentinel + Redis구조에서 Redis는 비동기화방식으로 데이터 sync를 한다. 따라 failover 발생시 부분 데이터유실 기능성이 존재한다.</p>
</li>
<li>
<p>충분한 테스트 검증을 거치지 않은 HA구성은 안전하다고 말할수 없다. 기본적인 failover테스트는 해보자.</p>
</li>
</ul>
<p><strong>알아야할 <code>S_DOWN</code> &amp; <code>O_DOWN</code></strong></p>
<ul>
<li><code>S_DOWN</code>(Subjectively Down) - 주관적 다운, 로컬 sentinel(자신)기준에서 PING응답을 받지 못하는 경우</li>
<li><code>O_DOWN</code>(Objectively Down) - 객관적 다운, 설정한 quorum 이상의 sentinel에서 SDOWN 피드백을 받았을떄 다운상태가 SDOWN에서 -&gt; ODOWN으로 승격된다.</li>
</ul>
<p>ODOWN상태는 master에만 적용되는 상태이며 failover액션으로 이어진다. replica 다운시 sentinel이 취하는 액션이 없으며 따라 replica는 ODOWN상태가 없다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="failover과정">failover과정<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#failover%EA%B3%BC%EC%A0%95" class="hash-link" aria-label="Direct link to failover과정" title="Direct link to failover과정">​</a></h3>
<p>Sentinel은 주기적으로 master, slave 및 기타 sentinel들에 대하여 health체크를 한다.</p>
<p>이때 master에 대하여 ODOWN판정(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L4611" target="_blank" rel="noopener noreferrer">src@sentinelCheckSubjectivelyDown</a>)을 하게되면 failover process가 시작된다.</p>
<p>우선 failover작업을 수행할 sentinel leader를 선거하게 되며 선거된 sentinel leader는 살아있는 slave중 master를 선출하게된다.</p>
<p>failover과정에 아래와 같은 failover상태변화를 거치된다. (<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c" target="_blank" rel="noopener noreferrer">sentinel.c</a>참고)</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_NONE              |               </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> |  - No failover in progress                | 			</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                      ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_WAIT_START        |		 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - Wait for failover_start_time            | 			 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_SELECT_SLAVE      | 	 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - Select slave to promote                 |				 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOON | </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - Slave -&gt; Master                         |						 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_WAIT_PROMOTION    |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - Wait slave to change role               | 				 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_RECONF_SLAVES     |     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - SLAVEOF newmaster                       |						 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                        ↓</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | SENTINEL_FAILOVER_STATE_UPDATE_CONFIG     |  	 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | - Monitor promoted slave.                 |				 </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> +-------------------------------------------+</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel-leader-선거과정">Sentinel leader 선거과정<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#sentinel-leader-%EC%84%A0%EA%B1%B0%EA%B3%BC%EC%A0%95" class="hash-link" aria-label="Direct link to Sentinel leader 선거과정" title="Direct link to Sentinel leader 선거과정">​</a></h4>
<ol>
<li>Sentinel이 master에 대하여 O_DOWN판정후 failover process 시작.<!-- -->
<ul>
<li>failover_state를 <code>SENTINEL_FAILOVER_STATE_NONE</code>에서 -&gt; <code>SENTINEL_FAILOVER_STATE_WAIT_START</code>로 변경(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L4948" target="_blank" rel="noopener noreferrer">src@sentinelStartFailover</a>)</li>
</ul>
</li>
<li>current-epoch +1후 다른 sentinel에 *<code>SENTINEL IS-MASTER-DOWN-BY-ADDR &lt;ip&gt; &lt;port&gt; &lt;current-epoch&gt; &lt;runid&gt;</code>*명령으로 자신의 epoch, runid 보내 투표요청을 한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L4691" target="_blank" rel="noopener noreferrer">src@sentinelAskMasterStateToOtherSentinels</a>)</li>
<li>투표(is-master-down-by-addr)요청을 받은 sentinel은 current-epoch과 요청받은 req_epoch을 비교한다.req_epoch이 current-epoch값보다 크면 master구조체의 leader,leader_epoch을 각각 요청받은 req_runid, req_epoch으로 업데이트 하고 받은 req_epoch을 응답해주며 Follower역할로 전환된다. 값이 같으면 이미 다른 Candidate에게 투표를 했다는 의미므로 이미 표를 준 sentinel의 runid를 리턴한다. (<em><a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L4749" target="_blank" rel="noopener noreferrer">src@sentinelVoteLeader</a></em>)</li>
<li>선거기간내 과반수이상이 투표를 했거나 최소 quorum만큼의 득표를 받으면 leader로 선거되며 failover_state가<code>SENTINEL_FAILOVER_STATE_SELECT_SLAVE</code>로 변경된다.<em><a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5108" target="_blank" rel="noopener noreferrer">src@sentinelFailoverWaitStart</a></em>
<ul>
<li>최소 <code>50% + 1</code>의 득표를 얻어야 leader가 될수 있으며 이 또한 투표효울성을 위하여  <strong>홀수의 instance를 띄워야 하는 이유</strong>다.</li>
</ul>
</li>
<li>선거기간내 선출된 leader가 없으면 (failover_timeout * 2)시간후 재선거가 시작된다.</li>
<li>선거된 leader는 master선출작업을 시작한다.</li>
</ol>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="master-선출">master 선출<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#master-%EC%84%A0%EC%B6%9C" class="hash-link" aria-label="Direct link to master 선출" title="Direct link to master 선출">​</a></h4>
<p>master 선출과정이 시작되면 master후보를 선정후 우선순위 확인을 통해 master를 선출하게된다.</p>
<p>아래와 같은 조건으로 master로 만들기에 적합한 slave를 선택한다. (<em><a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5062" target="_blank" rel="noopener noreferrer">src@sentinelSelectSlave</a></em>)</p>
<ol>
<li>S_DOWN, O_DOWN, DISCONNECTED 상태의 instance제외</li>
<li>5초내(sentinel_ping_period*5) ping응답을 받지 못한 instance제외</li>
<li>slave_priority(우선순위)가 0인 instance제외 (priority=0인 instance는 폐기로 인식)</li>
<li>info_validity_time이 3초이전 혹은 5초이전(master가 S_DOWN상태일때)인 instance제외</li>
<li>master_link_down_time이  <em>(now - master-&gt;s_down_since_time) + (master-&gt;down_after_period * 10)</em> 보다 큰 instance제외</li>
</ol>
<p>master후보선정이 끝나면 아래와 같은 우선순위로 master를 선택하게된다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5034" target="_blank" rel="noopener noreferrer">src@compareSlavesForPromotion</a> )</p>
<ol>
<li>slave_priority값이 작으면 우선</li>
<li>replication offset(slave_repl_offset)가 크면 우선</li>
<li>runid가 작으면우선</li>
</ol>
<p>master대체하기에 적합한 slave를 찾은후 failover_state는 SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE로 변경된다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5141" target="_blank" rel="noopener noreferrer">src@sentinelFailoverSelectSlave</a>)</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="slave-to-master작업">slave to master작업<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#slave-to-master%EC%9E%91%EC%97%85" class="hash-link" aria-label="Direct link to slave to master작업" title="Direct link to slave to master작업">​</a></h4>
<p>master를 대체할 slave를 찾은후 실질적인 slave를 master로 승격시키는 작업이 시작된다.</p>
<ol>
<li>
<p><code>SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE</code>상태</p>
<p>failover_state가 SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE인 상태에 sentinel은 선택받은 slave에 <code>SLAVEOF NO ONE</code> 명령을 실행하여 master로 role변경을 요청후 failover_state를 SENTINEL_FAILOVER_STATE_WAIT_PROMOTION으로 변경한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5160" target="_blank" rel="noopener noreferrer">src@sentinelFailoverSendSlaveOfNoOne</a>)</p>
</li>
<li>
<p><code>SENTINEL_FAILOVER_STATE_WAIT_PROMOTION</code>상태</p>
<p>현재 상태에서 <code>SLAVEOF NO ONE</code> 명령을 받은 slave에 <code>INFO</code>명령을 날려 role을 확인한다. failover_timeout시간내 role이 slave에서 master로 변경된것을 확인하면 failover_state를 SENTINEL_FAILOVER_STATE_RECONF_SLAVES로 변경한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L1665" target="_blank" rel="noopener noreferrer">src@sentinelGetCurrentMasterAddress</a>)</p>
</li>
<li>
<p><code>SENTINEL_FAILOVER_STATE_RECONF_SLAVES로</code>상태</p>
<p>다른 slave들에게 SLAVEOF &lt;new master&gt; 명령을 보내고 작업이 완료되면 failover_state를 <code>SENTINEL_FAILOVER_STATE_UPDATE_CONFIG</code>로 변경한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L5197" target="_blank" rel="noopener noreferrer">src@sentinelFailoverDetectEnd</a>)</p>
</li>
<li>
<p><code>SENTINEL_FAILOVER_STATE_UPDATE_CONFIG</code>상태</p>
<p>메모리중의 master정보를 새master로 리셋후 redis엔진의 redis.conf파일을 rewriting한다.<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L1595" target="_blank" rel="noopener noreferrer">src@sentinelResetMasterAndChangeAddress</a></p>
<p>failover_state는 다시 정상상태인 <code>SENTINEL_FAILOVER_STATE_NONE</code> 돌아가며 failover process는 종료된다.</p>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel의-통신방식">Sentinel의 통신방식<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#sentinel%EC%9D%98-%ED%86%B5%EC%8B%A0%EB%B0%A9%EC%8B%9D" class="hash-link" aria-label="Direct link to Sentinel의 통신방식" title="Direct link to Sentinel의 통신방식">​</a></h3>
<p>모든 Sentinel은 아래와 같이 master, slave, 다른 sentinel들과 연결을 맺고있다.</p>
<ul>
<li>모니터링중인 master</li>
<li>모든 관련 slave들</li>
<li>모니터링 대상 master에 연결된 기타 sentinel들</li>
</ul>
<p><code>sentinel.conf</code>에는 master정보만 설정돼있다. 그렇다면 Sentinel은 slave와 다른 sentinel과 어떻게 통신하나 ?</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel은-slave와-어떻게-통신하나">Sentinel은 Slave와 어떻게 통신하나?<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#sentinel%EC%9D%80-slave%EC%99%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%86%B5%EC%8B%A0%ED%95%98%EB%82%98" class="hash-link" aria-label="Direct link to Sentinel은 Slave와 어떻�게 통신하나?" title="Direct link to Sentinel은 Slave와 어떻게 통신하나?">​</a></h4>
<p>Sentinel은 master에 <code>INFO</code>명령을 날려 slave정보를 조회한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L2511" target="_blank" rel="noopener noreferrer">src@sentinelRefreshInstanceInfo</a>)</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel간에는-어떻게-통신하나">Sentinel간에는 어떻게 통신하나?<a href="https://www.geuni.tech/en/redis/redis_sentinel_failover_process#sentinel%EA%B0%84%EC%97%90%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%86%B5%EC%8B%A0%ED%95%98%EB%82%98" class="hash-link" aria-label="Direct link to Sentinel간에는 어떻게 통신하나?" title="Direct link to Sentinel간에는 어떻게 통신하나?">​</a></h4>
<p>Sentinel간의 통신은 주로 Redis의 Pub/Sub기능을 통하여 이루어진다. master의 <code>__sentinel__:hello</code> sentinel전용채널을 통하여 자신의 ip, port등 정보를 배포한다.(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L3017" target="_blank" rel="noopener noreferrer">src@sentinelSendHello</a>)</p>
<ul>
<li>메시지 포멧: sentinel_ip,sentinel_port,sentinel_runid,current_epoch, master_name,master_ip,master_port,master_config_epoch</li>
</ul>
<p>sentinel은 구독중인 <code>__sentinel__:hello</code>채널에서 메시지를 받은후 runid확인을 한다. runid가 자신의 runid와 같을때 자신의 정보라 판단하여 메시지는 폐기되며 runid가 다르면 타 sentinel정보를 dict에 기록을 한다. (<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L2976" target="_blank" rel="noopener noreferrer">src@sentinelReceiveHelloMessages</a>)</p>]]></content:encoded>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[Resolving Elasticsearch Unassigned Shard Issues: X of Y shards failed]]></title>
            <link>https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana</link>
            <guid>https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana</guid>
            <pubDate>Mon, 10 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[When opening Kibana, you might sometimes see the error message “X of Y shards failed” which usually indicates that some indices have unassigned shards. In such cases, the Elasticsearch (ES) cluster status is typically Yellow or Red.]]></description>
            <content:encoded><![CDATA[<p>When opening Kibana, you might sometimes see the error message “X of Y shards failed” which usually indicates that some indices have unassigned shards. In such cases, the Elasticsearch (ES) cluster status is typically Yellow or Red.</p>
<p>Let’s first understand the four shard states in ES:</p>
<ul>
<li>
<p><em><strong>INITIALIZING</strong></em> - The shard is in the initialization state and unavailable. This occurs briefly when creating an index or starting a node.</p>
</li>
<li>
<p><em><strong>RELOCATING</strong></em> - Shards are being moved due to node addition or removal, a transient state.</p>
</li>
<li>
<p><em><strong>STARTED</strong></em> - The shard is active and available to handle requests.</p>
</li>
<li>
<p><em><strong>UNASSIGNED</strong></em> - The shard has failed to be allocated.</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="what-causes-shard-allocation-failures">What Causes Shard Allocation Failures?<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#what-causes-shard-allocation-failures" class="hash-link" aria-label="Direct link to What Causes Shard Allocation Failures?" title="Direct link to What Causes Shard Allocation Failures?">​</a></h3>
<p>Shard allocation failures can occur due to the following reasons:</p>
<ul>
<li>Excessive replica shard settings with insufficient nodes for allocation.</li>
<li>Delayed mechanisms triggered when a node goes offline.</li>
<li>Data loss in shards.</li>
<li>Insufficient disk space on nodes.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="check-cluster-status-and-diagnose-allocation-failures">Check Cluster Status and Diagnose Allocation Failures<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#check-cluster-status-and-diagnose-allocation-failures" class="hash-link" aria-label="Direct link to Check Cluster Status and Diagnose Allocation Failures" title="Direct link to Check Cluster Status and Diagnose Allocation Failures">​</a></h3>
<p>First, use the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.8/cluster-health.html" target="_blank" rel="noopener noreferrer">Cluster health API</a> to inspect the cluster status and the overall shard allocation:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">GET /_cluster/health\?pretty</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Example response:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"cluster_name"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"my-application"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"status"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"yellow"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"timed_out"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_nodes"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_data_nodes"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_primary_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">565</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">565</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"relocating_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"initializing_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"unassigned_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"delayed_unassigned_shards"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_pending_tasks"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"number_of_in_flight_fetch"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"task_max_waiting_in_queue_millis"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"active_shards_percent_as_number"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">90.4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Pay attention to the following fields:</p>
<ul>
<li>status: Indicates the cluster status:<!-- -->
<ul>
<li>green: All shards are allocated.</li>
<li>yellow: All primary shards are allocated, but some replica shards are not. A node failure could make part of the data unavailable.</li>
<li>red: Some primary shards are unallocated, making some data unavailable.</li>
</ul>
</li>
<li>unassigned_shards: Number of unallocated shards.</li>
<li>active_shards_percent_as_number: Percentage of allocated shards.</li>
<li>delayed_unassigned_shards: Number of shards waiting for allocation after a node leaves</li>
</ul>
<p>Next, use the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html" target="_blank" rel="noopener noreferrer">cat shards API</a> to view the allocation status of all shards:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">GET _cat/shards?h=index,shard,prirep,state,unassigned.reason</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Or, in a shell, filter for unassigned shards:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl -X GET localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason| grep UNASSIGNED</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>To investigate the cause of unassigned shards:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">GET /_cluster/allocation/explain?pretty</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Example output:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "index" : "my-index",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "shard" : 2,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "primary" : false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "current_state" : "unassigned",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "unassigned_info" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "reason" : "CLUSTER_RECOVERED",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "at" : "2023-02-06T06:34:22.345Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "last_allocation_status" : "no_attempt"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "can_allocate" : "no",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "node_allocation_decisions" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_id" : "dntxO1EFQVSzk7A4n45OLQ",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_name" : "node-1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "transport_address" : "52.208.205.70:9300",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_attributes" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.machine_memory" : "33737449472",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "xpack.installed" : "true",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.max_open_jobs" : "20",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.enabled" : "true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_decision" : "no",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "deciders" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "decider" : "same_shard",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "decision" : "NO",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "explanation" : "the shard cannot be allocated to the same node on which a copy of the shard already exists [[my-index][2], node[dntxO1EFQVSzk7A4n45OLQ], [P], s[STARTED], a[id=ag-Komw1QJu9EKYkrsrdmw]]"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="resolve-common-causes-of-unassigned-shards">Resolve Common Causes of Unassigned Shards<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#resolve-common-causes-of-unassigned-shards" class="hash-link" aria-label="Direct link to Resolve Common Causes of Unassigned Shards" title="Direct link to Resolve Common Causes of Unassigned Shards">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="excessive-replica-shards-with-insufficient-nodes">Excessive Replica Shards with Insufficient Nodes<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#excessive-replica-shards-with-insufficient-nodes" class="hash-link" aria-label="Direct link to Excessive Replica Shards with Insufficient Nodes" title="Direct link to Excessive Replica Shards with Insufficient Nodes">​</a></h4>
<p>Replica shards cannot be allocated on the same node as their primary shard. If the number of replicas exceeds the number of nodes, unallocated replica shards may appear. For example, setting number_of_replicas to 1 on a single-node cluster will cause this issue.</p>
<p><strong>Solution:</strong> Increase the number of nodes or reduce the number of replicas:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PUT /my-index-000001/_settings</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "index" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "number_of_replicas" : 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="delayed-allocation-mechanism">Delayed Allocation Mechanism<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#delayed-allocation-mechanism" class="hash-link" aria-label="Direct link to Delayed Allocation Mechanism" title="Direct link to Delayed Allocation Mechanism">​</a></h4>
<p>When a node goes offline, Elasticsearch delays shard reallocation to avoid excessive rebalancing. This delay is controlled by the <em><strong>index.unassigned.node_left.delayed_timeout</strong></em> setting (default: 1 minute).</p>
<p><strong>Solution:</strong> You can manually modify the delay period:</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PUT _all/_settings</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "settings": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "index.unassigned.node_left.delayed_timeout": "0"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="shard-data-loss">Shard Data Loss<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#shard-data-loss" class="hash-link" aria-label="Direct link to Shard Data Loss" title="Direct link to Shard Data Loss">​</a></h4>
<p>If a primary shard is unallocated and no replicas exist, the shard data is considered lost.</p>
<p><strong>Solution:</strong> Forcefully allocate an empty primary shard (data loss is inevitable):</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">POST /_cluster/reroute?pretty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "commands" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "allocate_empty_primary" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "index" : "&lt;INDEX_NAME&gt;",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "shard" : 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "node" : "&lt;NODE_NAME&gt;",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "accept_data_loss" : "true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="insufficient-disk-space">Insufficient Disk Space<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#insufficient-disk-space" class="hash-link" aria-label="Direct link to Insufficient Disk Space" title="Direct link to Insufficient Disk Space">​</a></h4>
<p>Nodes running out of disk space may be marked as "low disk watermark" and excluded from shard allocation.</p>
<p><strong>Solution:</strong> Free up disk space, add more nodes, or increase the watermark threshold:</p>
<div class="language-console codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-console codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PUT _cluster/settings</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "persistent": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "cluster.routing.allocation.disk.watermark.low": "90%"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://www.geuni.tech/en/elasticsearch/elasticsearch-shards-failed-error-in-kibana#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h3>
<p>Unassigned shards reflect suboptimal cluster health, typically denoted by a Yellow or Red cluster status. By diagnosing the cause and taking appropriate corrective actions, you can resolve issues related to shard allocation and maintain a healthy Elasticsearch cluster.</p>]]></content:encoded>
            <category>Elasticsearch</category>
            <category>Kibana</category>
        </item>
        <item>
            <title><![CDATA[Git error해결방법: Your local changes to the following files would be overwritten by merge]]></title>
            <link>https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge</link>
            <guid>https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge</guid>
            <pubDate>Thu, 28 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Git 사용 중 "Your local changes to the following files would be overwritten by merge" 오류 발생 시 해결 방법을 commit과 stash 두 가지 방법으로 자세히 설명합니다. 충돌 상황 재현 및 해결 과정까지..]]></description>
            <content:encoded><![CDATA[<p>로컬에서 수정한 소스와 원격지 소스와 충돌이 있을때 해당오류가 발생한다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">error: Your local changes to the following files would be overwritten by merge:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">	README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Please commit your changes or stash them before you merge.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Aborting</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>우리가 <code>pull</code>명령으로 원격지 소스를 가져올때 git는 우리의 로컬repository와 working directory를 업데이트 하게 된다.  우리가 로컬에서 소스 수정을 했는데 원격지 창고에서도 파일변경이 발생햇다. 이때 pull할려면 로컬소스 버전을 미리 저장을 해야된다.
이는 git가 로컬소스 보호를 목적으로 만든 기능이다. 열심히 코딩한 소스가 pull명령 하나로 날라간다면 누구든 억울할것이다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="오류-재현">오류 재현：<a href="https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%EC%98%A4%EB%A5%98-%EC%9E%AC%ED%98%84" class="hash-link" aria-label="Direct link to 오류 재현：" title="Direct link to 오류 재현：">​</a></h3>
<p>나의 원격지 창고에 README.md파일이 하나 있다고 하자. 내용을 아래와 같다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">init</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>clone</code>명령으로 로컬에 소스를 땡긴후 원격지 소스를 바로 수정한다(다른 누군가가 push했다고 가장).  현재 원격지 소스내용은 아래와 같다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;remote&gt;에서 추가한 내용</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>그리고 로컬파일에 아래와 같이 한줄 추가하자.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;local&gt;에서 추가한 내용</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>이어서 <code>pull</code>해보자</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git pull origin main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>아래와 같은 오류가 뜨게 된다</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">➜  test git:(main) git pull origin main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">remote: Enumerating objects: 8, done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">remote: Counting objects: 100% (8/8), done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">remote: Compressing objects: 100% (2/2), done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Unpacking objects: 100% (6/6), 1.28 KiB | 164.00 KiB/s, done.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">From github.com:your_repo/test</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * branch            main       -&gt; FETCH_HEAD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">   8859462..0970015  main       -&gt; origin/main</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Updating 8859462..0970015</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">error: Your local changes to the following files would be overwritten by merge:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Please commit your changes or stash them before you merge.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Aborting</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="해결방법">해결방법：<a href="https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95" class="hash-link" aria-label="Direct link to 해결방법：" title="Direct link to 해결방법：">​</a></h3>
<p>오류메시지에서 이미 해결방법을 제시했다.  <code>commit</code> 혹은 <code>stash</code>를 명령을 이용할수 있다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="해결방법1commit">해결방법1，<code>commit</code><a href="https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%951commit" class="hash-link" aria-label="Direct link to 해결방법1commit" title="Direct link to 해결방법1commit">​</a></h4>
<p>소스가 commit해도 될 수준이라면 commit &gt; pull &gt; 충돌해결 &gt; commit &amp; push 순서로 해결하면 된다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"update README.md"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git pull origin main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>현재 README.md 내용은 아래 같다</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">init</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;local&gt;에서 추가한 내용</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=======</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">init  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;remote&gt;에서 추가한 내용</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt;&gt;&gt;&gt;&gt; 0fa467e983cdfa2bb31450f2979570954ac9346a</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>현재단계에서 충돌해결후 원격지에 push하면 된다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">add</span><span class="token plain"> README.md</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> commit </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Resolved conflict"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> origin main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="해결방법2stash">해결방법2，<code>stash</code><a href="https://www.geuni.tech/en/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%952stash" class="hash-link" aria-label="Direct link to 해결방법2stash" title="Direct link to 해결방법2stash">​</a></h4>
<p>stash명령에 대한 git홈페이지 소개는 아래와 같다.</p>
<blockquote>
<p>Use <code>git stash</code> when you want to record the current state of the working directory and the index, but want to go back to a clean working directory</p>
</blockquote>
<p>깨끗한 working directory를 원하지만 로컬 변경내역을 저장하고 싶을때 해당 명령을 쓰라는 얘기다. 주로 소스가 commit할 준비가 안된 상황에서 branch변경 혹은 현재와 같이 충돌난 소스를 땡겨야 할때 쓰게된다.</p>
<p>위와 같은 case로  원격지 창고와 로컬에서 같은 파일내용을 편집한 상황이다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">init  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;local&gt;에서 추가한 내용</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><code>git stash</code>명령을 실행하면 로컬변경이 숨겨진것을 확인할수 있다. 이때 <code>git status</code>명령으로 깨끗한 working directory를 확인할수 있으며 당연히 pull가능하다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git pull origin main</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>원격지 소스는 이미 땡겨왓다. 이어 <code>git stash pop</code>명령을 실행하면 파일내용이 아래같이 변한것을 확인할수 있다.</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;&lt;&lt;&lt;&lt;&lt;&lt; Updated upstream</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;remote&gt;에서 추가한 내용</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">=======</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;local&gt;에서 추가한 내용</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&gt;&gt;&gt;&gt;&gt;&gt;&gt; Stashed changes</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>이제 충돌 해결후 commit해주자.(충돌해결건은 따로 commit을 하나 따주는게 좋다)</p>]]></content:encoded>
            <category>Git</category>
        </item>
        <item>
            <title><![CDATA[MySQL오류 - SELECT list is not in GROUP BY clause and contains nonaggregated column]]></title>
            <link>https://www.geuni.tech/en/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column</link>
            <guid>https://www.geuni.tech/en/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column</guid>
            <pubDate>Sat, 16 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[MySQL 5.7 이상에서 발생하는 "SELECT list is not in GROUP BY clause and contains nonaggregated column" 오류 해결 방법을 소개합니다. ONLY_FULL_GROUP_BY 모드 비활성화, my.cnf 설정, runtime 변경 등 다양한 해결책과 함께 SQL 표준 준수 및 문제 발생 시 대처법을 안내합니다.]]></description>
            <content:encoded><![CDATA[<p>오류 메시지：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[42000][1055] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>MySQL 5.7.5 및 그 이상 버전부터 디폴트로 <a href="https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by" target="_blank" rel="noopener noreferrer"><code>ONLY_FULL_GROUP_BY</code></a>옵션이 enable된 상태이다.</p>
<p>GROUP BY쿼리에서 SELECT，ORDER BY,HAVING절에 nonaggregated 컬럼을 참조할때 SQL-92표준에 위배되며 따라 <code>ONLY_FULL_GROUP_BY</code>모드에서 해당오류가 발생한다.(예외case <a href="https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html" target="_blank" rel="noopener noreferrer">참고</a>)</p>
<p>아래는 MySQL 5.7의 sql_mode 기본값이다.<code>ONLY_FULL_GROUP_BY</code> mode를 확인할수 있다.</p>
<p><img decoding="async" loading="lazy" alt="mysql_sql_mode" src="https://www.geuni.tech/en/assets/images/mysql_sql_mode-3807d2c384a2877dc3a7d0be50ba27b0.png" width="2012" height="220" class="img_ev3q"></p>
<p>단지 현재 작성중인 쿼리가 발생한 오류라면 재확인하여 다시 쓰면된다.</p>
<p>DB엔진 레벨에서 해당 오류를 해결할기를 원하면 sql_mode중 <code>ONLY_FULL_GROUP_BY</code>모드를 disable하면 된다.(이미 생산환경에서 운영중일때 해당모드를 enable할떄는 신중할것, 프로젝트 초기부터 해당옵션을 enable시켜 표준SQL을 작성할수있도록 제약을 주는게 좋음)</p>
<p><code>my.cnf</code>파일에</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vi</span><span class="token plain"> /usr/local/etc/my.cnf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># config파일이 어디 있는지 모를때 아래와 같이 조회가능.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">➜  ~ </span><span class="token function" style="color:#d73a49">which</span><span class="token plain"> mysqld</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/usr/local/opt/mysql@5.7/bin/mysqld</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">➜  ~ /usr/local/opt/mysql@5.7/bin/mysqld </span><span class="token parameter variable" style="color:#36acaa">--verbose</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--help</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-A</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Default options"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Default options are </span><span class="token builtin class-name">read</span><span class="token plain"> from the following files </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> the given order:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>아래와 같이 sql_mode옵션을 추가한다.(기존값에서 <code>ONLY_FULL_GROUP_BY</code>만 제거)</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">mysqld</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">sql_mode</span><span class="token punctuation" style="color:#393A34">=</span><span class="token value attr-value" style="color:#e3116c">STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>재구동후 적용됨.</p>
<p>runtime모드에서도 해당옵션 변경이 가능하다.(재구동 필요없음)</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">## global레벨</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SET GLOBAL sql_mode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># session레벨</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SET </span><span class="token environment constant" style="color:#36acaa">SESSION</span><span class="token plain"> sql_mode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>작업완료후 적용여부 확인:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> @</span><span class="token variable" style="color:#36acaa">@GLOBAL.sql_mode</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> @</span><span class="token variable" style="color:#36acaa">@SESSION.sql_mode</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>MySQL</category>
        </item>
        <item>
            <title><![CDATA[Linux에 OpenResty 소스 빌드하여 설치하기]]></title>
            <link>https://www.geuni.tech/en/nginx/linux_install_openresty_from_source</link>
            <guid>https://www.geuni.tech/en/nginx/linux_install_openresty_from_source</guid>
            <pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linux에서 OpenResty 및 Nginx를 소스 빌드로 설치하는 방법. 필수 패키지, 빌드 과정, systemd 설정까지 LuaJIT 활용을 위한 OpenResty 설치 가이드.]]></description>
            <content:encoded><![CDATA[<p>아래 설치 방법은 Nginx 설치 시에도 동일하게 적용할 수 있습니다. 단, <code>./configure</code> 단계에서 <code>--with-luajit</code> 옵션만 제외하면 됩니다. 일반적으로 Nginx가 아닌 OpenResty를 선택하는 이유는 LuaJIT을 사용하기 위해서입니다.</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="필수패키지-사전설치">필수패키지 사전설치<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#%ED%95%84%EC%88%98%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%A0%84%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Direct link to 필수패키지 사전설치" title="Direct link to 필수패키지 사전설치">​</a></h5>
<p>OpenResty는 Nginx를 기반으로 만들어져 있어, 설치 전 Nginx가 필요로 하는 패키지를 사전에 설치해야 합니다.</p>
<ul>
<li><a href="http://pcre.org/" target="_blank" rel="noopener noreferrer">PCRE</a> - 정규표현식 library，Nginx Core 및 Rewrite모듈에서 사용.</li>
<li><a href="http://www.zlib.net/" target="_blank" rel="noopener noreferrer">zlib</a> - 데이터 압축 library，<a href="https://nginx.org/en/docs/http/ngx_http_gzip_module.html" target="_blank" rel="noopener noreferrer">Gzip</a> 모듈에서 사용.</li>
<li><a href="https://www.openssl.org/" target="_blank" rel="noopener noreferrer">OpenSSL</a> - SSL기능지원</li>
<li><a href="https://gcc.gnu.org/" target="_blank" rel="noopener noreferrer">GCC</a> - GNU 프로젝트의 오픈 소스 컴파일러 컬렉션</li>
</ul>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="centos-rhelrocky-and-fedora">CentOS, RHEL,Rocky, and Fedora<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#centos-rhelrocky-and-fedora" class="hash-link" aria-label="Direct link to CentOS, RHEL,Rocky, and Fedora" title="Direct link to CentOS, RHEL,Rocky, and Fedora">​</a></h6>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> yum </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> gcc </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> pcre pcre-devel zlib zlib-devel openssl openssl-devel</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="debian기반의-linux">Debian기반의 Linux<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#debian%EA%B8%B0%EB%B0%98%EC%9D%98-linux" class="hash-link" aria-label="Direct link to Debian기반의 Linux" title="Direct link to Debian기반의 Linux">​</a></h6>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">apt-get</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> openssl-devel liblz-dev libpcre3</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="소스-빌드-및-설치">소스 빌드 및 설치<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#%EC%86%8C%EC%8A%A4-%EB%B9%8C%EB%93%9C-%EB%B0%8F-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Direct link to 소스 빌드 및 설치" title="Direct link to 소스 빌드 및 설치">​</a></h5>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="소스-다운로드">소스 다운로드<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#%EC%86%8C%EC%8A%A4-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C" class="hash-link" aria-label="Direct link to 소스 다운로드" title="Direct link to 소스 다운로드">​</a></h6>
<p>최신버전은 공식홈페이지에서 확인：<a href="https://openresty.org/en/download.html" target="_blank" rel="noopener noreferrer">https://openresty.org/en/download.html</a></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># openresty 소스 다운로드하여 압축 풀어줌</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://openresty.org/download/openresty-1.19.9.1.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-zxvf</span><span class="token plain"> openresty-1.19.9.1.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 필요한 모듈 다운로드 (필요한 제3방 모듈 없으면 skip)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">wget</span><span class="token plain"> https://hg.nginx.org/njs/archive/9578cc729205.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tar</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-zxvf</span><span class="token plain"> 9578cc729205.tar.gz</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> njs-9578cc729205/ njs </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mv</span><span class="token plain"> njs openresty-1.19.9.1/bundle/</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="openresty및-제3방모듈-빌드">OpenResty및 제3방모듈 빌드<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#openresty%EB%B0%8F-%EC%A0%9C3%EB%B0%A9%EB%AA%A8%EB%93%88-%EB%B9%8C%EB%93%9C" class="hash-link" aria-label="Direct link to OpenResty및 제3방모듈 빌드" title="Direct link to OpenResty및 제3방모듈 빌드">​</a></h6>
<p>이 단계에서는 표준 Nginx <code>./configure</code> 옵션을 모두 사용할 수 있음. <code>--add-module=PATH</code> 혹은 <code>--add-dynamic-module=PATH</code> 옵션으로 제3방모듈 설치가능.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Makefile생성</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./configure </span><span class="token parameter variable" style="color:#36acaa">--prefix</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/app/openresty </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--with-luajit </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--with-http_ssl_module </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--with-http_auth_request_module </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--add-dynamic-module</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">./bundle/njs/nginx </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">--modules-path</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/app/openresty/nginx/modules</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 소스 빌드 및 설치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">install</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="systemd-유닛-파일-생성">systemd 유닛 파일 생성<a href="https://www.geuni.tech/en/nginx/linux_install_openresty_from_source#systemd-%EC%9C%A0%EB%8B%9B-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to systemd 유닛 파일 생성" title="Direct link to systemd 유닛 파일 생성">​</a></h6>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /lib/systemd/system/nginx.service</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-conf codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-conf codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Unit]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Description=The NGINX HTTP and reverse proxy server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">After=syslog.target network-online.target remote-fs.target nss-lookup.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Wants=network-online.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Service]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Type=forking</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PIDFile=/app/openresty/nginx/logs/nginx.pid</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStartPre=/app/openresty/nginx/sbin/nginx -t</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStart=/app/openresty/nginx/sbin/nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecReload=/app/openresty/nginx/sbin/nginx -s reload</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ExecStop=/bin/kill -s QUIT $MAINPID</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">PrivateTmp=true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Install]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WantedBy=multi-user.target</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 서비스 시작 및 활성화 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl </span><span class="token parameter variable" style="color:#36acaa">--now</span><span class="token plain"> </span><span class="token builtin class-name">enable</span><span class="token plain"> nginx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 서비스 상태 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">systemctl status nginx</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>Nginx</category>
            <category>OpenResty</category>
        </item>
        <item>
            <title><![CDATA[Ruby gem，bundler 미러/소스 변경]]></title>
            <link>https://www.geuni.tech/en/ruby/ruby_gems_bundler_mirrors</link>
            <guid>https://www.geuni.tech/en/ruby/ruby_gems_bundler_mirrors</guid>
            <pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[gem]]></description>
            <content:encoded><![CDATA[<h5 class="anchor anchorWithStickyNavbar_LWe7" id="gem">gem<a href="https://www.geuni.tech/en/ruby/ruby_gems_bundler_mirrors#gem" class="hash-link" aria-label="Direct link to gem" title="Direct link to gem">​</a></h5>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 새로운 소스 추가 및 기본 소스 제거</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gem sources </span><span class="token parameter variable" style="color:#36acaa">--add</span><span class="token plain"> https://mirrors.tuna.tsinghua.edu.cn/rubygems/ </span><span class="token parameter variable" style="color:#36acaa">--remove</span><span class="token plain"> https://rubygems.org/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 등록된 소스 목록 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gem sources </span><span class="token parameter variable" style="color:#36acaa">-l</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="bundle">bundle<a href="https://www.geuni.tech/en/ruby/ruby_gems_bundler_mirrors#bundle" class="hash-link" aria-label="Direct link to bundle" title="Direct link to bundle">​</a></h5>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 전역 설정</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bundle config </span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--global</span><span class="token plain"> mirror.https://rubygems.org https://mirrors.tuna.tsinghua.edu.cn/rubygems</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 현재 프로젝트에서만 적용</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bundle config </span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--local</span><span class="token plain"> mirror.https://rubygems.org https://mirrors.tuna.tsinghua.edu.cn/rubygems</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 동일하게 현재 프로젝트에서만 적용 (이전 방식)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">bundle config mirror.https://rubygems.org https://mirrors.tuna.tsinghua.edu.cn/rubygems</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>관련문서：<a href="https://bundler.io/v2.2/man/bundle-config.1.html#MIRRORS-OF-GEM-SOURCES" target="_blank" rel="noopener noreferrer">https://bundler.io/v2.2/man/bundle-config.1.html#MIRRORS-OF-GEM-SOURCES</a></p>]]></content:encoded>
            <category>Ruby</category>
        </item>
        <item>
            <title><![CDATA[Python, Locust를 이용한 부하 테스트]]></title>
            <link>https://www.geuni.tech/en/python/load_testing_locust</link>
            <guid>https://www.geuni.tech/en/python/load_testing_locust</guid>
            <pubDate>Fri, 07 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[본 포스트에서는 Python 기반의 오픈소스 분산 부하 테스트 도구인 Locust의 사용법을 소개합니다.]]></description>
            <content:encoded><![CDATA[<p>본 포스트에서는 Python 기반의 오픈소스 분산 부하 테스트 도구인 Locust의 사용법을 소개합니다.</p>
<p>Locust는 LoadRunner나 JMeter와 같은 기존의 성능 테스트 도구에 비해 단일 서버에서 더 높은 부하를 생성할 수 있으며, 순수 Python 코드로 테스트 스크립트를 작성할 수 있다는 점에서 개발자 친화적이고 간편한 도구입니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="locust-설치">Locust 설치<a href="https://www.geuni.tech/en/python/load_testing_locust#locust-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Direct link to Locust 설치" title="Direct link to Locust 설치">​</a></h3>
<p>Python 3.6+ 버전 필요.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> locust</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>최신 버전(Pre-release)을 설치하고 싶다면:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-U</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--pre</span><span class="token plain"> locust</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>설치 확인:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token parameter variable" style="color:#36acaa">-V</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token number" style="color:#36acaa">2.32</span><span class="token plain">.5 from /usr/local/lib/python3.9/site-packages/locust </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">Python </span><span class="token number" style="color:#36acaa">3.9</span><span class="token plain">.12</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 사용법 확인</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token parameter variable" style="color:#36acaa">--help</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="locust-기본-사용법">Locust 기본 사용법<a href="https://www.geuni.tech/en/python/load_testing_locust#locust-%EA%B8%B0%EB%B3%B8-%EC%82%AC%EC%9A%A9%EB%B2%95" class="hash-link" aria-label="Direct link to Locust 기본 사용법" title="Direct link to Locust 기본 사용법">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="mock-api-생성">Mock API 생성<a href="https://www.geuni.tech/en/python/load_testing_locust#mock-api-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Direct link to Mock API 생성" title="Direct link to Mock API 생성">​</a></h4>
<p>테스트를 위해 간단한 Mock API를 만들어보겠습니다. 파일명은 <code>api.py</code>입니다.</p>
<p><strong>1. Flask 설치</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> flask</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>2. Mock API Script 작성</strong></p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">api.py</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> flask </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> jsonify</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Flask</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">__name__</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/hello'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methods</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'GET'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">hello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> jsonify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"message"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hello"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">route</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/world'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> methods</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'GET'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">world</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> jsonify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"message"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"World"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>3. Mock API 실행:</strong></p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">python api.py</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>정상적으로 실행되면 아래와 같은 output을 확인할 수 있습니다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">➜  python api.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Serving Flask app </span><span class="token string" style="color:#e3116c">'api'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Debug mode: off</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">WARNING: This is a development server. Do not use it </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> a production deployment. Use a production WSGI server instead.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> * Running on http://127.0.0.1:5000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Press CTRL+C to quit</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><a href="http://127.0.0.1:5000/hello" target="_blank" rel="noopener noreferrer">http://127.0.0.1:5000/hello</a> 접속 시，<code>{"message":"Hello"}</code> 확인가능.</p>
<p>이렇게 간단한 Mock API생성이 완료되었습니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="locust-스크립트-작성">Locust 스크립트 작성<a href="https://www.geuni.tech/en/python/load_testing_locust#locust-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%91%EC%84%B1" class="hash-link" aria-label="Direct link to Locust 스크립트 작성" title="Direct link to Locust 스크립트 작성">​</a></h4>
<p>다음과 같은 테스트 스크립트를 작성하고 파일명을 <code>locustfile.py</code>로 저장합니다.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">locustfile.py</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> locust </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> HttpUser</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> task</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">TestUser</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">HttpUser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># wait_time = between(0.3, 1)  # 요청 간 대기 시간: 0.3~1초 사이</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:#393A34">@task</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">hello</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/hello"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># "/hello" URL에 GET 요청</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:#393A34">@task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">world</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/world"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># "/world" URL에 GET 요청 (1:3 비율로 실행)        </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>스크립트 설명</strong></p>
<ul>
<li><code>HttpUser</code>: TestUser는 <code>HttpUser</code> 클래스를 상속. 이 클래스는 HTTP 기반의 부하 테스트를 할 때 사용됨.</li>
<li><code>wait_time</code>: 사용자 간 대기 시간을 설정하며, <code>between(0.3, 1)</code>은 0.3초~1초의 랜덤 시간을 의미.</li>
<li><code>@task</code>: 테스트 작업을 정의하며, 숫자는 작업이 실행되는 상대적 비율을 나타냄.</li>
<li><code>self.client.get()</code>: 지정된 URL에 GET request.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="locust-실행">Locust 실행<a href="https://www.geuni.tech/en/python/load_testing_locust#locust-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="Direct link to Locust 실행" title="Direct link to Locust 실행">​</a></h4>
<p>스크립트를 작성한 디렉토리에서 <code>locust</code> 명령어를 실행합니다.</p>
<blockquote>
<p>스크립트 파일명이 <code>locustfile.py</code>가 아닐떄, <code>-f</code> 파라미터를 사용하여 파일명을 지정해야 함.
예: <code>locust -f testScript.py</code></p>
</blockquote>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">output</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">➜  locust</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2025</span><span class="token plain">-01-09 </span><span class="token number" style="color:#36acaa">15</span><span class="token plain">:37:57,214</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> geuni/INFO/locust.main: Starting Locust </span><span class="token number" style="color:#36acaa">2.32</span><span class="token plain">.5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2025</span><span class="token plain">-01-09 </span><span class="token number" style="color:#36acaa">15</span><span class="token plain">:37:57,215</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> geuni/INFO/locust.main: Starting web interface at http://localhost:8089 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accepting connections from all network interfaces</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>이 단계에서 <code>http://localhost:8089</code> 접속후 필요한 정보를 입력하고 <em>START</em> 버튼을 클릭하면 부하테스트가 시작됩니다.</p>
<ul>
<li><code>Number of users</code>: 동시에 접속할 사용자 수를 설정.</li>
<li><code>Ramp up</code>: 초당 생성할 사용자 수를 설정.</li>
<li><code>Host</code>: 테스트할 대상 서버의 URL을 입력.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="locust-run" src="https://www.geuni.tech/en/assets/images/locust-run-b7e6e55816722b9a039fab223515c019.webp" width="3059" height="1596" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="cli-모드로-locust-실행">CLI 모드로 Locust 실행<a href="https://www.geuni.tech/en/python/load_testing_locust#cli-%EB%AA%A8%EB%93%9C%EB%A1%9C-locust-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="Direct link to CLI 모드로 Locust 실행" title="Direct link to CLI 모드로 Locust 실행">​</a></h4>
<p>CLI 모드에서는 명령어를 통해 테스트를 실행할 수 있습니다. <code>--headless</code> 옵션을 사용하여 대화형 입력 없이 실행 가능합니다.</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> locustfile.py </span><span class="token parameter variable" style="color:#36acaa">--headless</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--host</span><span class="token plain"> http://localhost:5000 </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-r</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> --run-time 20m</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<ul>
<li><code>-f </code> —  테스트 스크립트 파일 경로（파일명이 <code>locustfile.py</code>이고 현재 디렉토리에 있을때 생략 가능）</li>
<li><code>-headless</code> — 명령 모드 사용</li>
<li><code>-u</code> — 사용자 수</li>
<li><code>-r</code> — 초당 증가 속도</li>
<li><code>--run-time</code> — 테스트 지속 시간（<code>-t</code> 파라미터로 대체 가능）</li>
</ul>
<p><img decoding="async" loading="lazy" alt="locust_cli_result" src="https://www.geuni.tech/en/assets/images/locust-result-e396623f34f9729e3d25f2b715fcc09c.png" width="2482" height="400" class="img_ev3q"></p>
<p>테스트 종료 또는 <code>Ctrl-C</code> 중단 후, 위와 같은 테스트 결과를 얻을 수 있습니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="분산-모드로-locust-��실행">분산 모드로 Locust 실행<a href="https://www.geuni.tech/en/python/load_testing_locust#%EB%B6%84%EC%82%B0-%EB%AA%A8%EB%93%9C%EB%A1%9C-locust-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="Direct link to 분산 모드로 Locust 실행" title="Direct link to 분산 모드로 Locust 실행">​</a></h4>
<p>대규모 부하를 생성하려면 분산 모드를 사용할 수 있습니다.</p>
<p>먼저 <code>--master</code> 옵션으로 마스터 노드를 실행한 후, <code>--worker</code> 옵션으로 여러 worker 노드를 실행합니다.</p>
<p>master 노드 구동:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> my_locustfile.py </span><span class="token parameter variable" style="color:#36acaa">--master</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>worker 노드 구동:</p>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">locust </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> - </span><span class="token parameter variable" style="color:#36acaa">--worker</span><span class="token plain"> --master-host </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">your master</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--processes</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<blockquote>
<ul>
<li><code>-f -</code> : Locust에게 로컬 파일 시스템이 아닌 마스터에서 locustfile을 가져오도록 함.  (Locust 2.23.0부터 지원)</li>
<li><code>--master-host</code> : master 노드의 IP를 지정.</li>
<li><code>--processes</code> : Windows 운영체제에서는 지원이 안됨.</li>
</ul>
</blockquote>
<p>공식 문서: <a href="http://docs.locust.io/en/stable/" target="_blank" rel="noopener noreferrer">http://docs.locust.io/en/stable/</a></p>]]></content:encoded>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Python pip，pipenv 미러/소스 변경]]></title>
            <link>https://www.geuni.tech/en/python/pip_index_url</link>
            <guid>https://www.geuni.tech/en/python/pip_index_url</guid>
            <pubDate>Wed, 05 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。]]></description>
            <content:encoded><![CDATA[<p>像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="pip设置国内源">pip设置国内源<a href="https://www.geuni.tech/en/python/pip_index_url#pip%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85%E6%BA%90" class="hash-link" aria-label="Direct link to pip设置国内源" title="Direct link to pip设置国内源">​</a></h6>
<p>先确认pip.conf配置文件的加载路径：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip3 config list </span><span class="token parameter variable" style="color:#36acaa">-v</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>会有如下输出：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">For variant </span><span class="token string" style="color:#e3116c">'global'</span><span class="token plain">, will try loading </span><span class="token string" style="color:#e3116c">'/Library/Application Support/pip/pip.conf'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For variant </span><span class="token string" style="color:#e3116c">'user'</span><span class="token plain">, will try loading </span><span class="token string" style="color:#e3116c">'/Users/geuni/.pip/pip.conf'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For variant </span><span class="token string" style="color:#e3116c">'user'</span><span class="token plain">, will try loading </span><span class="token string" style="color:#e3116c">'/Users/geuni/.config/pip/pip.conf'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For variant </span><span class="token string" style="color:#e3116c">'site'</span><span class="token plain">, will try loading </span><span class="token string" style="color:#e3116c">'/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/pip.conf'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">global.index-url</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'http://pypi.tuna.tsinghua.edu.cn/simple'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">global.trusted-host</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'pypi.tuna.tsinghua.edu.cn'</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我是已经设置了清华源，默认是不会现实最后两行配置信息。</p>
<p>输出信息可看出，pip有3个等级配置文件：</p>
<ul>
<li><em><strong>global:</strong></em> 系统级的配置，跨用户共享的配置</li>
<li><em><strong>user:</strong></em> 用户级的配置</li>
<li><em><strong>site:</strong></em> 环境级的配置，如virtualenv</li>
</ul>
<p>根据你的需求，修改相应的配置文件（如果没有相应的目录及文件直接创建就行）。</p>
<p><strong>Mac用户</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> ~/.pip/pip.conf</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><strong>Windows用户：</strong></p>
<p>进用户目录下的AppData目录，创建pip目录并创建<em>pip.ini</em>文件（<em>%APPDATA%\pip\pip.ini</em>）。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">###清华源为例，写入如下内容</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">global</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">index-url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> http://pypi.tuna.tsinghua.edu.cn/simple</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trusted-host </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pypi.tuna.tsinghua.edu.cn</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>改完保存即生效。</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="pipenv设置国内源">pipenv设置国内源<a href="https://www.geuni.tech/en/python/pip_index_url#pipenv%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85%E6%BA%90" class="hash-link" aria-label="Direct link to pipenv设置国内源" title="Direct link to pipenv设置国内�源">​</a></h6>
<p>打开项目目录中的pipfile，修改source块下url</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> Pipfile</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://pypi.org/simple"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">verify_ssl </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pypi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">packages</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">requests </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">dev-packages</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">requires</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">python_version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"3.8"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[macOS에서 brew install 시 Error: No such file or directory 오류 해결]]></title>
            <link>https://www.geuni.tech/en/macos/brew_no_such_file_or_directory</link>
            <guid>https://www.geuni.tech/en/macos/brew_no_such_file_or_directory</guid>
            <pubDate>Tue, 04 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[brew install 명령을 실행할 때 아래와 같은 Error: No such file or directory * 오류가 발생하는 경우가 있습니다.]]></description>
            <content:encoded><![CDATA[<p>brew install 명령을 실행할 때 아래와 같은 Error: No such file or directory *** 오류가 발생하는 경우가 있습니다.</p>
<p>macOS가 시스템 업데이트후 Homebrew에 문제가 생기는 경우가 흔한데, 일반적으로 재설치를 통해 해결할 수 있습니다.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Error: No such </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> or directory @ rb_sysopen - /Users/geuni/Library/Caches/Homebrew/downloads/9c91a337f95d642c3eed905e43f8aa6dd50903ba990691c3001570277ad1ccd2--gdbm-1.21_1.monterey.bottle.tar.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>아래와 같은 명령어로 Homebrew삭제후 실행하여 Homebrew를 재설치:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 삭제</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/bin/zsh  </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">curl</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable parameter variable" style="color:#36acaa">-fsSL</span><span class="token string variable" style="color:#36acaa"> https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 설치</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/bin/zsh  </span><span class="token parameter variable" style="color:#36acaa">-c</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$(</span><span class="token string variable function" style="color:#d73a49">curl</span><span class="token string variable" style="color:#36acaa"> </span><span class="token string variable parameter variable" style="color:#36acaa">-fsSL</span><span class="token string variable" style="color:#36acaa"> https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh</span><span class="token string variable" style="color:#36acaa">)</span><span class="token string" style="color:#e3116c">"</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>]]></content:encoded>
            <category>macOS</category>
        </item>
    </channel>
</rss>