<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.geuni.tech/</id>
    <title>Geuni's Blog Blog</title>
    <updated>2025-02-13T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.geuni.tech/"/>
    <subtitle>Geuni's Blog Blog</subtitle>
    <icon>https://www.geuni.tech/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Elasticsearch 8.x 설치 및 Cluster구성하기]]></title>
        <id>https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup</id>
        <link href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup"/>
        <updated>2025-02-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[본 글에서는 Elasticsearch(8.17) 아카이브 (.tar.gz) 설치 및 클러스터 구성방법에 대해서 소개합니다.]]></summary>
        <content type="html"><![CDATA[<p>Elasticsearch는 실시간 분산 검색 및 분석 엔진으로, 대용량 데이터를 효율적으로 저장, 검색, 분석할 수 있는 오픈소스 도구입니다.</p>
<p>Apache Lucene 라이브러리를 기반으로 구축되었으며, 주로 풀텍스트 검색, 로그 분석, 애플리케이션 모니터링 등의 용도로 사용됩니다.</p>
<p>본 글에서는 Elasticsearch 아카이브 (.tar.gz) 설치 및 클러스터 구성방법에 대해서 소개합니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="elasticsearch-설치">Elasticsearch 설치<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#elasticsearch-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Elasticsearch 설치에 대한 직접 링크" title="Elasticsearch 설치에 대한 직접 링크">​</a></h3>
<p><strong>설치환경 및 Elasticsearch 버전</strong></p>
<ul>
<li>OS:  Ubuntu 24.04 LTS</li>
<li>Elasticsearch: 8.17.2</li>
</ul>
<p>클러스터 구성을 위해 다음과 같이 3대의 VM을 준비합니다.</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="아카이브-다운로드-및-설치">아카이브 다운로드 및 설치<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#%EC%95%84%EC%B9%B4%EC%9D%B4%EB%B8%8C-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%8F-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="아카이브 다운로드 및 설치에 대한 직접 링크" title="아카이브 다운로드 및 설치에 대한 직접 링크">​</a></h4>
<p>먼저 Elasticsearch 아카이브를 다운로드한 후, 압축을 해제하여 설치 디렉토리로 이동합니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="사용자-생성-및-권한-설정">사용자 생성 및 권한 설정<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="사용자 생성 및 권한 설정에 대한 직접 링크" title="사용자 생성 및 권한 설정에 대한 직접 링크">​</a></h4>
<p>ES 서비스 계정을 생성하고 Elasticsearch 디렉토리의 소유권을 해당 사용자로 변경합니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-서비스-설정">Systemd 서비스 설정<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#systemd-%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="Systemd 서비스 설정에 대한 직접 링크" title="Systemd 서비스 설정에 대한 직접 링크">​</a></h4>
<p><code>/etc/systemd/system/elasticsearch.service</code> 파일을 생성하여 Elasticsearch를 서비스로 등록합니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="방화벽-설정">방화벽 설정<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#%EB%B0%A9%ED%99%94%EB%B2%BD-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="방화벽 설정에 대한 직접 링크" title="방화벽 설정에 대한 직접 링크">​</a></h4>
<p>Elasticsearch 및 Kibana에서 사용하는 포트를 방화벽에서 허용합니다.</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><span class="token comment" style="color:#999988;font-style:italic"># Kibana 연동 시</span><span class="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"> 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-클러스터-구성">Elasticsearch 클러스터 구성<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#elasticsearch-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Elasticsearch 클러스터 구성에 대한 직접 링크" title="Elasticsearch 클러스터 구성에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="인증서-생성-및-배포">인증서 생성 및 배포<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EB%B0%B0%ED%8F%AC" class="hash-link" aria-label="인증서 생성 및 배포에 대한 직접 링크" title="인증서 생성 및 배포에 대한 직접 링크">​</a></h4>
<p>클러스터 간 보안 통신을 위해 SSL/TLS 인증서를 생성하고 각 노드에 배포합니다.</p>
<p>임의의 노드에서 CA 인증서를 생성:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>elastic-certificates.p12</code> 파일을 각 노드의 <code>/opt/elasticsearch/config</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="elasticsearchyml-편집">elasticsearch.yml 편집<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#elasticsearchyml-%ED%8E%B8%EC%A7%91" class="hash-link" aria-label="elasticsearch.yml 편집에 대한 직접 링크" title="elasticsearch.yml 편집에 대한 직접 링크">​</a></h4>
<p>각 노드별로 고유의 <code>node.name</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># 클러스터 노드 IP 목록</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"># 클러스터 내구성을 위한 마스터 자격 노드 지정 (최초 구성 후 주석 처리 필수)</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 설정</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># 클러스터 노드 IP 목록</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"># 클러스터 내구성을 위한 마스터 자격 노드 지정 (최초 구성 후 주석 처리 필수)</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 설정</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># 클러스터 노드 IP 목록</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"># 클러스터 내구성을 위한 마스터 자격 노드 지정 (최초 구성 후 주석 처리 필수)</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 설정</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>주의:</strong> <code>cluster.initial_master_nodes </code>설정은 최초 클러스터 구성 시에만 필요하며, 이후에는 주석 처리해야 합니다. (<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="클러스터-구동-및-상태-확인">클러스터 구동 및 상태 확인<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EA%B5%AC%EB%8F%99-%EB%B0%8F-%EC%83%81%ED%83%9C-%ED%99%95%EC%9D%B8" class="hash-link" aria-label="클러스터 구동 및 상태 확인에 대한 직접 링크" title="클러스터 구동 및 상태 확인에 대한 직접 링크">​</a></h4>
<p>각 노드에서 Elasticsearch 서비스를 시작한 후, 클러스터 상태를 확인합니다.</p>
<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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>elastic</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-연동">Kibana 연동<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#kibana-%EC%97%B0%EB%8F%99" class="hash-link" aria-label="Kibana 연동에 대한 직접 링크" title="Kibana 연동에 대한 직접 링크">​</a></h3>
<p>디폴트로 <code>elastic</code> 슈퍼유저 계정은 Kibana에서 사용할수 없으며, kibana전용 built-in 계정 <code>kibana_system</code>을 사용합니다.</p>
<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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-설치">Kibana 설치<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#kibana-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Kibana 설치에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="kibanayml-편접">kibana.yml 편접<a href="https://www.geuni.tech/elasticsearch-install-cluster-kibana-setup#kibanayml-%ED%8E%B8%EC%A0%91" class="hash-link" aria-label="kibana.yml 편접에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>Kibana 구동</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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://192.168.234.128:5601/" target="_blank" rel="noopener noreferrer">http://192.168.234.128:5601</a> (또는 Kibana를 설치한 노드의 IP 주소)에 접속하여 <code>elastic</code> 계정으로 로그인합니다.</p>
<img src="https://www.geuni.tech/img/post/kibana-login.png" alt="Kibana 로그인" style="zoom:60%">
<p>오늘은 Elasticsearch와 Kibana를 간단히 설치하고 클러스터를 구성하는 방법을 살펴보았습니다.</p>
<p>아카이브 설치 방식은 설치와 관리가 쉬워 다양한 환경에서 유용하게 사용할 수 있습니다. 도움이 되길 바랍니다.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cursor AI 이제 안녕! VS Code, DeepSeek R1, Ollama 무료 대체 솔루션]]></title>
        <id>https://www.geuni.tech/deepseek-r1-ollama-vscode-setup</id>
        <link href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup"/>
        <updated>2025-02-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[비싼 AI 코딩 어시스턴트 구독료가 부담스러우신가요? VS Code, Deepseek R1, Ollama를 활용하여 Cursor AI를 무료로 대체하는 방법을 소개합니다.]]></summary>
        <content type="html"><![CDATA[<p>유료 AI 코딩 어시스턴트 중에는 Cursor, Windsurf, GitHub Copilot 등 정말 괜찮은 툴들이 있습니다. 하지만 매달 나가는 구독료가 다소 부담되는것도 사실입니다.</p>
<p>오늘은 VS Code <strong>Cline</strong> 익스텐션 + <strong>ollama</strong> + <strong>DeepSeek R1</strong> 조합으로 AI 편집기 무료로 사용하는법을 적어봅니다.</p>
<p><strong>Cline</strong>은 VS Code에서 사용할 수 있는 AI 코딩 어시스트 확장 프로그램입니다. 오픈소스로 솔루션이며, 사용자의 명령어나 코드 작성을 도와주는 다양한 기능을 제공하여 개발 생산성을 향상시키는 데 많은 도움을 줄수 있습니다.</p>
<p>비슷한 기능을 제공하는 VS code 확장 프로그램에는 <strong>Continue</strong>, <strong>Roo Code</strong> 등이 있으며, 전부 어느정도 검증이 된 프로그램들이며 커뮤니티도 상당히 활성화 되어 있습니다.</p>
<p>기본적인 설정방식은 크게 차이가 없어, 개인 사용습관에 맞는 프로그램을 선택해서 사용하시면 됩니다. 참고로 Cline은 Tab 자동완성 기능이 없어 Cline에 Continue 결합해서 사용하는것도 하나의 옵션입니다.</p>
<p>참고로 <a href="https://openrouter.ai/" target="_blank" rel="noopener noreferrer">openrouter.ai</a> 플랫폼 토큰 사용순위를 보면 <strong>Cline</strong>, <strong>Roo Code</strong> 토큰 사용량이 압도적으로 높습니다.</p>
<img src="https://www.geuni.tech/img/post/openrouter-ai.png" alt="openrouter-ai, 토큰 사용 랭킹" 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="deepseek-r1-로컬-실행">DeepSeek R1 로컬 실행<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#deepseek-r1-%EB%A1%9C%EC%BB%AC-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="DeepSeek R1 로컬 실행에 대한 직접 링크" title="DeepSeek R1 로컬 실행에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="왜-로컬-실행인가">왜 로컬 실행인가?<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#%EC%99%9C-%EB%A1%9C%EC%BB%AC-%EC%8B%A4%ED%96%89%EC%9D%B8%EA%B0%80" class="hash-link" aria-label="왜 로컬 실행인가?에 대한 직접 링크" title="왜 로컬 실행인가?에 대한 직접 링크">​</a></h4>
<ul>
<li><strong>무료 및 저비용 운영:</strong> Cursor AI는 월 구독료가 발생하는 반면, Cline은 오픈 소스로 제공되며 DeepSeek R1 또한 로컬에서 실행할 수 있으므로 추가 비용 없이 강력한 AI 보조 기능을 활용할 수 있습니다.</li>
<li><strong>데이터 보안:</strong> 모든 AI 연산이 로컬 환경에서 이루어지므로 코드와 관련 데이터가 외부 서버로 전송되지 않아 프라이버시와 보안 면에서 큰 장점을 제공합니다.</li>
<li><strong>빠른 응답 속도:</strong> DeepSeek R1은 사용자의 하드웨어에서 직접 실행되기 때문에 네트워크 지연 없이 빠른 응답을 제공하며, API호출방식에 비해 더 낮은 지연시간을 기대할 수 있습니다.</li>
</ul>
<p>물론 개인 PC에서 실행 가능한 경량화 distilled 모델에서 API가 제공하는 full 파라미터 모델과 같은 효과를 기대하면 안 됩니다.</p>
<p>솔직히 대부분 개인 개발자 분들에게는 어느 정도 비용을 감수하면서 플랫폼에서 제공되는 API를 이용하는 것이 더 현실적이며(특히 한국어와 같이 소수 언어를 사용하는 경우), 로컬 방식의 실행은 실험적인 마인드로 접근해 보시길 바랍니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ollama-설치">Ollama 설치<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#ollama-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Ollama 설치에 대한 직접 링크" title="Ollama 설치에 대한 직접 링크">​</a></h4>
<p>Ollama는 DeepSeek R1과 같은 대형 언어 모델을 로컬에서 간편하게 실행할 수 있도록 돕는 도구입니다.</p>
<ul>
<li><a href="https://ollama.com/download" target="_blank" rel="noopener noreferrer">Ollama 공식 웹사이트</a>에서 Ollama를 다운로드 및 설치합니다.</li>
</ul>
<img src="https://www.geuni.tech/img/post/ollama-download.png" alt="ollama 다운로드" style="zoom:70%">
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="원하는-deepseek-r1-모델-다운로드">원하는 DeepSeek R1 모델 다운로드<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#%EC%9B%90%ED%95%98%EB%8A%94-deepseek-r1-%EB%AA%A8%EB%8D%B8-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C" class="hash-link" aria-label="원하는 DeepSeek R1 모델 다운로드에 대한 직접 링크" title="원하는 DeepSeek R1 모델 다운로드에 대한 직접 링크">​</a></h4>
<p>본인 PC사양에 맞는 모델을 선택하여 다운로드 합니다.</p>
<p>예) 7b 모델의 경우:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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://localhost:11434/" target="_blank" rel="noopener noreferrer">http://localhost:11434</a> 로 접근할 수 있습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-cline-설정">VS Code, Cline 설정<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#vs-code-cline-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="VS Code, Cline 설정에 대한 직접 링크" title="VS Code, Cline 설정에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="vs-code-확장-프로그램-설치">VS Code 확장 프로그램 설치<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#vs-code-%ED%99%95%EC%9E%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="VS Code 확장 프로그램 설치에 대한 직접 링크" title="VS Code 확장 프로그램 설치에 대한 직접 링크">​</a></h4>
<p>VS Code 확장 마켓에서 <code>Cline</code>을 검색해 설치합니다.</p>
<img src="https://www.geuni.tech/img/post/vs-code-cline.png" alt="Vs code, Cline 설치" style="zoom:40%">
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="cline에서-ollama로컬-deepseek-r1-연동">Cline에서 ollama(로컬 Deepseek R1) 연동<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#cline%EC%97%90%EC%84%9C-ollama%EB%A1%9C%EC%BB%AC-deepseek-r1-%EC%97%B0%EB%8F%99" class="hash-link" aria-label="Cline에서 ollama(로컬 Deepseek R1) 연동에 대한 직접 링크" title="Cline에서 ollama(로컬 Deepseek R1) 연동에 대한 직접 링크">​</a></h4>
<ul>
<li>VS Code에서 Cline 설정을 엽니다.</li>
<li>API Provider 목록에서 <code>Ollama</code>을 선택합니다.</li>
<li><code>Base URL</code> 필드에 <a href="http://localhost:11434/" target="_blank" rel="noopener noreferrer">http://localhost:11434</a>를 입력하고, 모델 선택 옵션에서 실행 중인 DeepSeek R1모델 (예: <code>deepseek-r1:14b</code>)을 선택합니다.</li>
</ul>
<blockquote>
<p>로컬 DeepSeek 모델 배포가 성공하면, <code>Base URL</code> 입력 후 Model ID 아래에 자동으로 사용 가능한 모델 선택 창이 표시됨.</p>
</blockquote>
<img src="https://www.geuni.tech/img/post/vs-code-cline-settings.png" alt="Vs code, Cline 설정" style="zoom:70%">
<blockquote>
<p>메시지 입력후, <code>MCP hub not available</code> 오류가 뜨면 VS code재구동하면 해결됨. <br>
Github Issue 참고: <a href="https://github.com/cline/cline/issues/969" target="_blank" rel="noopener noreferrer">https://github.com/cline/cline/issues/969</a></p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="테스트">테스트<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#%ED%85%8C%EC%8A%A4%ED%8A%B8" class="hash-link" aria-label="테스트에 대한 직접 링크" title="테스트에 대한 직접 링크">​</a></h4>
<p>설정이 끝나면 Cline을 이용해 prompt를 입력해 정상적으로 응답하는지 확인합니다.</p>
<p>prompt 입력후 CPU가 미친듯이 돌아가는데 응답이 너무 느리거나 없으면, 해당 모델을 돌리기에 PC사양이 딸리는 경우입니다..이떄는 모델버전 낮추어 테스트해보길 추천드립니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="api-연동-방식">API 연동 방식<a href="https://www.geuni.tech/deepseek-r1-ollama-vscode-setup#api-%EC%97%B0%EB%8F%99-%EB%B0%A9%EC%8B%9D" class="hash-link" aria-label="API 연동 방식에 대한 직접 링크" title="API 연동 방식에 대한 직접 링크">​</a></h4>
<ul>
<li>DeepSeek API 키 발급 (<a href="https://platform.deepseek.com/api_keys" target="_blank" rel="noopener noreferrer">DeepSeek 공식 사이트</a>)</li>
<li>VS Code에서 Cline 설정을 열어, API Provider 목록에서 <code>DeepSeek</code>를 선택하고 API Key를 입력하고, 모델을 <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>이제 여러분도 월 $0으로 Cursor 수준의 AI 코딩을 경험해보세요! 설정 과정에서 문제가 발생하면 Ollama 공식 문서나 Cline GitHub 이슈 페이지에서 도움을 받을 수 있습니다.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Spring AI, DeepSeek를 연동하여 챗봇 만들기]]></title>
        <id>https://www.geuni.tech/spring-ai-with-deepseek</id>
        <link href="https://www.geuni.tech/spring-ai-with-deepseek"/>
        <updated>2025-01-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[이번 글에서는 Spring AI를 이용하여 DeepSeek API를 연동하고 간단한 AI 챗봇을 구현하는 방법을 소개합니다.]]></summary>
        <content type="html"><![CDATA[<p>지난한주 DeepSeek가 많은 화제가 됐엇죠? 각종 미디어 메인에 도배가 됐더군요.</p>
<p>이번 글에서는 최대한 간단한 방식으로, Spring AI를 이용하여 DeepSeek API를 연동하고 간단한 AI 챗봇을 구현하는 방법을 소개합니다.</p>
<p>본 글의 내용은 Spring AI와 기타 언어모델 연동에도(OpenAI, Groq 등) 동일한 방식으로 적용할 수 있습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-ai-ai-통합을-위한-강력한-도구">Spring AI: AI 통합을 위한 강력한 도구<a href="https://www.geuni.tech/spring-ai-with-deepseek#spring-ai-ai-%ED%86%B5%ED%95%A9%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%95%EB%A0%A5%ED%95%9C-%EB%8F%84%EA%B5%AC" class="hash-link" aria-label="Spring AI: AI 통합을 위한 강력한 도구에 대한 직접 링크" title="Spring AI: AI 통합을 위한 강력한 도구에 대한 직접 링크">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Spring AI 통합, 다이어그램" src="https://www.geuni.tech/assets/images/spring-ai-integration-diagram-15efbf8cf671e5905e96b462ea5acdbf.svg" width="456" height="301" class="img_ev3q"></p>
<p>Spring AI는 Spring 생태계에 생성형 AI(Generative AI) 기능을 통합하기 위한 프로젝트로, 개발자가 쉽게 AI 모델을 애플리케이션에 통합할 수 있도록 지원합니다. Spring AI는 다음과 같은 주요 기능을 제공합니다:</p>
<ol>
<li><strong>표준화된 API:</strong> 다양한 AI 제공자(Anthropic, OpenAI, Microsoft, Amazon, Google, Ollama, DeepSeek 등)와의 통합을 위한 일관된 인터페이스 제공</li>
<li><strong>모듈화된 구조:</strong> 특정 AI 제공자에 종속되지 않는 유연한 아키텍처</li>
<li><strong>쉬운 통합:</strong> Spring Boot의 자동 설정 기능을 활용한 빠른 통합</li>
<li><strong>확장성:</strong> 커스텀 모델 및 옵션 지원을 통한 고급 사용 사례 대응</li>
</ol>
<p>Spring AI는 특히 엔터프라이즈 환경에서 AI 기능을 빠르게 도입하고 확장할 수 있도록 설계되었습니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deepseek-고성능-저렴한-가격">DeepSeek: 고성능, 저렴한 가격<a href="https://www.geuni.tech/spring-ai-with-deepseek#deepseek-%EA%B3%A0%EC%84%B1%EB%8A%A5-%EC%A0%80%EB%A0%B4%ED%95%9C-%EA%B0%80%EA%B2%A9" class="hash-link" aria-label="DeepSeek: 고성능, 저렴한 가격에 대한 직접 링크" title="DeepSeek: 고성능, 저렴한 가격에 대한 직접 링�크">​</a></h3>
<img src="https://www.geuni.tech/img/post/deepseek_benchmark.jpg" alt="deepseek 벤치마크" style="zoom:20%">
<p>이번에 DeepSeek R1 모델을 공개하며 많이 알려졋는데요, OpenAI-o1 못지않은 성능에 저력한 가격, 거기에 오픈소스로 배포하며 미국 자본시장까지 뒤흔들정도로 업계에 충격을 준 회사입니다.</p>
<ul>
<li><strong>고성능 언어 모델:</strong> OpenAI-o1 수준의 성능을 제공하는 고급 언어 모델</li>
<li><strong>OpenAI 호환 API:</strong> OpenAI의 API 표준을 준수하여 기존 OpenAI 기반 애플리케이션과의 호환성 보장</li>
<li><strong>비용 효율성:</strong> OpenAI에 비해 상대적으로 저렴한 가격 정책</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="사전-준비">사전 준비<a href="https://www.geuni.tech/spring-ai-with-deepseek#%EC%82%AC%EC%A0%84-%EC%A4%80%EB%B9%84" class="hash-link" aria-label="사전 준비에 대한 직접 링크" title="사전 준비에 대한 직접 링크">​</a></h3>
<ul>
<li>Java 17+ 설치</li>
<li>Gradle 8+ 설치</li>
<li>DeepSeek API 키 발급 (<a href="https://platform.deepseek.com/api_keys" target="_blank" rel="noopener noreferrer">DeepSeek 공식 사이트</a>)</li>
<li>환경 변수 설정 (API 키는 <code>application.yml</code>에 직접 입력하지 않고 환경 변수로 관리하는 것을 추천)</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="기능-구현">기능 구현<a href="https://www.geuni.tech/spring-ai-with-deepseek#%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84" class="hash-link" aria-label="기능 구현에 대한 직접 링크" title="기능 구현에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-buildgradle-설정">1. build.gradle 설정<a href="https://www.geuni.tech/spring-ai-with-deepseek#1-buildgradle-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="1. build.gradle 설정에 대한 직접 링크" title="1. build.gradle 설정에 대한 직접 링크">​</a></h4>
<p>먼저, Spring Boot 프로젝트를 생성하고 <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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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><code>spring-ai-openai-spring-boot-starter</code>는 OpenAI API 표준을 준수하는 모든 서비스와 호환됩니다.</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-applicationyml-작성">2. application.yml 작성<a href="https://www.geuni.tech/spring-ai-with-deepseek#2-applicationyml-%EC%9E%91%EC%84%B1" class="hash-link" aria-label="2. application.yml 작성에 대한 직접 링크" title="2. application.yml 작성에 대한 직접 링크">​</a></h4>
<p>다음으로, <code>application.yml</code>에서 DeepSeek API와의 연결과 모델 옵션을 설정합니다.</p>
<blockquote>
<p><code>base-url</code>, <code>api-key</code>,<code>model</code> 값만 변경하여 기타 언어모델과의 연동이 가능합니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-controller-구현">3. Controller 구현<a href="https://www.geuni.tech/spring-ai-with-deepseek#3-controller-%EA%B5%AC%ED%98%84" class="hash-link" aria-label="3. Controller 구현에 대한 직접 링크" title="3. Controller 구현에 대한 직접 링크">​</a></h4>
<p>이제 Spring AI를 통해 DeepSeek API를 호출하는 Controller를 작성합니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-테스트">API 테스트<a href="https://www.geuni.tech/spring-ai-with-deepseek#api-%ED%85%8C%EC%8A%A4%ED%8A%B8" class="hash-link" aria-label="API 테스트에 대한 직접 링크" title="API 테스트에 대한 직접 링크">​</a></h3>
<p>사용자 급증으로 Deppseek API서비스는 아직까지 안정적이지 않습니다..API오류 발생시 아래 링크에서 서비스 상태 확인바랍니다.</p>
<blockquote>
<p>서비스 상태 확인: <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, Deppseek 연동 테스트" src="https://www.geuni.tech/assets/images/spring-ai-deepseek-test-7679fdbcd3d7062a4bebc2cd18196713.png" width="2284" height="1467" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="chat-ui-적용">Chat UI 적용<a href="https://www.geuni.tech/spring-ai-with-deepseek#chat-ui-%EC%A0%81%EC%9A%A9" class="hash-link" aria-label="Chat UI 적용에 대한 직접 링크" title="Chat UI 적용에 대한 직접 링크">​</a></h3>
<p>저는 Cursor 도움을 받아 간단히 만들어봤는데 이 부분의 소스 코드는 너무 길어 생략하겠습니다. 여러분도 자신에게 편한 AI 도구를 활용하여 직접 원하는 대로 인터페이스를 만들어 보시길 추천드립니다.</p>
<img src="https://www.geuni.tech/img/post/spring-ai-deepseek-test.gif" alt="Spring AI, Deppseek Chat UI" style="zoom:40%">
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="마무리">마무리<a href="https://www.geuni.tech/spring-ai-with-deepseek#%EB%A7%88%EB%AC%B4%EB%A6%AC" class="hash-link" aria-label="마무리에 대한 직접 링크" title="마무리에 대한 직접 링크">​</a></h3>
<p>본 가이드에서는 Spring AI를 이용하여 DeepSeek API를 연동하고 간단한 AI 챗봇을 개발하는 방법을 소개했습니다. DeepSeek은 OpenAI의 강력한 경쟁자로서, 앞으로 AI 시장에 큰 영향을 미칠 것으로 예상됩니다.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Cursor AI 사용법: 코드 편집을 넘어, 다목적 AI 도구]]></title>
        <id>https://www.geuni.tech/cursor-ai-usage</id>
        <link href="https://www.geuni.tech/cursor-ai-usage"/>
        <updated>2025-01-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Cursor AI는 코드 자동 완성, 버그 수정 등 개발 생산성을 높여주는 것은 물론, 자연어 생성 기능으로 콘텐츠 크리에이터에게도 유용한 AI 도구입니다. 다양한 기능과 사용법을 자세히 알아보세요.]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cursor-ai-코드-편집을-넘어선-다목적-ai-assist-도구">Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구<a href="https://www.geuni.tech/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="Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구에 대한 직접 링크" title="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/cursor-ai-usage#%EB%AA%A9%ED%91%9C" class="hash-link" aria-label="목표에 대한 직접 링크" title="목표에 대한 직접 링크">​</a></h6><p>Python을 사용하여 시각적으로 세련되고 현대적인 Snake 게임을 개발합니다. 코드는 깔끔하고 유지보수가 용이하며, 직관적인 UI를 제공합니다.</p><h6 class="anchor anchorWithStickyNavbar_LWe7" id="요구사항">요구사항<a href="https://www.geuni.tech/cursor-ai-usage#%EC%9A%94%EA%B5%AC%EC%82%AC%ED%95%AD" class="hash-link" aria-label="요구사항에 대한 직접 링크" title="요구사항에 대한 직접 링크">​</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/cursor-ai-usage#%EC%84%A4%EA%B3%84-%EB%B0%A9%ED%96%A5" class="hash-link" aria-label="설계 방향에 대한 직접 링크" title="설계 방향에 대한 직접 링크">​</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/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="개발 가이드라인에 대한 직접 링크" title="개발 가이드라인에 대한 직접 링크">​</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/cursor-ai-usage#cursor-%ED%95%B5%EC%8B%AC%EA%B8%B0%EB%8A%A5" class="hash-link" aria-label="Cursor 핵심기능에 대한 직접 링크" title="Cursor 핵심기능에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="tab-자동완성">Tab 자동완성<a href="https://www.geuni.tech/cursor-ai-usage#tab-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1" class="hash-link" aria-label="Tab 자동완성에 대한 직접 링크" title="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/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/cursor-ai-usage#chat-ctrl--l" class="hash-link" aria-label="Chat (Ctrl/⌘ + L)에 대한 직접 링크" title="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/cursor-ai-usage#inline-chatctrlcmd-k" class="hash-link" aria-label="Inline Chat(Ctrl/Cmd K)에 대한 직접 링크" title="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/cursor-ai-usage#composer-ctrl--i" class="hash-link" aria-label="Composer (Ctrl/⌘ + I)에 대한 직접 링크" title="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/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/cursor-ai-usage#rules-for-ai" class="hash-link" aria-label="Rules for AI에 대한 직접 링크" title="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/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/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="결론: Cursor AI, 다목적 AI 도구로의 진화에 대한 직접 링크" title="결론: Cursor AI, 다목적 AI 도구로의 진화에 대한 직접 링크">​</a></h3>
<p>오늘은 Cursor의 핵심 기능에 대해 정리해봤습니다. Cursor는 단순한 코드 편집기를 넘어, AI의 힘을 활용해 다양한 분야에서 활용 가능한 다목적 도구로 자리 잡고 있습니다.</p>
<p>처음 Cursor를 접했을 때는 개발자들을 위한 코드 편집기로만 생각했지만, 실제로 사용해보면 그 이상의 잠재력을 발견할 수 있습니다. Cursor는 AI의 자연어 처리 능력을 바탕으로, 코드 작성부터 복잡한 문제 해결, 글쓰기와 콘텐츠 생성에 이르기까지 다양한 작업을 지원하는 강력한 도구입니다.</p>
<p>Cursor는 단순히 도구를 넘어, 사용자의 창의성과 생산성을 극대화하는 파트너 역할을 합니다. 여러분도 Cursor를 통해 더 스마트하고 효율적인 작업 방식을 경험해보시길 추천합니다.</p>]]></content>
        <category label="Cursor" term="Cursor"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Git 사용법: 명령어, 용어 정리]]></title>
        <id>https://www.geuni.tech/git-commands-and-glossary</id>
        <link href="https://www.geuni.tech/git-commands-and-glossary"/>
        <updated>2025-01-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Git 명령어 사용법, 용어 총정리! Git: 더 이상 개발자만의 도구가 아니다!]]></summary>
        <content type="html"><![CDATA[<p>본 포스트는 Git 명령어를 중심으로 다룹니다. Git을 처음 접하시는 분들도 쉽게 따라올 수 있도록 기본 개념을 간단히 소개하는 것부터 시작해보려고 합니다.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-더-이상-개발자�만의-도구가-아니다">Git: 더 이상 개발자만의 도구가 아니다!<a href="https://www.geuni.tech/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="Git: 더 이상 개발자만의 도구가 아니다!에 대한 직접 링크" title="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/git-commands-and-glossary#git-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0" class="hash-link" aria-label="Git 개념잡기에 대한 직접 링크" title="Git 개념잡기에 대한 직접 링크">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="git-workflow">Git Workflow<a href="https://www.geuni.tech/git-commands-and-glossary#git-workflow" class="hash-link" aria-label="Git Workflow에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6%AC" class="hash-link" aria-label="Git 용어정리에 대한 직접 링크" title="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/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="포인터의 중요성에 대한 직접 링크" title="포인터의 중요성에 대한 직접 링크">​</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-%EB%AA%85%EB%A0%B9%EC%96%B4" class="hash-link" aria-label="Git 명령어에 대한 직접 링크" title="Git 명령어에 대한 직접 링크">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-저장소-설정">1. 저장소 설정<a href="https://www.geuni.tech/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="1. 저장소 설정에 대한 직접 링크" title="1. 저장소 설정에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-config">git config<a href="https://www.geuni.tech/git-commands-and-glossary#git-config" class="hash-link" aria-label="git config에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-alias" class="hash-link" aria-label="git alias에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="2. 저장소 초기화 및 클론에 대한 직접 링크" title="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/git-commands-and-glossary#git-init" class="hash-link" aria-label="git init에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-clone" class="hash-link" aria-label="git clone에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="3. 변경 사항 추적 및 관리에 대한 직접 링크" title="3. 변경 사항 추적 및 관리에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-status">git status<a href="https://www.geuni.tech/git-commands-and-glossary#git-status" class="hash-link" aria-label="git status에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-add" class="hash-link" aria-label="git add에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-diff" class="hash-link" aria-label="git diff에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-stash" class="hash-link" aria-label="git stash에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-commit" class="hash-link" aria-label="git commit에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-log" class="hash-link" aria-label="git log에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-show" class="hash-link" aria-label="git show에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="5. 브랜치 관리에 대한 직접 링크" title="5. 브랜치 관리에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-branch">git branch<a href="https://www.geuni.tech/git-commands-and-glossary#git-branch" class="hash-link" aria-label="git branch에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-checkout" class="hash-link" aria-label="git checkout에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-switch" class="hash-link" aria-label="git switch에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-merge" class="hash-link" aria-label="git merge에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="6. 원격 저장소에 대한 직접 링크" title="6. 원격 저장소에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-remote">git remote<a href="https://www.geuni.tech/git-commands-and-glossary#git-remote" class="hash-link" aria-label="git remote에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-pull" class="hash-link" aria-label="git pull에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-push" class="hash-link" aria-label="git push에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-fetch" class="hash-link" aria-label="git fetch에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#7-%ED%83%9C%EA%B7%B8" class="hash-link" aria-label="7. 태그에 대한 직접 링크" title="7. 태그에 대한 직접 링크">​</a></h3>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="git-tag">git tag<a href="https://www.geuni.tech/git-commands-and-glossary#git-tag" class="hash-link" aria-label="git tag에 대한 직접 링크" title="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/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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="8. 로그 및 변경이력에 대한 직접 링크" title="8. 로그 및 변경이력에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-log-1"><a href="https://www.geuni.tech/git-commands-and-glossary#git-log">🔗git log</a><a href="https://www.geuni.tech/git-commands-and-glossary#git-log-1" class="hash-link" aria-label="git-log-1에 대한 직접 링크" title="git-log-1에 대한 직접 링크">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-show-1"><a href="https://www.geuni.tech/git-commands-and-glossary#git-show">🔗git show</a><a href="https://www.geuni.tech/git-commands-and-glossary#git-show-1" class="hash-link" aria-label="git-show-1에 대한 직접 링크" title="git-show-1에 대한 직접 링크">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-blame">git blame<a href="https://www.geuni.tech/git-commands-and-glossary#git-blame" class="hash-link" aria-label="git blame에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-reflog" class="hash-link" aria-label="git reflog에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="9. 파일 복구 및 취소에 대한 직접 링크" title="9. 파일 복구 및 취소에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-checkout-1"><a href="https://www.geuni.tech/git-commands-and-glossary#git-checkout">🔗git checkout</a><a href="https://www.geuni.tech/git-commands-and-glossary#git-checkout-1" class="hash-link" aria-label="git-checkout-1에 대한 직접 링크" title="git-checkout-1에 대한 직접 링크">​</a></h4>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-reset">git reset<a href="https://www.geuni.tech/git-commands-and-glossary#git-reset" class="hash-link" aria-label="git reset에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-restore" class="hash-link" aria-label="git restore에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#10-%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4" class="hash-link" aria-label="10. 리베이스에 대한 직접 링크" title="10. 리베이스에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-rebase">git rebase<a href="https://www.geuni.tech/git-commands-and-glossary#git-rebase" class="hash-link" aria-label="git rebase에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#11-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88" class="hash-link" aria-label="11. 서브모듈에 대한 직접 링크" title="11. 서브모듈에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-submodule">git submodule<a href="https://www.geuni.tech/git-commands-and-glossary#git-submodule" class="hash-link" aria-label="git submodule에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="12. 기타 유용한 명령어에 대한 직접 링크" title="12. 기타 유용한 명령어에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-cherry-pick">git cherry-pick<a href="https://www.geuni.tech/git-commands-and-glossary#git-cherry-pick" class="hash-link" aria-label="git cherry-pick에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/git-commands-and-glossary#git-bisect" class="hash-link" aria-label="git bisect에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Git" term="Git"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Docusaurus로 나만의 블로그 만들기]]></title>
        <id>https://www.geuni.tech/creating-a-personal-blog-using-docusaurus</id>
        <link href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus"/>
        <updated>2024-12-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Docusaurus를 사용하여 개인 블로그를 만드는 방법을 소개합니다. 기본 설치부터 블로그 전용 모드 설정, 다국어(i18n) 지원, SEO 최적화, Google Analytics 및 Adsense 연동, 마이그레이션 방법, 배포(CI/CD)까지 모든 과정을 정리했습니다. Docusaurus의 강력한 기능을 활용하여 나만의 블로그를 간단히 구축하세요!]]></summary>
        <content type="html"><![CDATA[<p>그동안 Jekyll을 사용하다가 우연히 Docusaurus를 접하고 즉시 마음이 끌려 전환을 결심했습니다.</p>
<p>기본적으로 깔끔한 UI, 강력한 코드 블록 기능, 활발한 커뮤니티, 다양한 플러그인, 그리고 Meta(Facebook) 백그라운드 등이 갈아타게 된 이유가 되었습니다.</p>
<p>기본적인 설치부터 저의 개인적인 수요로 했던 기본적인 작업들을 간단히 정리해보았습니다.</p>
<p>Docusaurus의 <a href="https://docusaurus.io/docs" target="_blank" rel="noopener noreferrer">공식 문서</a>는 잘 정리되어 있습니다만, 기본적인 setup을 끝내고 나한테 필요한 기능이 무엇인지를 알아가면서 공식 문서를 찾아보길 추천드립니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="docusaurus-소개">Docusaurus 소개<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#docusaurus-%EC%86%8C%EA%B0%9C" class="hash-link" aria-label="Docusaurus 소개에 대한 직접 링크" title="Docusaurus 소개에 대한 직접 링크">​</a></h3>
<p>Docusaurus는  React, MDX기반으로 된 정적사이트 생성 플랫폼으로 현재 Meta에서 유지보수중인 오픈소스 솔류션입니다. 주로 문서화 사이트를 쉽고 빠르게 만들수 있도록 설계되었습니다.</p>
<ul>
<li>Docs와 Blog 기능: 강력한 문서화 기능을 제공하며, 블로그 외에도 다양한 유형의 사이트를 손쉽게 생성할 수 있습니다.</li>
<li>MDX 기반: Markdown 문법과 React 컴포넌트를 결합하여 확장성 있는 콘텐츠 작성이 가능합니다.</li>
<li>i18n 지원: 다국어 사이트를 손쉽게 구현할 수 있음.</li>
<li>SEO 친화적: sitemap, meta 태그 등의 자동 생성.</li>
<li>Code blocks: 강력한 <code>Syntax highlighting</code> 기능 제공</li>
<li>배포 편이성: Vercel, GitHub Pages등 다양한 플랫폼에 간편하게 배포가능.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="설치">설치<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#%EC%84%A4%EC%B9%98" class="hash-link" aria-label="설치에 대한 직접 링크" title="설치에 대한 직접 링크">​</a></h3>
<p><a href="https://nodejs.org/en/download/package-manager" target="_blank" rel="noopener noreferrer">Node.js</a> (ver &gt;= 18.0) 설치후 아래와 같은 명령어로 새로운 Docusaurus 프로젝트를 생성합니다.</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"># 현시점 기준 최신버전: v3.6.3</span><span class="token plain"></span><br></span><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><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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">cd my-site</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">npm run start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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://localhost:3000/" target="_blank" rel="noopener noreferrer"><code>http://localhost:3000</code></a> 접속후  아래와 같은 화면을 보게됩니다.
<img decoding="async" loading="lazy" alt="Docusaurus" src="https://www.geuni.tech/assets/images/create-docusaurus-9452b43be60f63e9b8b308533cffe3f5.webp" width="3072" height="1668" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="blog-only-모드">Blog-only 모드<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#blog-only-%EB%AA%A8%EB%93%9C" class="hash-link" aria-label="Blog-only 모드에 대한 직접 링크" title="Blog-only 모드에 대한 직접 링크">​</a></h3>
<p>별도의 랜딩 페이지가 필요 없이 index페이지에 바로 블로그 노출을 원하시는 분들은 아래와 같이 간단한 변경을 하시면 됩니다.</p>
<p>일단 <code>./src/pages/index.{js,tsx}</code> 파일은 삭제하여 동일 route에 여러개 파일이 매핑되는걸 방지합니다.</p>
<p>다음 <code>docusaurus.config.ts</code>에서 blog의 <code>routeBasePath</code>를 <code>/blog</code> 에서 <code>/</code>로 변경:</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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="다국어i18n-설정">다국어(i18n) 설정<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#%EB%8B%A4%EA%B5%AD%EC%96%B4i18n-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="다국어(i18n) 설정에 대한 직접 링크" title="다국어(i18n) 설정에 대한 직접 링크">​</a></h3>
<p>요즘은 ChatGPT와 같은 툴을 활용하여 다국어 블로그를 운영하기가 훨씬 수월해졌습니다.</p>
<p>Docusaurus는 기본적으로 i18n기능을 지원하며 간단한 설정으로 언어추가가 가능합니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-다국어-옵션-추가">1. 다국어 옵션 추가<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#1-%EB%8B%A4%EA%B5%AD%EC%96%B4-%EC%98%B5%EC%85%98-%EC%B6%94%EA%B0%80" class="hash-link" aria-label="1. 다국어 옵션 추가에 대한 직접 링크" title="1. 다국어 옵션 추가에 대한 직접 링크">​</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 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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-다국어-파일-생성">2. 다국어 파일 생성<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#2-%EB%8B%A4%EA%B5%AD%EC%96%B4-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="2. 다국어 파일 생성에 대한 직접 링크" title="2. 다국어 파일 생성에 대한 직접 링크">​</a></h4>
<p><code>write-translations</code> 명령어는 기본적으로 설정된 locales에 따라 i18n 디렉토리에 JSON 파일을 생성합니다. 이 파일은 각 언어별로 번역된 콘텐츠를 담고 있으며, 직접 수정을 통해 원하는 언어로 번역할 수 있습니다.</p>
<p><code>classic</code> 테마에는 기본으로 많은 <a href="https://github.com/facebook/docusaurus/tree/main/packages/docusaurus-theme-translations/locales" target="_blank" rel="noopener noreferrer">언어팩</a>이 포함되어 있습니다. <code>write-translations</code> 명령어실행 없이 위에 <code>i18n</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 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"> ko</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 theme-code-block-highlighted-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 theme-code-block-highlighted-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 theme-code-block-highlighted-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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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에서 볼수 있다싶이 5개의 다국어파일이 생성된것을 확인할수 있죠?</p>
<p>필요에 따라 수정해주시면 되는데, blog 기능만 사용할 경우 <code>navbar.json</code>,<code>options.json</code>,<code>footer.json</code> 3개 파일만 수정해주시면 돼요.</p>
<p>기본언어(<code>defaultLocale</code>)로 된 포스트는 <code>/blog</code>에서 작성하시면 되고, 다 작성된 글은 <code>my-site/i18n/[locale]/docusaurus-plugin-content-blog</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">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">│ # /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">│ # plugin옵션에 대한 번역</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-설정">SEO - sitemap 설정<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#seo---sitemap-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="SEO - sitemap 설정에 대한 직접 링크" title="SEO - sitemap 설정에 대한 직접 링크">​</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>해당 기능은 production 모드에서만 활성화됨.</p></div></div>
<p><code>classic</code>기본 탬플렛에는 이미 <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-sitemap" target="_blank" rel="noopener noreferrer">plugin-sitemap</a>이 포함되여 있어, 아래와 같이 <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-sitemap#ex-config" target="_blank" rel="noopener noreferrer">preset옵션</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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>i18n</code> 기능을 사용시 언어별로 별도의 sitemap이 생성되니 꼭 주의하기 바랍니다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="code-blocks">Code blocks<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#code-blocks" class="hash-link" aria-label="Code blocks에 대한 직접 링크" title="Code blocks에 대한 직접 링크">​</a></h3>
<p>Docusaurus로 갈아타게 된데는 막강한 <code>Syntax highlighting</code> 기능도 한목했습니다.</p>
<p>조금 의아했던 점은 Java, Bash같은 자주쓰는 언어도 기본옵션으로 지원되지 않는다는 점.. <a href="https://github.com/FormidableLabs/prism-react-renderer/blob/master/packages/generate-prism-languages/index.ts#L9-L23" target="_blank" rel="noopener noreferrer">지원언어 참고</a></p>
<p>다행히도 아래와 같은 옵션 적용으로 언어를 쉽게 추가할 수 있습니다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>highlight-next-line</code>, <code>highlight-start</code>, <code>highlight-end</code> 등 코멘트를 사용한 <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-연동">Google 연동<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#google-%EC%97%B0%EB%8F%99" class="hash-link" aria-label="Google 연동에 대한 직접 링크" title="Google 연동에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="google-analytics-연동">Google Analytics 연동<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#google-analytics-%EC%97%B0%EB%8F%99" class="hash-link" aria-label="Google Analytics 연동에 대한 직접 링크" title="Google Analytics 연동에 대한 직접 링크">​</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>해당 기능은 production 모드에서만 활성화됨.</p></div></div>
<p>이 또한 기본으로 탑재된 기능으로 <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-google-gtag#ex-config" target="_blank" rel="noopener noreferrer">preset옵션</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-연동">Google Adsense 연동<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#google-adsense-%EC%97%B0%EB%8F%99" class="hash-link" aria-label="Google Adsense 연동에 대한 직접 링크" title="Google Adsense 연동에 대한 직접 링크">​</a></h4>
<p>Google Adsense 연동은 script로딩만 해주면 되는 부분이라 <a href="https://docusaurus.io/docs/api/docusaurus-config#scripts" target="_blank" rel="noopener noreferrer">Docusaurus Scripts</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/creating-a-personal-blog-using-docusaurus#%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98" class="hash-link" aria-label="마이그레이션에 대한 직접 링크" title="마이그레이션에 대한 직접 링크">​</a></h3>
<p>Blog전환을 할때 URL구조도 변하고 하면 broken link가 발생할수 있습니다. 이를 방지하기 위하여 일반적으로 URL 마이그레이션 작업이 필요합니다..이 또한 제일 걱정되는 부분이기도 하죠?</p>
<p>Docusaurus는 <a href="https://docusaurus.io/docs/next/api/plugins/@docusaurus/plugin-content-blog#markdown-front-matter" target="_blank" rel="noopener noreferrer">Markdown front matter</a>의 <code>slug</code> 설정이나 리디렉션 방식으로 URL 마이레이션을 할수 있습니다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="front-matter---slug">Front Matter - <code>slug</code><a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#front-matter---slug" class="hash-link" aria-label="front-matter---slug에 대한 직접 링크" title="front-matter---slug에 대한 직접 링크">​</a></h4>
<p>Docusaurus의 Front Matter에서 <code>slug</code> 속성을 사용하여, 블로그 게시물이나 페이지의 URL을 자유롭게 설정할 수 있습니다.</p>
<p>예를 들어, 아래와 같이 <code>slug</code>값을 주어 <code>/2024/12/24/welcome</code> 형식의 URL을 <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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="리디렉션">리디렉션<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98" class="hash-link" aria-label="리디렉션에 대한 직접 링크" title="리디렉션에 대한 직접 링크">​</a></h4>
<p>URL마이그레이션 할때 리디렉션 방식도 많이들 선택하는 방법중 하나죠. Docusaurus는 리디렉션 기능을 지원은 하나 client단 리디렉션입니다.</p>
<p>경험이 있는 분들은 아시겠지만 SEO 친화적인 리디렉션 방식은 <a href="https://developers.google.com/search/docs/crawling-indexing/301-redirects#serverside" target="_blank" rel="noopener noreferrer">Server-side redirects</a>입니다.</p>
<blockquote>
<p>The following table explains the various ways you can use to set up permanent and temporary redirects, ordered by how likely Google is able to interpret correctly (for example, <strong>a server side redirect has the highest chance of being interpreted correctly by Google</strong>). Choose the redirect type that works for your situation and site:</p>
</blockquote>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="server-side-redirect-추천">Server-side redirect (추천)<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#server-side-redirect-%EC%B6%94%EC%B2%9C" class="hash-link" aria-label="Server-side redirect (추천)에 대한 직접 링크" title="Server-side redirect (추천)에 대한 직접 링크">​</a></h5>
<p>구글검색 같은 경우 서버 사이드 리디렉션을 사용하면 Page rank에 영향이 없다고 하죠.</p>
<p>관련 구글문서: <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>반면, 클라이언트 사이드 리디렉션은 가끔 검색 엔진이 이를 제대로 처리하지 못하거나, 새로 리디렉션된 페이지가 제대로 평가되지 않는 경우가 발생할 수 있습니다.</p>
<p>리디렉션 설정방법은 본이 호스팅 방식에 따라 아래 문서내용 참고바랍니다:</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">구글 문서 참고</a></li>
<li>GitHub Pages: 서버단 리디렉션 지원이 안되는걸로 알고 있음.</li>
</ul>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="client-side-redirect">Client-side redirect<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#client-side-redirect" class="hash-link" aria-label="Client-side redirect에 대한 직접 링크" title="Client-side redirect에 대한 직접 링크">​</a></h5>
<p>서버단 리디렉션을 하기 어려운 조건인 분들이나, SEO에 대해 신경 쓸 필요없는 분들은 가볍게 아래와 같이 <code>@docusaurus/plugin-client-redirects</code> 사용하면 됩니다.</p>
<p><code>@docusaurus/plugin-client-redirects</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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>config 예시:</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="클립��보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="배포cicd">배포(CI/CD)<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#%EB%B0%B0%ED%8F%ACcicd" class="hash-link" aria-label="배포(CI/CD)에 대한 직접 링크" title="배포(CI/CD)에 대한 직접 링크">​</a></h3>
<p>호스팅 관련해서는 Vercel, GitHub Pages, Netlify 등 본인이 익숙한 platform을 선택하면 됩니다.</p>
<p>수년간의 Vercel사용자로 초보자분들께는 <a href="https://vercel.com/" target="_blank" rel="noopener noreferrer">Vercel</a> 이용을 추천드립니다. 대시보드 클릭클릭으로 Gihub 연결/import해주면 CI/CD가 자동으로 구성됩니다.</p>
<p><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="마무리하며">마무리하며<a href="https://www.geuni.tech/creating-a-personal-blog-using-docusaurus#%EB%A7%88%EB%AC%B4%EB%A6%AC%ED%95%98%EB%A9%B0" class="hash-link" aria-label="마무리하며에 대한 직접 링크" title="마무리하며에 대한 직접 링크">​</a></h3>
<p>처음부터 홈페이지 문서를 파다보니 기본적인 setup에서 마이그레이션까지 주말 이틀을 날렷네요.</p>
<p>이번 포스트에서는 개인적으로 사용한 기능들을 간단히 정리해 보았습니다. 필요한 분들께 작은 도움이 되기를 바랍니다.</p>]]></content>
        <category label="Docusaurus" term="Docusaurus"/>
        <category label="Blog" term="Blog"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[RHCE 9 연습/기출문제 (EX294) ]]></title>
        <id>https://www.geuni.tech/linux/rhce_practice</id>
        <link href="https://www.geuni.tech/linux/rhce_practice"/>
        <updated>2024-09-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[RHCE 9 EX294 시험 대비, Ansible 연습 문제, 기출 문제, 해설, YUM, 패키지, 역할, Galaxy, Vault, cron, Red Hat Certified Engineer, RHCE 자격증, RHCE 시험 준비.]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="lab환경구성">Lab환경구성<a href="https://www.geuni.tech/linux/rhce_practice#lab%ED%99%98%EA%B2%BD%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Lab환경구성에 대한 직접 링크" title="Lab환경구성에 대한 직접 링크">​</a></h3>
<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>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-ansible-설치-및-구성">1. Ansible 설치 및 구성<a href="https://www.geuni.tech/linux/rhce_practice#1-ansible-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="1. Ansible 설치 및 구성에 대한 직접 링크" title="1. Ansible 설치 및 구성에 대한 직접 링크">​</a></h3>
<p>제어 노드 <em><strong>control</strong></em>에서 에 Ansible을 다음과 같이 구성하시오.</p>
<ul>
<li>필요한 패키지 설치.</li>
<li><em><strong>/home/greg/ansible/inventory</strong></em>라는 정적 인벤토리 파일을 생성하고 다음과 같이 구성합니다:<!-- -->
<ul>
<li><em><strong>node1</strong></em>은 <em><strong>dev</strong></em> 호스트 그룹의 구성원입니다.</li>
<li><em><strong>node2</strong></em>는 <em><strong>test</strong></em> 호스트 그룹의 구성원입니다.</li>
<li><em><strong>node3</strong></em> 및 <em><strong>node4</strong></em>는 <em><strong>prod</strong></em> 호스트 그룹의 구성원입니다.</li>
<li><em><strong>node5</strong></em>는 <em><strong>balancers</strong></em> 호스트 그룹의 구성원입니다.</li>
<li><em><strong>prod</strong></em> 그룹은 <em><strong>webservers</strong></em> 호스트 그룹의 구성원입니다.</li>
</ul>
</li>
<li>구성 파일 <em><strong>/home/greg/ansible/ansible.cfg</strong></em> 을 생성하고 다음과 같이 구성합니다:<!-- -->
<ul>
<li>호스트 인벤토리 파일은 <em><strong>/home/greg/ansible/inventory</strong></em>입니다.</li>
<li>본 컨텐츠 컬렉션 디렉토리는 <em><strong>/home/greg/ansible/roles</strong></em>입니다.</li>
<li>기본 컨텐츠 컬렉션 디렉토리는 <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 comment" style="color:#999988;font-style:italic"># control노드 접속</span><span class="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"> greg@control</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ansible 패키지 설치</span><span class="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"> 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 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">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"></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">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"></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">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 comment" style="color:#999988;font-style:italic"># inventory파일 생성</span><span class="token plain"></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"></span><span class="token comment" style="color:#999988;font-style:italic"># inventory 확인</span><span class="token plain"></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"></span><span class="token comment" style="color:#999988;font-style:italic"># ping테스트</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>ansible-navigator</strong></em> 사용가능，<em><strong>ansible-navigator</strong></em>사용시 podman 미리 로그인해보도록</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-yum저장소-생성">2. YUM저장소 생성<a href="https://www.geuni.tech/linux/rhce_practice#2-yum%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="2. YUM저장소 생성에 대한 직접 링크" title="2. YUM저장소 생성에 대한 직접 링크">​</a></h3>
<p>시스템 관리자로서 관리 대상 노드에 소프트웨어를 설치해야 합니다.</p>
<p>다음 작업을 수행하는 <em><strong>/home/greg/ansible/yum_repo.yml</strong></em> 플레이북을 생성하세요. 각 관리되는 노드에 다음 yum 저장소를 만듭니다.</p>
<ul>
<li>
<p><strong>저장소 1 구성</strong>:</p>
<ul>
<li>이름: <em><strong>EX294_BASE</strong></em></li>
<li>설명: <em><strong>EX294 base software</strong></em></li>
<li>기본 URL: <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 서명 확인: 활성화</li>
<li>GPG 키 URL: <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>저장소 상태: 활성화</li>
</ul>
</li>
<li>
<p><strong>저장소 2 구성</strong>:</p>
<ul>
<li>이름: <em><strong>EX294_STREAM</strong></em></li>
<li>설명: <em><strong>EX294 stream software</strong></em></li>
<li>기본 URL: <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 서명 확인: 활성화</li>
<li>GPG 키 URL: <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>저장소 상태: 활성화</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 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">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"></span><span class="token comment" style="color:#999988;font-style:italic"># doc</span><span class="token plain"></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 comment" style="color:#999988;font-style:italic"># playbook</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhce_practice#3%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="3.패키지 설치에 대한 직접 링크" title="3.패키지 설치에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 따라 <em><strong>/home/greg/ansible/packages.yml</strong></em> 플레이북을 생성하고 관리 대상 노드에 소프트웨어 패키지를 설치하세요.</p>
<ul>
<li><em><strong>php</strong></em>와 <em><strong>mariadb</strong></em> 패키지를 <em><strong>dev</strong></em>, <em><strong>test</strong></em>, <em><strong>prod</strong></em> 호스트 그룹의 노드에 설치합니다.</li>
<li><em><strong>RPM Development Tools</strong></em> 패키지 그룹을 <em><strong>dev</strong></em> 호스트 그룹의 노드에 설치합니다.</li>
<li><em><strong>dev</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"># doc</span><span class="token plain"></span><br></span><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 comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="4rhel-시스템-역할role-사용하기">4.RHEL 시스템 역할(ROLE) 사용하기<a href="https://www.geuni.tech/linux/rhce_practice#4rhel-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%97%AD%ED%95%A0role-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0" class="hash-link" aria-label="4.RHEL 시스템 역할(ROLE) 사용하기에 대한 직접 링크" title="4.RHEL 시스템 역할(ROLE) 사용하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항을 충족하는 <em><strong>/home/greg/ansible/selinux.yml</strong></em> 플레이북을 작성하세요:</p>
<ul>
<li><em><strong>모든 관리 대상 노드</strong></em>에서 실행됩니다.</li>
<li><em><strong>selinux role</strong></em>을 사용합니다.</li>
<li>SElinux 정책을 <em><strong>targeted</strong></em>으로 구성합니다.</li>
<li>SElinux 상태를 <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 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">yum search role</span><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"> 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"></span><span class="token comment" style="color:#999988;font-style:italic"># 사용 가능한 system roles 확인</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"></span><span class="token comment" style="color:#999988;font-style:italic"># 예제 playbook 가져다 편집하여 사용하는게 편함</span><span class="token plain"></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"># 행 번호 표시 및 필요 없는 내용 삭제 (버전에 따라 행 번호가 다를 수 있으므로 직접 확인 후 삭제하도록)</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</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"># rpm 패키지로 설치된 역할은 ansible-playbook으로 실행, collection으로 설치된 역할은 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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="5collection-설치">5.Collection 설치<a href="https://www.geuni.tech/linux/rhce_practice#5collection-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="5.Collection 설치에 대한 직접 링크" title="5.Collection 설치에 대한 직접 링크">​</a></h3>
<ul>
<li>다음 컬렉션 아티팩트를 <em><strong><a href="http://classroom/materials/" target="_blank" rel="noopener noreferrer">http://classroom/materials/</a></strong></em> 에서 가져와 <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>컬렉션은 기본 컬렉션 디렉토리인 <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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="�클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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">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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-ansible-galaxy를-사용하여-역할-설치하기">6. Ansible Galaxy를 사용하여 역할 설치하기<a href="https://www.geuni.tech/linux/rhce_practice#6-ansible-galaxy%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%97%AD%ED%95%A0-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0" class="hash-link" aria-label="6. Ansible Galaxy를 사용하여 역할 설치하기에 대한 직접 링크" title="6. Ansible Galaxy를 사용하여 역할 설치하기에 대한 직접 링크">​</a></h3>
<p><em><strong>Ansible Galaxy</strong></em>와 요구사항 파일 (<em><strong>/home/greg/ansible/roles/requirements.yml</strong></em>)을 사용하여 다음 URL에서 역할을 다운로드하고 <em><strong>/home/greg/ansible/roles</strong></em> 디렉토리에 설치하세요:</p>
<ul>
<li>URL: <em><strong><a href="http://classroom/materials/haproxy.tar" target="_blank" rel="noopener noreferrer">http://classroom/materials/haproxy.tar</a></strong></em>, 이 역할의 이름은 <em><strong>balancer</strong></em>여야 합니다.</li>
<li>URL: <em><strong><a href="http://classroom/materials/phpinfo.tar" target="_blank" rel="noopener noreferrer">http://classroom/materials/phpinfo.tar</a></strong></em>, 이 역할의 이름은 <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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># install</span><span class="token plain"></span><br></span><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"></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">ansible-galaxy list</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="7role-생성-및-사용하기">7.ROLE 생성 및 사용하기<a href="https://www.geuni.tech/linux/rhce_practice#7role-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0" class="hash-link" aria-label="7.ROLE 생성 및 사용하기에 대한 직접 링크" title="7.ROLE 생성 및 사용하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 <em><strong>/home/greg/ansible/roles</strong></em> 디렉토리에 <em><strong>apache</strong></em>라는 역할을 생성하고 아래 조건을 만족해야 합니다:</p>
<ul>
<li><strong>httpd</strong> 소프트웨어 패키지가 설치되고, 시스템 시작 시 <strong>활성화</strong> 및 <strong>시작</strong> 상태여야 합니다.</li>
<li><strong>방화벽</strong>이 활성화되어 실행 중이어야 하며, 웹 서버 접근을 허용하는 규칙을 사용해야 합니다.</li>
<li><strong>index.html.j2</strong> 템플릿 파일이 존재하며, 이 파일을 사용해 다음과 같은 출력 파일을 생성해야 합니다:<!-- -->
<ul>
<li><em><strong>/var/www/html/index.html</strong></em> :<br>
<em>Welcome to HOSTNAME on IPADDRESS</em><br>
<!-- -->여기서, <em><strong>HOSTNAME</strong></em>은 관리 대상 노드의 완전한 도메인 이름(FQDN)이고, <em><strong>IPADDRESS</strong></em>는 관리 대상 노드의 IP 주소입니다.</li>
</ul>
</li>
</ul>
<p><em><strong>/home/greg/ansible/apache.yml</strong></em>라는 이름의 플레이북을 생성합니다:</p>
<ul>
<li>이 플레이북은 <em><strong>webservers</strong></em> 호스트 그룹의 노드에서 실행되며, <em><strong>apache</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"># apache role 생성</span><span class="token plain"></span><br></span><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 comment" style="color:#999988;font-style:italic"># task작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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" style="display:inline-block"></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 comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="8ansible-galaxy에서-role-사용하기">8.Ansible Galaxy에서 ROLE 사용하기<a href="https://www.geuni.tech/linux/rhce_practice#8ansible-galaxy%EC%97%90%EC%84%9C-role-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0" class="hash-link" aria-label="8.Ansible Galaxy에서 ROLE 사용하기에 대한 직접 링크" title="8.Ansible Galaxy에서 ROLE 사용하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 <em><strong>/home/greg/ansible/roles.yml</strong></em> 플레이북을 생성하세요:</p>
<ul>
<li>
<p><em><strong>playbook</strong></em>에 하나의 플레이가 포함되어야 하며, 이 플레이는 <em><strong>balancers</strong></em> 호스트 그룹의 노드에서 실행되며 <em><strong>balancer</strong></em> 역할을 사용합니다.</p>
<ul>
<li>이 역할은 <em><strong>webservers</strong></em> 호스트 그룹의 노드 간에 웹 서버 요청의 부하를 균형 맞추는 서비스를 구성합니다.</li>
<li><em><strong>balancers</strong></em> 호스트 그룹의 노드(예: ***<a href="http://172.25.250.xn--13***)-uw20a/" target="_blank" rel="noopener noreferrer">http://172.25.250.13***)에</a> 접속하면 아래와 같은 출력이 생성됩니다:<br>
<em><strong>Welcome to node3.lab.example.com on 172.25.250.11</strong></em></li>
<li>브라우저를 새로 고침하면 다른 웹 서버에서 아래와 같은 출력이 생성됩니다:<br>
<em><strong>Welcome to node4.lab.example.com on 172.25.250.12</strong></em></li>
</ul>
</li>
<li>
<p><em><strong>playbook</strong></em>에 또 다른 플레이가 포함되어야 하며, 이 플레이는 <em><strong>webservers</strong></em> 호스트 그룹의 노드에서 실행되며 <em><strong>phpinfo</strong></em> 역할을 사용합니다.</p>
<ul>
<li><em><strong>webservers</strong></em> 호스트 그룹의 노드에서 <em><strong>/hello.php</strong></em> URL로 접속하면 아래와 같은 출력이 생성됩니다: <br>
<em><strong>Hello PHP World from FQDN</strong></em>
<ul>
<li>여기서 <em><strong>FQDN</strong></em>은 해당 노드의 완전한 도메인 이름입니다.</li>
<li>예시 출력:<br>
<em><strong>Hello PHP World from node3.lab.example.com</strong></em><br>
<!-- -->또한 설치된 PHP 버전 등 PHP 구성의 다양한 세부 정보도 표시됩니다.</li>
</ul>
</li>
</ul>
</li>
<li>
<p>***<a href="http://172.25.250.12/hello.php***%EB%A1%9C" target="_blank" rel="noopener noreferrer">http://172.25.250.12/hello.php***로</a> 접속하면 아래와 같은 출력이 생성됩니다:<br>
<em><strong>Hello PHP World from node4.lab.example.com</strong></em><br>
<!-- -->또한 PHP 구성의 다양한 세부 정보도 표시됩니다.</p>
</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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"> 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-logical-volume-생성-및-사용">9. Logical Volume 생성 및 사용<a href="https://www.geuni.tech/linux/rhce_practice#9-logical-volume-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%82%AC%EC%9A%A9" class="hash-link" aria-label="9. Logical Volume 생성 및 사용에 대한 직접 링크" title="9. Logical Volume 생성 및 사용에 대한 직접 링크">​</a></h3>
<p>다음 작업을 실행하는 <em><strong>/home/greg/ansible/lv.yml</strong></em>라는 <em><strong>playbook</strong></em>을 생성하세요. 이 플레이북은 <strong>모든 관리 대상 노드</strong>에서 실행됩니다:</p>
<ul>
<li>다음 요구 사항을 충족하는 논리 볼륨을 생성합니다:<!-- -->
<ul>
<li>논리 볼륨은 <em><strong>research</strong></em> 볼륨 그룹에 생성됩니다.</li>
<li>논리 볼륨 이름은 <em><strong>data</strong></em>입니다.</li>
<li>논리 볼륨 크기는 <em><strong>1500 MiB</strong></em>입니다.</li>
</ul>
</li>
<li><em><strong>ext4</strong></em> 파일 시스템으로 논리 볼륨을 포맷합니다.</li>
<li>요청한 논리 볼륨 크기를 생성할 수 없을 경우, 오류 메시지를 표시하고 대신 크기를 <em><strong>800 MiB</strong></em>로 사용합니다. <br>
<em><strong>Could not create logical volume of that size</strong></em></li>
<li>만약 볼륨 그룹 <em><strong>research</strong></em>가 존재하지 않으면 오류 메시지를 표시합니다: <br>
<em><strong>Volume group does not exist</strong></em></li>
<li>논리 볼륨은 어떤 방법으로도 마운트하지 않습니다.</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"># doc</span><span class="token plain"></span><br></span><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"></span><span class="token comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"># 예상대로 흘러가는지 실행과정 확인하도록</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확인</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， VG가용공간 부족으로 800M LV생성</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， VG찾을수 없어 LV생성 실패</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"># 파일시스템 확인</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="10hosts-파일-생성">10.hosts 파일 생성<a href="https://www.geuni.tech/linux/rhce_practice#10hosts-%ED%8C%8C%EC%9D%BC-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="10.hosts 파일 생성에 대한 직접 링크" title="10.hosts 파일 생성에 대한 직접 링크">​</a></h3>
<ul>
<li>초기 템플릿 파일을 <em><strong><a href="http://classroom/materials/hosts.j2" target="_blank" rel="noopener noreferrer">http://classroom/materials/hosts.j2</a></strong></em> 에서 다운로드하여 <em><strong>/home/greg/ansible</strong></em>에 저장합니다.</li>
<li>이 템플릿을 완성하여 각 호스트에 대해 <em><strong>/etc/hosts</strong></em>와 동일한 형식의 파일을 생성합니다.</li>
<li><em><strong><a href="http://classroom/materials/hosts.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/hosts.yml</a></strong></em> 에서 플레이북을 다운로드하여 <em><strong>/home/greg/ansible</strong></em>에 저장합니다. 이 플레이북은 이 템플릿을 사용하여 <em><strong>dev</strong></em> 호스트 그룹의 호스트에서 <em><strong>/etc/myhosts</strong></em> 파일을 생성합니다.</li>
</ul>
<p>이 플레이북이 실행된 후, <em><strong>dev</strong></em> 호스트 그룹에 있는 호스트의 <em><strong>/etc/myhosts</strong></em> 파일은 각 관리 대상 호스트에 대해 라인을 포함해야 합니다:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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">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 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">vim</span><span class="token plain"> hosts.j2</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhce_practice#11-%ED%8C%8C%EC%9D%BC-%EB%82%B4%EC%9A%A9-%EC%88%98%EC%A0%95%ED%95%98%EA%B8%B0" class="hash-link" aria-label="11. 파일 내용 수정하기에 대한 직접 링크" title="11. 파일 내용 수정하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 따라 <em><strong>/home/greg/ansible/issue.yml</strong></em> 플레이북을 생성하세요:</p>
<ul>
<li>이 플레이북은 <em><strong>인벤토리 호스트 전체</strong></em>에서 실행됩니다.</li>
<li>이 플레이북은 <em><strong>/etc/issue</strong></em> 파일의 내용을 아래와 같은 텍스트로 교체합니다:<!-- -->
<ul>
<li><em><strong>dev</strong></em> 호스트 그룹의 호스트에서는 텍스트가 <em><strong>Development</strong></em>로 표시됩니다.</li>
<li><em><strong>test</strong></em> 호스트 그룹의 호스트에서는 텍스트가 <em><strong>Test</strong></em>로 표시됩니다.</li>
<li><em><strong>prod</strong></em> 호스트 그룹의 호스트에서는 텍스트가 <em><strong>Production</strong></em>으로 표시됩니다.</li>
<li></li>
</ul>
</li>
</ul>
<p>이 플레이북은 인벤토리 호스트 전체에서 실행됩니다.</p>
<p>□ 이 플레이북은 /etc/issue 파일의 내용을 다음과 같이 변경합니다:</p>
<p>□ dev 호스트 그룹의 호스트에서는 다음과 같이 변경됩니다: Development</p>
<p>□ test 호스트 그룹의 호스트에서는 다음과 같이 변경됩니다: Test</p>
<p>□ prod 호스트 그룹의 호스트에서는 다음과 같이 변경됩니다: Production</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"># doc</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">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"></span><span class="token comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhce_practice#12-%EC%9B%B9-%EC%BD%98%ED%85%90%EC%B8%A0-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="12. 웹 콘텐츠 디렉토리 생성하기에 대한 직접 링크" title="12. 웹 콘텐츠 디렉토리 생성하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 <em><strong>/home/greg/ansible/webcontent.yml</strong></em> 플레이북을 생성하세요:</p>
<ol>
<li>이 플레이북은 <em><strong>dev</strong></em> 호스트 그룹의 관리 대상 노드에서 실행됩니다.</li>
<li>아래 요구 사항에 맞는 디렉토리 <em><strong>/webdev</strong></em>를 생성합니다:<!-- -->
<ul>
<li>소유자는 <em><strong>webdev</strong></em> 그룹입니다.</li>
<li>일반 권한은 다음과 같습니다:<!-- -->
<ul>
<li><em><strong>owner=read+write+execute</strong></em></li>
<li><em><strong>group=read+write+execute</strong></em></li>
<li><em><strong>other=read+execute</strong></em></li>
</ul>
</li>
<li>특수 권한: 그룹 ID 설정.</li>
</ul>
</li>
<li><em><strong>/var/www/html/webdev</strong></em>를 <em><strong>/webdev</strong></em>로 심볼릭 링크를 만듭니다.</li>
<li><em><strong>/webdev/index.html</strong></em> 파일을 생성하고, 그 안에 다음과 같은 단일 행의 텍스트를 넣습니다:<br>
<em><strong>Development</strong></em></li>
<li><em><strong>dev</strong></em> 호스트 그룹의 노드에서 이 디렉토리(예: <a href="http://172.25.250.9/webdev/)%EB%A5%BC" target="_blank" rel="noopener noreferrer">http://172.25.250.9/webdev/)를</a> 접속하면 ***"Development"***가 출력되어야 합니다:</li>
</ol>
<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"># doc</span><span class="token plain"></span><br></span><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"></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">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"></span><span class="token comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-하드웨어-보고서-생성하기">13. 하드웨어 보고서 생성하기<a href="https://www.geuni.tech/linux/rhce_practice#13-%ED%95%98%EB%93%9C%EC%9B%A8%EC%96%B4-%EB%B3%B4%EA%B3%A0%EC%84%9C-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="13. 하드웨어 보고서 생성하기에 대한 직접 링크" title="13. 하드웨어 보고서 생성하기에 대한 직접 링크">​</a></h3>
<p><em><strong>/home/greg/ansible/hwreport.yml</strong></em>라는 이름의 플레이북을 생성하여, 모든 관리 대상 노드에서 다음 정보를 포함하는 출력 파일 <em><strong>/root/hwreport.txt</strong></em>를 생성하세요:</p>
<ul>
<li><em><strong>인벤토리 호스트명</strong></em>;</li>
<li><em><strong>총 메모리 크기(MB)</strong></em>;</li>
<li><em><strong>BIOS</strong></em> 버전;</li>
<li>디스크 장치 <em><strong>vda</strong></em> 크기;</li>
<li>디스크 장치 <em><strong>vdb</strong></em> 크기;</li>
<li>출력 파일의 각 행은 <em><strong>key=value</strong></em> 쌍을 포함해야 합니다.</li>
</ul>
<p>플레이북은 다음과 같이 수행되어야 합니다:</p>
<ul>
<li>***<a href="http://classroom/materials/hwreport.empty***%EC%97%90%EC%84%9C" target="_blank" rel="noopener noreferrer">http://classroom/materials/hwreport.empty***에서</a> 파일을 다운로드하고 이를 <strong>/root/hwreport.txt</strong>에 저장합니다.</li>
<li><em><strong>정확한 값</strong></em>을 사용하여 <strong>/root/hwreport.txt</strong>를 업데이트합니다.</li>
<li>하드웨어 항목이 없으면 해당 값은 <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 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">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 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"> http://materials/hwreport.empty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-비밀번호-저장소-생성하기">14. 비밀번호 저장소 생성하기<a href="https://www.geuni.tech/linux/rhce_practice#14-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="14. 비밀번호 저장소 생성하기에 대한 직접 링크" title="14. 비밀번호 저장소 생성하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 Ansible 저장소를 생성하여 사용자 비밀번호를 저장하세요:</p>
<ul>
<li>저장소 이름은 <em><strong>/home/greg/ansible/locker.yml</strong></em>입니다.</li>
<li>저장소에는 아래와 같이 두 개의 변수가 포함됨니다<!-- -->
<ul>
<li><em><strong>pw_developer</strong></em>, 값은 <em><strong>Imadev</strong></em></li>
<li><em><strong>pw_manager</strong></em>, 값은 <em><strong>Imamgr</strong></em></li>
</ul>
</li>
<li>이 저장소를 암호화하고 해독하는 비밀번호는 <em>whenyouwishuponastar</em>입니다.</li>
<li>비밀번호는 <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 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"> </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 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">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"></span><span class="token comment" style="color:#999988;font-style:italic"># vault생성</span><span class="token plain"></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 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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-사용자-계정-생성하기">15. 사용자 계정 생성하기<a href="https://www.geuni.tech/linux/rhce_practice#15-%EC%82%AC%EC%9A%A9%EC%9E%90-%EA%B3%84%EC%A0%95-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="15. 사용자 계정 생성하기에 대한 직접 링크" title="15. 사용자 계정 생성하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 사용자 계정을 생성하는 작업을 수행하세요:</p>
<ul>
<li>
<p>***<a href="http://classroom/materials/user_list.yml***%EC%97%90%EC%84%9C" target="_blank" rel="noopener noreferrer">http://classroom/materials/user_list.yml***에서</a> 사용자 목록을 다운로드하고 이를 <em><strong>/home/greg/ansible</strong></em>에 저장합니다.</p>
</li>
<li>
<p>이 실습에서는 다른 위치에서 생성된 비밀번호 저장소 <em><strong>/home/greg/ansible/locker.yml</strong></em>을 사용합니다. <em><strong>/home/greg/ansible/users.yml</strong></em>라는 이름의 플레이북을 생성하여, 아래 조건에 맞게 사용자 계정을 생성합니다:</p>
<ul>
<li>
<p>직무 설명이 <em><strong>developer</strong></em>인 사용자는:</p>
<ul>
<li><em><strong>dev</strong></em>와 <em><strong>test</strong></em> 호스트 그룹의 관리 대상 노드에서 생성됩니다.</li>
<li><em><strong>pw_developer</strong></em> 변수에서 비밀번호를 할당받습니다.</li>
<li>비밀번호 최대 유효 기간은 <em><strong>30</strong></em>일입니다.</li>
<li>보조 그룹 <em><strong>devops</strong></em>의 멤버입니다.</li>
</ul>
</li>
<li>
<p>직무 설명이 <em><strong>manager</strong></em>인 사용자는:</p>
<ul>
<li><em><strong>prod</strong></em> 호스트 그룹의 관리 대상 노드에서 생성됩니다.</li>
<li><em><strong>pw_manager</strong></em> 변수에서 비밀번호를 할당받습니다.</li>
<li>비밀번호 최대 유효 기간은 <em><strong>30</strong></em>일입니다.</li>
<li>보조 그룹 <em><strong>opsmgr</strong></em>의 멤버입니다.</li>
</ul>
</li>
</ul>
</li>
<li>
<p>비밀번호는 <em><strong>SHA512</strong></em> 해시 형식으로 저장됩니다.</p>
</li>
<li>
<p>이 플레이북은 다른 위치에서 생성된 비밀번호 파일 <em><strong>/home/greg/ansible/secret.txt</strong></em>을 사용하여 정상적으로 실행될 수 있어야 합니다.</p>
</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">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 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">cat</span><span class="token plain"> user_list.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"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-ansible-vault-키-업데이트">16. Ansible Vault 키 업데이트<a href="https://www.geuni.tech/linux/rhce_practice#16-ansible-vault-%ED%82%A4-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8" class="hash-link" aria-label="16. Ansible Vault 키 업데이트에 대한 직접 링크" title="16. Ansible Vault 키 업데이트에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 기존 Ansible Vault 키를 업데이트하세요:</p>
<ul>
<li>***<a href="http://classroom/materials/salaries.yml***%EC%97%90%EC%84%9C" target="_blank" rel="noopener noreferrer">http://classroom/materials/salaries.yml***에서</a> Ansible Vault을 다운로드하고 <em><strong>/home/greg/ansible</strong></em>에 저장합니다.</li>
<li>현재 Vault 비밀번호는 <em><strong>insecure8sure</strong></em>입니다.</li>
<li>새로운 Vault 비밀번호는 <em><strong>bbs2you9527</strong></em>입니다.</li>
<li>Vault은 <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"># vault파일 다운</span><span class="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"> http://classroom/materials/salaries.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"># 비밀번호 변경</span><span class="token plain"></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"></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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-cron-작업-설정하기">17. cron 작업 설정하기<a href="https://www.geuni.tech/linux/rhce_practice#17-cron-%EC%9E%91%EC%97%85-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0" class="hash-link" aria-label="17. cron 작업 설정하기에 대한 직접 링크" title="17. cron 작업 설정하기에 대한 직접 링크">​</a></h3>
<p>다음 요구 사항에 맞춰 <em><strong>/home/greg/ansible/cron.yml</strong></em> 플레이북을 생성하세요:</p>
<ul>
<li>이 플레이북은 <em><strong>test</strong></em> 호스트 그룹의 관리 대상 노드에서 실행됩니다.</li>
<li><em><strong>cron</strong></em> 작업을 구성하여, 이 작업이 <em><strong>2분마다</strong></em> 실행되도록 설정하고, 다음 명령을 실행합니다:
<em>logger "EX200 in progress</em></li>
<li>이 작업은 <em><strong>natasha</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"># doc</span><span class="token plain"></span><br></span><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"></span><span class="token comment" style="color:#999988;font-style:italic"># playbook작성</span><span class="token plain"></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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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"># playbook실행</span><span class="token plain"></span><br></span><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"></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">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><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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Linux" term="Linux"/>
        <category label="RHCE" term="RHCE"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[RHCSA 9 연습/기출문제 (EX200)]]></title>
        <id>https://www.geuni.tech/linux/rhcsa_practice</id>
        <link href="https://www.geuni.tech/linux/rhcsa_practice"/>
        <updated>2024-09-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[RHCSA 9 (EX200) 시험 대비를 위한 완벽 가이드! 네트워크 설정, YUM, SELinux, LVM, podman, systemd 등 핵심 주제별 연습 문제 및 상세 해설 제공. rd.break를 이용한 root 비밀번호 복구 방법까지 완벽 정리]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1네트웍-설정">1、네트웍 설정<a href="https://www.geuni.tech/linux/rhcsa_practice#1%EB%84%A4%ED%8A%B8%EC%9B%8D-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="1、네트웍 설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#2yum-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%84%A4%EC%A0%95" class="hash-link" aria-label="2、Yum 저장소 설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#3-debug-selinux" class="hash-link" aria-label="3. Debug SELinux에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="4. 사용자 계정 관리에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#5-cron-job%EC%84%A4%EC%A0%95" class="hash-link" aria-label="5. cron job설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="6. 협력 디렉토리 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#7-ntp%EC%84%A4%EC%A0%95" class="hash-link" aria-label="7. NTP설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#8-autofs%EC%84%A4%EC%A0%95" class="hash-link" aria-label="8. autofs설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#9-%EA%B3%84%EC%A0%95-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="9. 계정 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#10-%ED%8C%8C%EC%9D%BC-%EC%B0%BE%EA%B8%B0-find" class="hash-link" aria-label="10. 파일 찾기 (find)에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="11. 문자열 찾기 (grep)에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="12. 아카이브 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#13-podman---build" class="hash-link" aria-label="13. podman - build에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#14-podman---container%EB%A5%BC-systemd%EB%A1%9C-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="14. podman - container를 systemd로 구성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#15-sudo%EC%84%A4%EC%A0%95" class="hash-link" aria-label="15. sudo설정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#16-root%EB%B9%84%EB%B2%88-%EC%84%A4%EC%A0%95-rdbreakinitbinbash" class="hash-link" aria-label="16. root비번 설정 (rd.break，init=/bin/bash)에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="17. Yum 저장소 설정에 대한 직접 링크" title="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/linux/rhcsa_practice#18-lvm---lvextend" class="hash-link" aria-label="18. LVM - lvextend에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#19-swap-partition" class="hash-link" aria-label="19. Swap partition에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#20--lvm---lvcreate" class="hash-link" aria-label="20.  LVM - lvcreate에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/linux/rhcsa_practice#21--tuned" class="hash-link" aria-label="21.  tuned에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Linux" term="Linux"/>
        <category label="RHCSA" term="RHCSA"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Keepalived & HAProxy를 이용한 Nginx H/A, Load Balancing환경 구성하기]]></title>
        <id>https://www.geuni.tech/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy</id>
        <link href="https://www.geuni.tech/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy"/>
        <updated>2024-05-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Keepalived와 HAProxy를 이용한 Nginx 고가용성 및 로드 밸런싱 환경 구축 방법을 단계별로 자세히 설명합니다.]]></summary>
        <content type="html"><![CDATA[<p>본 포스트에서는 Keepalived + HAproxy의 조합을 사용하여 Nginx의 고가용성 부하 분산 아키텍처를 구축하는 방법을 설명합니다.</p>
<p>먼저 Keepalived 또는 HAProxy를 단독으로 사용할 때의 문제점과 한계를 살펴 보겠습니다.</p>
<p><strong>1. Nginx + Keepalived :</strong></p>
<p>이 구성은 Active-Passive(Standby) 형태로 작동합니다. 주요 특징은 다음과 같습니다:</p>
<ul>
<li>장애 발생 시 Standby 노드로 자동 전환하여 고가용성을 보장할수 있음.</li>
<li>Standby 노드가 항상 가동 상태를 유지해하므로, 리소스 효율이 낮음.</li>
<li>높은 트래픽 환경에서는 단일 노드가 병목 현상을 유발할 수 있음.</li>
</ul>
<p>결론적으로, Active-Active 구성으로 확장하는 것이 리소스 활용 및 성능 면에서 더 효율적입니다.</p>
<p><strong>2. Nginx + HAProxy :</strong></p>
<p>이 구성은 트래픽 부하 분산 및 확장성 측면에서 효과적이지만, HAProxy가 단일 장애 지점(SPOF, Single Point of Failure)으로 작용할 수 있어, 장애 발생 시 전체 서비스가 중단될 위험이 있습니다.</p>
<p><strong>3. Nginx + Keepalived + HAProxy :</strong></p>
<p>고가용성과 확장성을 모두 갖춘 이상적인 구성으로 높은 트래픽 처리와 안정적인 서비스 제공이 필요한 환경에 적합합니다.</p>
<ul>
<li>Active-Active 구성을 통해 트래픽 처리 용량을 극대화할 수 있음.</li>
<li>Keepalived가 HAProxy의 가용성을 관리해 단일 장애 지점 문제를 해결할수 있음.</li>
</ul>
<p>기능 이해를 돕기 위하여 두 스텝으로 나누어 아키텍처 구성을 해보겠습니다.</p>
<ul>
<li>1단계: Nginx + Keepalived로 Active-Passive 구성</li>
<li>2단계: HAProxy를 추가하여 Active-Active 구성</li>
</ul>
<p><strong>설치환경</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="keepalived를-이용한-active-passive환경-구성하기">Keepalived를 이용한 Active-passive환경 구성하기<a href="https://www.geuni.tech/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#keepalived%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-active-passive%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Keepalived를 이용한 Active-passive환경 구성하기에 대한 직접 링크" title="Keepalived를 이용한 Active-passive환경 구성하기에 대한 직접 링크">​</a></h3>
<p>1단계에서는 아래와 같은 서버 구성을 만들어보자. 사용자는 VIP를 통하여 nginx에 접속을 하게되며 #1번 서버가 장애발생시 VIP가 #2번 서버로 넘어가는 구조다.</p>
<img src="https://www.geuni.tech/img/post/image-20240508165429517.png" alt="Nginx high availability through Keepalived" style="zoom:60%">
<p><strong>설치</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>두대의 서버에서 각각  아래와 같이 Keepalived 구성파일 <em><strong>keepalived.conf</strong></em> 편집</p>
<p><strong>#1번 서버</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 running여부 체크 스크립트</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"># instance 초기화 상태 (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"># 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"># 가상 라우터ID (0-255)，tcpdump vrrp명령을 통하여 확인가능(vrid)</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"># 우선순위, MASTER노드의 값은 BACKUP노드보다 크게 설정</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패킷 송신간격(단위:초)</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"># BACKUP state에서만 먹히는 옵션으로 （NOTE: For this to work, the initial state must not be 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"># priority가 높은 node가 VIP를 자동으로 빼았기를 원하지 않을떄 모든 instance상태를 BACKUP으로 설정후 해당옵션 적용하면 됨.</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"># 본인IP</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"># 피어노드IP</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"># master, backup 동일값으로 설정</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"># 가상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"># 서비스 점검 스크립트</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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번 서버</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 running여부 체크 스크립트</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"># instance 초기화 상태 (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"># 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"># 가상 라우터ID (0-255)，tcpdump vrrp명령을 통하여 확인가능(vrid)</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"># 우선순위, MASTER노드의 값은 BACKUP노드보다 크게 설정</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패킷 송신간격(단위:초)</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">#  BACKUP state에서만 먹히는 옵션으로 （NOTE: For this to work, the initial state must not be 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"># priority가 높은 node가 VIP를 자동으로 빼았기를 원하지 않을떄 모든 instance상태를 BACKUP으로 설정후 해당옵션 적용하면 됨.</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"># 본인IP</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"># 피어노드IP</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"># master, backup 동일값으로 설정</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"># 가상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"># 서비스 점검 스크립트</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>두대의 서버에서 각각 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
<p>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"> 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>keepalived구동 및 구동상태 체크</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>Keepalived구동후 Master노드에서 VIP확인</p>
<p><strong>#1번 서버(master)</strong></p>
<p>VIP 확인가능</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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번 서버(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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 테스트</strong></p>
<p>Failover테스트를 위하여 master노드의 nginx를 내려보자</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>VIP가 #2번 서버로 넘어간것을 확인할수 있다.</p>
<p><strong>#1번 서버(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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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번 서버(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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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노드의 nginx를 내린후 failover가 정상적으로 수행된것을 확인할수 있다.</p>
<p><img decoding="async" loading="lazy" alt="keepalived_failover" src="https://www.geuni.tech/assets/images/keepalived_failover-89bf8e6ad8b50aeefed2fc0aa3e92a60.gif" width="1944" height="587" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="keepalived--haproxy를-이용한-load-balancing환경active-active-구성하기">Keepalived &amp; HAProxy를 이용한 Load Balancing환경(Active-Active) 구성하기<a href="https://www.geuni.tech/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#keepalived--haproxy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-load-balancing%ED%99%98%EA%B2%BDactive-active-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="Keepalived &amp; HAProxy를 이용한 Load Balancing환경(Active-Active) 구성하기에 대한 직접 링크" title="Keepalived &amp; HAProxy를 이용한 Load Balancing환경(Active-Active) 구성하기에 대한 직접 링크">​</a></h3>
<p>1단계 구성에 HAProxy를 얹어  로드밸런싱 기능을 구현해보자.</p>
<img src="https://www.geuni.tech/img/post/image-20240508162845399.png" alt="High-Availability Nginx Load Balancing with Keepalived and HAProxy" style="zoom:70%">
<p>두대의 서버에 각각 HAProxy설치</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>HAProxy 구성파일 편집:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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">        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">        </span><span class="token comment" style="color:#999988;font-style:italic"># ulimit -n값을 디폴트로 하며 해당값의 제한을 받는다. </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"># 매개의 connection이 32 KB 메모리를 사용한는것으로 생각하고 적절한 수치를 산정, 필요한 메모리를 할당해주자.</span><span class="token plain"></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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># Default SSL material locations</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ca-base /etc/ssl/certs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        crt-base /etc/ssl/private</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># See: https://ssl-config.mozilla.org/#server=haproxy&amp;server-version=2.0.3&amp;config=intermediate</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets</span><br></span><span class="token-line" style="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>load balancing  &amp; HA 테스트</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/assets/images/keepalived_haproxy_test-7fa62a7273547128ae9664bbff077788.gif" width="1935" height="660" class="img_ev3q"></p>]]></content>
        <category label="Keepalived" term="Keepalived"/>
        <category label="HAProxy" term="HAProxy"/>
        <category label="Nginx" term="Nginx"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Redis 설치 및 Sentinel을 이용한 failover환경 구성하기]]></title>
        <id>https://www.geuni.tech/redis/redis_install_from_source_and_sentinel_configuration</id>
        <link href="https://www.geuni.tech/redis/redis_install_from_source_and_sentinel_configuration"/>
        <updated>2023-12-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Redis 설치 및 Replication 구성, Sentinel을 이용한 failover환경 구성 등 방법을 상세하게 소개합니다.]]></summary>
        <content type="html"><![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/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="빌드 패키지 설치에 대한 직접 링크" title="빌드 패키지 설치에 대한 직접 링크">​</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="Redis 소스다운로드 및 컴파일 설치에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="Redis 사용자 계정 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/redis/redis_install_from_source_and_sentinel_configuration#replication%EA%B5%AC%EC%84%B1-master--slave" class="hash-link" aria-label="Replication구성 (Master / Slave)에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/redis/redis_install_from_source_and_sentinel_configuration#sentinel-%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="Sentinel 구성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/redis/redis_install_from_source_and_sentinel_configuration#failover-%ED%85%8C%EC%8A%A4%ED%8A%B8" class="hash-link" aria-label="Failover 테스트에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Redis" term="Redis"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Kafka기본개념, 설치 및 Cluster구성하기]]></title>
        <id>https://www.geuni.tech/kafka/kafka_introduce_install_cluster</id>
        <link href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster"/>
        <updated>2023-12-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[카카프(Kafka)란 무엇일까요? 이벤트 스트리밍 플랫폼인 카카프의 기본 개념부터 설치 방법, 클러스터 구성 방법까지 상세하게 알려드립니다. Topic, Partition, Broker 등 주요 개념과 Kraft 기반, Zookeeper 기반 클러스터 구성 방법을 예시와 함께 설명합니다.]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="kafka란">kafka란？<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#kafka%EB%9E%80" class="hash-link" aria-label="kafka란？에 대한 직접 링크" title="kafka란？에 대한 직접 링크">​</a></h3>
<p>Kafka는 분산 이벤트 스트리밍 플랫폼으로, 대규모 데이터 수집, 처리, 저장, 통합에 사용된다.</p>
<p>특히 데이터 파이프라인, 실시간 분석, 이벤트 스트리밍, pub/sub와 같은 환경에서 널리 사용된다.</p>
<p>Kafka를 더 잘 이해하기 위해서 이벤트란 무엇인지 알아야 할 필요가 있다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="이벤트란">이벤트란？<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%9E%80" class="hash-link" aria-label="이벤트란？에 대한 직접 링크" title="이벤트란？에 대한 직접 링크">​</a></h4>
<p>이벤트는 어플리케이션에 의해 식별되거나 기록되는 모든 유형의 작업, 사건 또는 변경 사항이다. 예를 들어, 결제, 웹페이지 클릭, 온도 측정 등과 같이 발생한 사건에 대한 데이터적인 표현이다.</p>
<p>이벤트는 통지(notification) 와 상태(state)의 조합으로 볼수 있다. 통지는 다음 이벤트를 트리거할수 있는 시간적인 요소이며 상태는 사건자체에 대한 데이터적인 표현이다.</p>
<p>우리는 일반적으로 JSON과 같은 익숙한 데이터 형태로 상태정보를 표현하며 메시지라는 단어로 이를 표현하는데 더 익숙하다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="kafka아키텍처-및-기본개념">Kafka아키텍처 및 기본개념<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#kafka%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90" class="hash-link" aria-label="Kafka아키텍처 및 기본개념에 대한 직접 링크" title="Kafka아키텍처 및 기본개념에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="topic">Topic<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#topic" class="hash-link" aria-label="Topic에 대한 직접 링크" title="Topic에 대한 직접 링크">​</a></h4>
<p>kafka의 가장 기본적인 구성 단위는 관계형 데이터베이스의 테이블과 같은 <code>topic</code>이다.</p>
<p>우리는 여러개의 topic을 만들어 다양한 종류의 이벤트를 저장하거나 같은 종류의 이벤트를 필터링 혹은 가공하여 다양한 topic에 저장한다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="partition">Partition<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#partition" class="hash-link" aria-label="Partition에 대한 직접 링크" title="Partition에 대한 직접 링크">​</a></h4>
<p>Kafka는 분산식 시스템이며 시스템 확장성 및 데이터 R/W성능을 고려하여 <code>topic</code>에 대한 <code>partition</code>기능을 제공한다.</p>
<p>partition기능은 단일 topic의 데이터를 여러개의 그룹으로 쪼개어 Kafka Cluster중의 각각의 Node에 분산시켜 저장하는것이 가능하도록 해준다.</p>
<p>다시 말하면 topic은 여러개의 partition으로 분할되어 여러 서버에 분산되어 저장될수 있다. topic을 통하여 데이터를 논리적으로 분할했다면 partition은 데이터의 물리적으로 분할이 가능하도록 해준다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="brokers">Brokers<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#brokers" class="hash-link" aria-label="Brokers에 대한 직접 링크" title="Brokers에 대한 직접 링크">​</a></h4>
<p>Kafka Cluster중 매개의 Node/서버를 Broker라고 한다. 여러그룹의 topic partition을 Broker가 관리를 해준다.</p>
<p>주로 producer 혹은 consumer의 request를 받아 partition에 데이터를 읽거나 쓰는 작업을 하게되며 partition의 데이터 복사(replication)작업도 broker가 처리해준다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="offset">Offset<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#offset" class="hash-link" aria-label="Offset에 대한 직접 링크" title="Offset에 대한 직접 링크">​</a></h4>
<p>Kafka에서 <code>offset</code>은 각 파티션에 저장된 메시지의 고유한 위치를 나타내는 순차적인 숫자이다. 주로 특정 메시지를 읽고 처리하는 지점을 추적하는 데 사용된다.</p>
<p><code>offset</code>은 <code>partition</code>별로 독립적으로 관리가 된다. 즉 Kafka 메시지는 각 파티션 내에서의 순서는 보장되지만, 파티션 간의 순서는 보장되지 않는다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="replication">Replication<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#replication" class="hash-link" aria-label="Replication에 대한 직접 링크" title="Replication에 대한 직접 링크">​</a></h4>
<p>만일 partition하나가 한개의 broker에만 저장된다면 Node장애가 발생했을때 데이터 유실이 발생한다. 데이터 고가용성을 고려하여 일반적으로 매개partition은 여러개의 복사본(<code>replica</code>)을 가지게되며 이를 broker가 관리를 해준다. 。</p>
<p>메인 partition을 <code>leader replica</code>라고 부르며 client request는 일반적으로 leader replica가 처리하게된다. <code>follower replica</code>는 leader replica로부터 데이터 sync만 받으며 대외 서비스는 안한다.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="producers--consumers">Producers &amp; Consumers<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#producers--consumers" class="hash-link" aria-label="Producers &amp; Consumers에 대한 직접 링크" title="Producers &amp; Consumers에 대한 직접 링크">​</a></h4>
<p>Kafka에는 <code>Producer와</code> <code>Consumer</code> 두 가지 유형의 클라이언트가 있다.</p>
<ul>
<li><strong>Producer</strong>: 메시지를 생성하고 Kafka Topic에 게시(Publish)하는 클라이언트. Producer는 특정 Topic에 메시지를 보내며, 이 메시지는 해당 Topic의 Partition에 저장됨.</li>
<li><strong>Consumer</strong>: Kafka Topic에 저장된 메시지를 읽고 처리하는 클라이언트. Consumer는 특정 Topic에서 메시지를 가져와 처리하며, Offset을 통해 어디까지 메시지를 읽었는지 추적할수 있다.</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="consumer-group">Consumer Group<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#consumer-group" class="hash-link" aria-label="Consumer Group에 대한 직접 링크" title="Consumer Group에 대한 직접 링크">​</a></h4>
<p>Kafka에서 <code>Consumer Group</code>은 여러 Consumer가 하나의 그룹으로 묶여 데이터를 분산적으로 처리하기 위한 논리적 그룹이다.</p>
<ul>
<li>동일한 Consumer Group 내의 각 Consumer는 서로 다른 Partition의 데이터를 처리함.</li>
<li>Consumer 수 &gt; Partition 수 : 일부 Consumer는 할당받을 파티션이 없어 대기 상태가 됨.</li>
<li>Consumer 수 &lt; Partition 수 : 일부 Consumer가 여러 파티션을 처리하게 됨.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="설치-및-cluster구성하기">설치 및 Cluster구성하기<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#%EC%84%A4%EC%B9%98-%EB%B0%8F-cluster%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0" class="hash-link" aria-label="설치 및 Cluster구성하기에 대한 직접 링크" title="설치 및 Cluster구성하기에 대한 직접 링크">​</a></h3>
<p>Cluster 구성을 위하여 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>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>파일 다운로드 및 압축해제:</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"></span><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 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">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></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="kraft-기반의-cluster구성"><code>Kraft</code> 기반의 Cluster구성<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#kraft-%EA%B8%B0%EB%B0%98%EC%9D%98-cluster%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="kraft-기반의-cluster구성에 대한 직접 링크" title="kraft-기반의-cluster구성에 대한 직접 링크">​</a></h4>
<p>instance별로 kraft config파일을 아래와 같이 변경한다.</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 comment" style="color:#999988;font-style:italic"># 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><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># kraft 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">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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>cluster uuid생성 및 스토리지 포맷</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"># 임의의 한대 서버에서 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"># 위에서 생성된 cluster uuid로 instance별로 스토리지 포맷</span><span class="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>서버별로 각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 comment" style="color:#999988;font-style:italic"># startup</span><span class="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-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"># check 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>Cluster상태 확인</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="zookeeper-기반의-cluster구성"><code>Zookeeper</code> 기반의 Cluster구성<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#zookeeper-%EA%B8%B0%EB%B0%98%EC%9D%98-cluster%EA%B5%AC%EC%84%B1" class="hash-link" aria-label="zookeeper-기반의-cluster구성에 대한 직접 링크" title="zookeeper-기반의-cluster구성에 대한 직접 링크">​</a></h4>
<p>instance별로 <code>config/server.properties</code>,  <code>config/zookeeper.properties</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">cd /usr/local/kafka_2.13-3.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sudo vim config/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>instance별로 <code>myid</code>설정(zookeeper node구분값, <code>zookeeper.properties</code> 중 자신의 server.<strong>{ID}</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 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"># 172.25.254.131</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"># 172.25.254.132</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"># 172.25.254.133</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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 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"># 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"></span><span class="token comment" style="color:#999988;font-style:italic"># check 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></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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생성--메시징-테스트">topic생성 &amp; 메시징 테스트<a href="https://www.geuni.tech/kafka/kafka_introduce_install_cluster#topic%EC%83%9D%EC%84%B1--%EB%A9%94%EC%8B%9C%EC%A7%95-%ED%85%8C%EC%8A%A4%ED%8A%B8" class="hash-link" aria-label="topic생성 &amp; 메시징 테스트에 대한 직접 링크" title="topic생성 &amp; 메시징 테스트에 대한 직접 링크">​</a></h4>
<p>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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>생성된 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 --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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>kafka가 제공하는 CLI 툴을 이용하여 메시지 전송테스트가 가능하다.</p>
<p>cluster 정상작동여부를 확인하기 위하여 <strong>#1</strong> 서버에서 메시지를 생성하여 <strong>#2</strong>, <strong>#3</strong>번에서 메시지를 받아보자.</p>
<p><strong>#1</strong>서버에서 Producer CLI구동</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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</strong>, <strong>#3</strong> 서버에서 Consumer CLI구동</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>Producer 터미널창에 메시지를 입력후 Consumer창에서 메시지 확인이 가능하다면 Cluster구성이 정상적으로 됏다고 볼수있다.</p>
<p><img decoding="async" loading="lazy" alt="kafka_produce_consume" src="https://www.geuni.tech/assets/images/kafka_produce_consume-3cdf03f67f13cfb20686dabd495feec1.gif" width="2843" height="1599" class="img_ev3q"></p>]]></content>
        <category label="Kafka" term="Kafka"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Redis Sentinel, failover과정 정리]]></title>
        <id>https://www.geuni.tech/redis/redis_sentinel_failover_process</id>
        <link href="https://www.geuni.tech/redis/redis_sentinel_failover_process"/>
        <updated>2023-08-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Redis Sentinel의 Failover 과정을 단계별로 분석합니다. Sentinel 기능, Leader 선출, Master 승격, 통신 방식 등 핵심 내용을 상세히 설명하여 Redis 고가용성 구성 및 장애 대응 전략 수립에 도움을 드립니다.]]></summary>
        <content type="html"><![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/redis/redis_sentinel_failover_process#failover%EA%B3%BC%EC%A0%95" class="hash-link" aria-label="failover과정에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/redis/redis_sentinel_failover_process#sentinel-leader-%EC%84%A0%EA%B1%B0%EA%B3%BC%EC%A0%95" class="hash-link" aria-label="Sentinel leader 선거과정에 대한 직접 링크" title="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/redis/redis_sentinel_failover_process#master-%EC%84%A0%EC%B6%9C" class="hash-link" aria-label="master 선출에 대한 직접 링크" title="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/redis/redis_sentinel_failover_process#slave-to-master%EC%9E%91%EC%97%85" class="hash-link" aria-label="slave to master작업에 대한 직접 링크" title="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/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="Sentinel의 통신방식에 대한 직접 링크" title="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/redis/redis_sentinel_failover_process#sentinel%EC%9D%80-slave%EF%BF%BD%EF%BF%BD%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="Sentinel은 Slave와 어떻게 통신하나?에 대한 직접 링크" title="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/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="Sentinel간에는 어떻게 통신하나?에 대한 직접 링크" title="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>
        <category label="Redis" term="Redis"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Elasticsearch Shard할당 실패원인 및 해결방법，“X of Y shards failed”]]></title>
        <id>https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana</id>
        <link href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana"/>
        <updated>2023-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Elasticsearch에서 발생하는 UNASSIGNED Shard 문제(X of Y shards failed)의 원인(replica 설정 오류, 데이터 유실, 디스크 부족)을 분석하고, 효과적인 해결 방법(replica 조정, 데이터 복구, 디스크 관리)을 제시합니다. Cluster 상태 확인부터 문제 해결까지 완벽 가이드.]]></summary>
        <content type="html"><![CDATA[<p>Kibana에서 가끔 X of Y shards failed와 같은 오류메시지를 볼수 있다.이는 <code>UNASSIGNED Shard</code>가 원인이다.</p>
<p>이때 cluster 상태를 확인하게 되면 Yellow혹은 Red인것을 확인할수 있다.</p>
<p><strong>ES중 Shard의 4가지 상태：</strong></p>
<ul>
<li>
<p><code>INITIALIZING</code> - 초기화상태,  신규 index를 생성하거나 node를 구동할때 일시적으로 발생하며 이 상태에서는 Shard사용이 불가하다.</p>
</li>
<li>
<p><code>RELOCATING</code> - 새로운 node가 추가되거나 node 다운될때 shard가 재할당되면서 발생한다. 이 또한 일시적으로 발생.</p>
</li>
<li>
<p><code>STARTED</code> - active상태</p>
</li>
<li>
<p><code>UNASSIGNED</code> - shard할당 실패</p>
</li>
</ul>
<p>그렇다면 어떤 경우에 UNASSIGNED Shard가 발생하나？</p>
<ul>
<li>replica shard수량을 너무 크게 설정하여 할당할 node가 부족한 경우</li>
<li>shard 데이터유실 발생</li>
<li>디스크 가용공간 부족</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cluster상태-및-shard할당-실패원인-확인">Cluster상태 및 shard할당 실패원인 확인<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#cluster%EC%83%81%ED%83%9C-%EB%B0%8F-shard%ED%95%A0%EB%8B%B9-%EC%8B%A4%ED%8C%A8%EC%9B%90%EC%9D%B8-%ED%99%95%EC%9D%B8" class="hash-link" aria-label="Cluster상태 및 shard할당 실패원인 확인에 대한 직접 링크" title="Cluster상태 및 shard할당 실패원인 확인에 대한 직접 링크">​</a></h3>
<p>우선 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/8.8/cluster-health.html" target="_blank" rel="noopener noreferrer">Cluster health API</a>를 통하여 cluster 및 shard할당 상태를 확인한다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>주로status，unassigned_shards，active_shards_percent_as_number, delayed_unassigned_shards등 데이터 확인.</p>
<p>status는 cluster상태이며 총 3가지 상태가 있다.</p>
<ul>
<li><em>green</em> - 모든 shard 할당완료</li>
<li><em>yellow</em> - primary shard는 전부 활당 완료하였으나 replica shard 할당 실패. 이때 node장애가 발생하면 데이터 유실이 발샐할수 있음.</li>
<li><em>red</em> - 할당못한 primary shard 존재, 부분 데이터 사용불가，node구동때 일시적으로 발생할수도 있음.</li>
</ul>
<p><code>unassigned_shards</code>는 할당되지 않은 shard수량이다. Cluster상태가 Yellow혹은 Red일때 0보다 큼.</p>
<p><code>active_shards_percent_as_number</code>는 active(할당된) shard의 비율이다. 수치가 작을수록 UNASSIGNED Shard가 많다는 의미</p>
<p><code>delayed_unassigned_shards</code>는 특정node가 down된후 <code>index.unassigned.node_left.delayed_timeout</code>(기본값:1분) 을 대기중인 shard수량.</p>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-shards.html" target="_blank" rel="noopener noreferrer">cat shards API</a>를 실행하여 미할당 shard목록을 확인한다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>혹은 curl명령으로 UNASSIGNED Shard만 필터링:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>shard 할당 실패한 세부원인 확인:</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-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">"index"</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-index"</span><span class="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">"shard"</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">2</span><span class="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">"primary"</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">"current_state"</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">"unassigned"</span><span class="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_info"</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 property" style="color:#36acaa">"reason"</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">"CLUSTER_RECOVERED"</span><span class="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">"at"</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">"2023-02-06T06:34:22.345Z"</span><span class="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">"last_allocation_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">"no_attempt"</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 property" style="color:#36acaa">"can_allocate"</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">"no"</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">"allocate_explanation"</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">"cannot allocate because allocation is not permitted to any of the nodes"</span><span class="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">"node_allocation_decisions"</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 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">"node_id"</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">"dntxO1EFQVSzk7A4n45OLQ"</span><span class="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">"node_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">"node-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">"transport_address"</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">"52.208.205.70:9300"</span><span class="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">"node_attributes"</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 property" style="color:#36acaa">"ml.machine_memory"</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">"33737449472"</span><span class="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">"xpack.installed"</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">"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 property" style="color:#36acaa">"ml.max_open_jobs"</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">"20"</span><span class="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">"ml.enabled"</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">"true"</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 property" style="color:#36acaa">"node_decision"</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">"no"</span><span class="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">"deciders"</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 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">"decider"</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">"same_shard"</span><span class="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">"decision"</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">"NO"</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">"explanation"</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">"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><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">    </span><span class="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></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>shard할당 실패원인까지 확인하였으니 아래 해결방법을 보자.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="해결방법">해결방법<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95" class="hash-link" aria-label="해결방법에 대한 직접 링크" title="해결방법에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="replica-shard수량을-너무-크게-설정하여-할당할-node가-부족한-경우">replica shard수량을 너무 크게 설정하여 할당할 node가 부족한 경우<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#replica-shard%EC%88%98%EB%9F%89%EC%9D%84-%EB%84%88%EB%AC%B4-%ED%81%AC%EA%B2%8C-%EC%84%A4%EC%A0%95%ED%95%98%EC%97%AC-%ED%95%A0%EB%8B%B9%ED%95%A0-node%EA%B0%80-%EB%B6%80%EC%A1%B1%ED%95%9C-%EA%B2%BD%EC%9A%B0" class="hash-link" aria-label="replica shard수량을 너무 크게 설정하여 할당할 node가 부족한 경우에 대한 직접 링크" title="replica shard수량을 너무 크게 설정하여 할당할 node가 부족한 경우에 대한 직접 링크">​</a></h4>
<p>shard는 <code>primary shard</code> 와 <code>replica shard</code>로 나뉜다. index내의 데이터(document)는 특정수량의 primary shard에 할당되어 각 node에 저장되며 primary shard를 몇개 가져갈지는 <code>number_of_shards</code>설정으로 결정된다. 그리고 각 primary shard는 특정수량의 복사본 즉 replica shard를 가지고 있다. replica수량은 <code>number_of_replicas</code>설정으로 결정된다. shard수량은 보통은 index를 생성하거나 index template을 만들때 지정한다.</p>
<p>여기서 알아야 할 하나의 규칙은 특정primary shard의 replica는 해당primary shard와 다른 node에 저장되여야 한다. 이는 replica수량이 node수와 같거나클때 할당할수 없다는 뜻이다.(<strong>N(node수량) &gt;= R(replica수량) + 1 공식을 준수</strong>하자.)이때 서비스영향은 없으나 ES가 보기에 합리한 설정이 아니다. 필경 우리가 원하는 <code>number_of_replicas</code>수량만큰 할당해주지 못하였기때문이다.가장 쉽게들 하는 실수가 single node에서 <em><strong>number_of_replicas</strong></em>를 1(default)로 설정한 경우다.</p>
<p>위에서 <code>/_cluster/allocation/explain</code>실행 결과가 현재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">the shard cannot be allocated to the same node on which a copy of the shard already exists</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>이때 해결방법은 node수량을 늘리거나 replica수량을 줄이는거다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-데이터-유실-발생">Shard 데이터 유실 발생<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#shard-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9C%A0%EC%8B%A4-%EB%B0%9C%EC%83%9D" class="hash-link" aria-label="Shard 데이터 유실 발생에 대한 직접 링크" title="Shard 데이터 유실 발생에 대한 직접 링크">​</a></h4>
<p>primary shard 데이터 손실이 발생한 경우다. 보통은 replica가 만들어지기전 혹은 할당되기전에 노드가 다운되거나 disk손상이 생길때 발생한다.</p>
<p>이때 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-allocation-explain.html#cluster-allocation-explain" target="_blank" rel="noopener noreferrer">Cluster allocation explain API</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">"allocate_explanation" : "cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster",</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>이런 상황에서는 문제 있는 node를 복구하여 다시 cluster에 join시킬지 아니면 데이터 유실을 감수하면서 <code>empty primary</code>를 강제로 할당할지 결정이 필요하다.
데이터 유실을 감수할수 있다면 아래와 같이 API호출을 하여 empty primary를 할당해주면 된다.</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 plain">POST /_cluster/reroute?pretty</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 property" style="color:#36acaa">"commands"</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 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">"allocate_empty_primary"</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 property" style="color:#36acaa">"index"</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">"&lt;INDEX_NAME&gt;"</span><span class="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">"shard"</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">"node"</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">"&lt;NODE_NAME&gt;"</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">"accept_data_loss"</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">"true"</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">    </span><span class="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>allocate_empty_primary</code>명령을 이용할때 <code>"accept_data_loss" : "true"</code> 옵션은 필수이다.  데이터 잃을 준비가 돼있을시에만 실행하라는 뜻.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="디스크-가용공간-부족">디스크 가용공간 부족<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%EB%94%94%EC%8A%A4%ED%81%AC-%EA%B0%80%EC%9A%A9%EA%B3%B5%EA%B0%84-%EB%B6%80%EC%A1%B1" class="hash-link" aria-label="디스크 가용공간 부족에 대한 직접 링크" title="디스크 가용공간 부족에 대한 직접 링크">​</a></h4>
<p>노드 및 디스크 가용공간이 부족할때 master node는 shard할당을 할수 없다. 디폴트로 디스크 사용율이 85%일때면 node가 <code>Low disk watermark</code>로 표기되며 더 이상 shard할당을 못받는다.</p>
<p><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-allocation.html" target="_blank" rel="noopener noreferrer">cat allocation API</a>를 이용하여 각 노드의 Shard할당 현황 및 디스크 사용율을 확인할수 있다.</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/allocation?v</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>불필요한 index를 삭제하거나 노드 추가/디스크 가용공간을 늘리는 등 옵션이 있다.</p>
<p>디스크 사이즈가 충분히 클때에는 디폴트 <code>Low disk watermark</code> 수치가 너무 작을수 있다.<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html" target="_blank" rel="noopener noreferrer">Cluster update settings API</a>를 이용하여 적합한 값으로 설정하면 된다.</p>
<p>주의해야 할 점은 해당 값이 Safety point에 해당한다는 것이며, 실제 데이터 증장률 등을 고려하여 실무에 맞는 값을 설정할 필요가 있다.</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>persistent</code>를 <code>transient</code>로 변경해주면 된다.영구적으로 수정하고 싶다면 <code>persistent</code>를 사용하면 된다.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="결론">결론<a href="https://www.geuni.tech/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%EA%B2%B0%EB%A1%A0" class="hash-link" aria-label="결론에 대한 직접 링크" title="결론에 대한 직접 링크">​</a></h3>
<p>미할당 된 Shard는 ES에서 unhealthy한 Cluster상태로 표현된다. 불합리한 Shard수량 설정, 노드 장애, 디스크 가용공간 부족등이 UNASSIGNED Shard 발생원이 될수 있음을 알았다.
물론 일부분 case는 서비스에 영향이 없으나 ES보기에 최적화 상태가 아니므로 주의할 필요가 있다.</p>]]></content>
        <category label="Elasticsearch" term="Elasticsearch"/>
        <category label="Kibana" term="Kibana"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Git error해결방법: Your local changes to the following files would be overwritten by merge]]></title>
        <id>https://www.geuni.tech/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge</id>
        <link href="https://www.geuni.tech/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge"/>
        <updated>2022-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Git 사용 중 "Your local changes to the following files would be overwritten by merge" 오류 발생 시 해결 방법을 commit과 stash 두 가지 방법으로 자세히 설명합니다. 충돌 상황 재현 및 해결 과정까지..]]></summary>
        <content type="html"><![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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="오류 재현：에 대한 직접 링크" title="오류 재현：에 대한 �직접 링크">​</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="해결방법：에 대한 직접 링크" title="해결방법：에 대한 직접 링크">​</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/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="해결방법1commit에 대한 직접 링크" title="해결방법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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="해결방법2stash에 대한 직접 링크" title="해결방법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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Git" term="Git"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[MySQL오류 - SELECT list is not in GROUP BY clause and contains nonaggregated column]]></title>
        <id>https://www.geuni.tech/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column</id>
        <link href="https://www.geuni.tech/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column"/>
        <updated>2022-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[MySQL 5.7 이상에서 발생하는 "SELECT list is not in GROUP BY clause and contains nonaggregated column" 오류 해결 방법을 소개합니다. ONLY_FULL_GROUP_BY 모드 비활성화, my.cnf 설정, runtime 변경 등 다양한 해결책과 함께 SQL 표준 준수 및 문제 발생 시 대처법을 안내합니다.]]></summary>
        <content type="html"><![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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="MySQL" term="MySQL"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux에 OpenResty 소스 빌드하여 설치하기]]></title>
        <id>https://www.geuni.tech/nginx/linux_install_openresty_from_source</id>
        <link href="https://www.geuni.tech/nginx/linux_install_openresty_from_source"/>
        <updated>2022-02-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Linux에서 OpenResty 및 Nginx를 소스 빌드로 설치하는 방법. 필수 패키지, 빌드 과정, systemd 설정까지 LuaJIT 활용을 위한 OpenResty 설치 가이드.]]></summary>
        <content type="html"><![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/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="필수패키지 사전설치에 대한 직접 링크" title="필수패키지 사전설치에 대한 직접 링크">​</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/nginx/linux_install_openresty_from_source#centos-rhelrocky-and-fedora" class="hash-link" aria-label="CentOS, RHEL,Rocky, and Fedora에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/nginx/linux_install_openresty_from_source#debian%EA%B8%B0%EB%B0%98%EC%9D%98-linux" class="hash-link" aria-label="Debian기반의 Linux에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="소스 빌드 및 설치에 대한 직접 링크" title="소스 빌드 및 설치에 대한 직접 링크">​</a></h5>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="소스-다운로드">소스 다운로드<a href="https://www.geuni.tech/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="소스 다운로드에 대한 직접 링크" title="소스 다운로드에 대한 직접 링크">​</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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="OpenResty및 제3방모듈 빌드에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="systemd 유닛 파일 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Nginx" term="Nginx"/>
        <category label="OpenResty" term="OpenResty"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ruby gem，bundler 미러/소스 변경]]></title>
        <id>https://www.geuni.tech/ruby/ruby_gems_bundler_mirrors</id>
        <link href="https://www.geuni.tech/ruby/ruby_gems_bundler_mirrors"/>
        <updated>2022-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[gem]]></summary>
        <content type="html"><![CDATA[<h5 class="anchor anchorWithStickyNavbar_LWe7" id="gem">gem<a href="https://www.geuni.tech/ruby/ruby_gems_bundler_mirrors#gem" class="hash-link" aria-label="gem에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/ruby/ruby_gems_bundler_mirrors#bundle" class="hash-link" aria-label="bundle에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Ruby" term="Ruby"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python, Locust를 이용한 부하 테스트]]></title>
        <id>https://www.geuni.tech/python/load_testing_locust</id>
        <link href="https://www.geuni.tech/python/load_testing_locust"/>
        <updated>2022-01-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[본 포스트에서는 Python 기반의 오픈소스 분산 부하 테스트 도구인 Locust의 사용법을 소개합니다.]]></summary>
        <content type="html"><![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/python/load_testing_locust#locust-%EC%84%A4%EC%B9%98" class="hash-link" aria-label="Locust 설치에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="Locust 기본 사용법에 대한 직접 링크" title="Locust 기본 사용법에 대한 직접 링크">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="mock-api-생성">Mock API 생성<a href="https://www.geuni.tech/python/load_testing_locust#mock-api-%EC%83%9D%EC%84%B1" class="hash-link" aria-label="Mock API 생성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="Locust 스크립트 작성에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/python/load_testing_locust#locust-%EC%8B%A4%ED%96%89" class="hash-link" aria-label="Locust 실행에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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/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="CLI 모드로 Locust 실행에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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/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="분산 모드로 Locust 실행에 대한 직접 링크" title="분산 모드로 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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Python" term="Python"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python pip，pipenv 미러/소스 변경]]></title>
        <id>https://www.geuni.tech/python/pip_index_url</id>
        <link href="https://www.geuni.tech/python/pip_index_url"/>
        <updated>2022-01-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。]]></summary>
        <content type="html"><![CDATA[<p>像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="pip设置国内源">pip设置国内源<a href="https://www.geuni.tech/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="pip设置国内源에 대한 직�접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/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="pipenv设置国内源에 대한 직접 링크" title="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="Python" term="Python"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[macOS에서 brew install 시 Error: No such file or directory 오류 해결]]></title>
        <id>https://www.geuni.tech/macos/brew_no_such_file_or_directory</id>
        <link href="https://www.geuni.tech/macos/brew_no_such_file_or_directory"/>
        <updated>2022-01-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[brew install 명령을 실행할 때 아래와 같은 Error: No such file or directory * 오류가 발생하는 경우가 있습니다.]]></summary>
        <content type="html"><![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="클립보드에 코드 복사" title="복사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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="클립보드에 코드 복사" title="복�사" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
        <category label="macOS" term="macOS"/>
    </entry>
</feed>