<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Geuni's Blog Blog</title>
        <link>https://www.geuni.tech/zh-Hans/</link>
        <description>Geuni's Blog Blog</description>
        <lastBuildDate>Thu, 13 Feb 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-Hans</language>
        <item>
            <title><![CDATA[Elasticsearch 8.x 安装及集群配置]]></title>
            <link>https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup</link>
            <guid>https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup</guid>
            <pubDate>Thu, 13 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[本文将介绍如何通过编译好的归档文件（.tar.gz）安装Elasticsearch(8.17)，并进行集群配置。]]></description>
            <content:encoded><![CDATA[<p>Elasticsearch是一款实时分布式搜索和分析引擎，能够高效地存储、搜索和分析大量数据。它基于 Apache Lucene 库构建，广泛应用于全文搜索、日志分析、应用监控等领域。</p>
<p>本文将介绍如何通过编译好的归档文件（.tar.gz）安装Elasticsearch，并进行集群配置。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="elasticsearch-安装">Elasticsearch 安装<a href="https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup#elasticsearch-%E5%AE%89%E8%A3%85" 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>
<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="下载并安装-elasticsearch">下载并安装 Elasticsearch<a href="https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E4%B8%8B%E8%BD%BD%E5%B9%B6%E5%AE%89%E8%A3%85-elasticsearch" class="hash-link" aria-label="下载并安装 Elasticsearch的直接链接" title="下载并安装 Elasticsearch的直接链接">​</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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E5%8F%8A%E6%9D%83%E9%99%90%E8%AE%BE%E7%BD%AE" class="hash-link" aria-label="创建用户及权限设置的直接链接" title="创建用户及权限设置的直接链接">​</a></h4>
<div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell 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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E9%85%8D%E7%BD%AE-systemd-%E6%9C%8D%E5%8A%A1" 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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E9%85%8D%E7%BD%AE%E9%98%B2%E7%81%AB%E5%A2%99" class="hash-link" aria-label="配置防火墙的直接链接" title="配置防火墙的直接链接">​</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"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9200</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9300</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--permanent</span><span class="token plain"> --add-port</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5601</span><span class="token plain">/tcp</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> firewall-cmd </span><span class="token parameter variable" style="color:#36acaa">--reload</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E9%85%8D%E7%BD%AE-elasticsearch-%E9%9B%86%E7%BE%A4" class="hash-link" aria-label="配置 Elasticsearch 集群的直接链接" title="配置 Elasticsearch 集群的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="生成及分发证书">生成及分发证书<a href="https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E7%94%9F%E6%88%90%E5%8F%8A%E5%88%86%E5%8F%91%E8%AF%81%E4%B9%A6" 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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E7%BC%96%E8%BE%91-elasticsearchyml" 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>注意：<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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E5%90%AF%E5%8A%A8%E9%9B%86%E7%BE%A4%E5%B9%B6%E6%A3%80%E6%9F%A5%E7%8A%B6%E6%80%81" 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/zh-Hans/elasticsearch-install-cluster-kibana-setup#kibana-%E9%9B%86%E6%88%90" class="hash-link" aria-label="Kibana 集成的直接链接" title="Kibana 集成的直接链接">​</a></h3>
<p>默认<code>elastic</code>账户不能直接在Kibana中使用，Kibana需使用ES内置的 <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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E5%AE%89%E8%A3%85-kibana" 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/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E7%BC%96%E8%BE%91-kibanayml" 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="启动-kibana">启动 Kibana<a href="https://www.geuni.tech/zh-Hans/elasticsearch-install-cluster-kibana-setup#%E5%90%AF%E5%8A%A8-kibana" 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 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%">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[免费替代 Cursor AI！VS Code, Deepseek R1, Ollama 打造免费 AI 编程神器]]></title>
            <link>https://www.geuni.tech/zh-Hans/deepseek-r1-ollama-vscode-setup</link>
            <guid>https://www.geuni.tech/zh-Hans/deepseek-r1-ollama-vscode-setup</guid>
            <pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[想免费拥有媲美 Cursor AI 的智能编程体验？本文教你如何利用 VS Code, Deepseek R1 和 Ollama 打造免费 AI 编程环境，告别昂贵的订阅费用！]]></description>
            <content:encoded><![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 自动补全功能，因此可以考虑配合 Continue 一同使用。</p>
<p>根据 <a href="https://openrouter.ai/" target="_blank" rel="noopener noreferrer">openrouter.ai</a> 平台的 token 使用情况来看，<strong>Cline</strong> 和 <strong>Roo Code</strong> 的 token 使用量远远领先于其他工具。</p>
<img src="https://www.geuni.tech/img/post/openrouter-ai.png" alt="Vs code, Cline 설정" 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/zh-Hans/deepseek-r1-ollama-vscode-setup#deepseek-r1-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2" class="hash-link" aria-label="DeepSeek R1 本地部署的直接链接" title="DeepSeek R1 本地部署的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="为什么选择本地部署">为什么选择本地部署？<a href="https://www.geuni.tech/zh-Hans/deepseek-r1-ollama-vscode-setup#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2" 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 上运行的轻量化蒸馏模型能够提供与 API 提供的完整参数模型相同的效果。</p>
<p>老实说，对于大多数个人开发者来说，承担一定费用并使用平台提供的 API 更为现实（尤其是使用韩语等少数语言的情况下），本地运行方式建议以实验性的心态去尝试。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="安装-ollama">安装 Ollama<a href="https://www.geuni.tech/zh-Hans/deepseek-r1-ollama-vscode-setup#%E5%AE%89%E8%A3%85-ollama" 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/zh-Hans/deepseek-r1-ollama-vscode-setup#%E4%B8%8B%E8%BD%BD%E6%89%80%E9%9C%80%E7%9A%84-deepseek-r1-%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="下载所需的 DeepSeek R1 模型的直接链接" title="下载所需的 DeepSeek R1 模型的直接链接">​</a></h4>
<p>根据您的 PC 配置选择合适的模型进行下载。</p>
<p>例如，下载 14B 模型：</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/zh-Hans/deepseek-r1-ollama-vscode-setup#vs-code-%E5%92%8C-cline-%E8%AE%BE%E7%BD%AE" 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/zh-Hans/deepseek-r1-ollama-vscode-setup#%E5%AE%89%E8%A3%85-vs-code-%E6%89%A9%E5%B1%95" 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/zh-Hans/deepseek-r1-ollama-vscode-setup#%E5%9C%A8-cline-%E4%B8%AD%E8%BF%9E%E6%8E%A5-ollama%E6%9C%AC%E5%9C%B0-deepseek-r1" class="hash-link" aria-label="在 Cline 中连接 ollama（本地 DeepSeek R1）的直接链接" title="在 Cline 中连接 ollama（本地 DeepSeek R1）的直接链接">​</a></h4>
<ul>
<li>打开 VS Code 中的 <code>Cline</code> 设置。</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 中连接 ollama" 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/zh-Hans/deepseek-r1-ollama-vscode-setup#%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="测试的直接链接" title="测试的直接链接">​</a></h4>
<p>设置完成后，使用 Cline 发送 prompt 测试响应情况。</p>
<p>若发现输入 prompt 后 CPU 疯转而相应特别慢或无响应，则可能是由于电脑硬件不足以支撑该模型运行，此时建议尝试使用低版本的模型进行测试。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="api-连接方式">API 连接方式<a href="https://www.geuni.tech/zh-Hans/deepseek-r1-ollama-vscode-setup#api-%E8%BF%9E%E6%8E%A5%E6%96%B9%E5%BC%8F" 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 API" style="zoom:70%">
<p>现在，你也可以以每月 $0 的成本体验 Cursor 级别的 AI 编程！如果在设置过程中遇到问题，可以参考 Ollama 官方文档或 Cline GitHub 问题页面获取帮助。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[使用 Spring AI 集成 DeepSeek 实现聊天机器人]]></title>
            <link>https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek</link>
            <guid>https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek</guid>
            <pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[本文将介绍如何利用 Spring AI 对接 DeepSeek API，实现一个简单的 AI 聊天机器人。]]></description>
            <content:encoded><![CDATA[<p>近期，中国 AI 初创公司 DeepSeek 发布的高性能语言模型在全球 AI 社区引起了广泛关注。</p>
<p>特别是 DeepSeek R1，其性能与 OpenAI 相当，凭借亲民的价格和开源战略在市场上掀起了巨大波澜。</p>
<p>本文将采用最简单的方式，介绍如何通过 Spring AI 对接 DeepSeek API，实现一个基础的 AI 聊天机器人。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-aiai集成的利器">Spring AI：AI集成的利器<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#spring-aiai%E9%9B%86%E6%88%90%E7%9A%84%E5%88%A9%E5%99%A8" 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/zh-Hans/assets/images/spring-ai-integration-diagram-15efbf8cf671e5905e96b462ea5acdbf.svg" width="456" height="301" class="img_ev3q"></p>
<p>Spring AI 是 Spring 生态系统中用于集成生成式 AI 的项目，为开发者提供了便捷的 AI 模型整合方案。其主要特性包括：</p>
<ol>
<li><strong>标准化API:</strong> 支持Anthropic、OpenAI、Microsoft、Amazon、Google、Ollama、DeepSeek等主流 AI 服务的统一接口。</li>
<li><strong>模块化架构:</strong> 实现与具体AI服务商解耦的灵活结构</li>
<li><strong>快速集成:</strong> 基于Spring Boot自动配置的极简整合</li>
<li><strong>扩展能力:</strong> 支持自定义模型和高级配置选项</li>
</ol>
<p>特别适合需要快速部署和扩展 AI 能力的商业应用场景。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="deepseek高性能低成本">DeepSeek：高性能、低成本<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#deepseek%E9%AB%98%E6%80%A7%E8%83%BD%E4%BD%8E%E6%88%90%E6%9C%AC" 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>这家中国新兴 AI 公司凭借 DeepSeek R1 震撼业界，其核心优势包括：</p>
<ul>
<li><strong>顶尖语言模型:</strong> 达到 OpenAI-o1 级别的高性能模型。</li>
<li><strong>OpenAI兼容API:</strong> 完美适配现有的 OpenAI 生态应用。</li>
<li><strong>成本优势:</strong> 相比 OpenAI 更具价格竞争力。</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="准备工作">准备工作<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C" 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 密钥（避免直接写入application.yml）</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="功能实现">功能实现<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#%E5%8A%9F%E8%83%BD%E5%AE%9E%E7%8E%B0" 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/zh-Hans/spring-ai-with-deepseek#1-buildgradle%E9%85%8D%E7%BD%AE" 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/zh-Hans/spring-ai-with-deepseek#2-applicationyml%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="2. application.yml配置的直接链接" title="2. application.yml配置的直接链接">​</a></h4>
<p>配置DeepSeek连接参数：</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/zh-Hans/spring-ai-with-deepseek#3-controller-%E7%BC%96%E5%86%99" class="hash-link" aria-label="3. Controller 编写的直接链接" title="3. Controller 编写的直接链接">​</a></h4>
<p>接下来，我们编写一个 Spring AI 控制器，通过 API 调用 DeepSeek 服务。</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="测试">测试<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="测试的直接链接" title="测试的直接链接">​</a></h3>
<p>现在Deepseek 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, DeepSeek集成测试" src="https://www.geuni.tech/zh-Hans/assets/images/spring-ai-deepseek-test-en-a3818dac4538b1eee1d9db7d6a19a5fb.png" width="2182" height="1257" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="聊天界面实现">聊天界面实现<a href="https://www.geuni.tech/zh-Hans/spring-ai-with-deepseek#%E8%81%8A%E5%A4%A9%E7%95%8C%E9%9D%A2%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="聊天界面实现的直接链接" title="聊天界面实现的直接链接">​</a></h3>
<p>我是借助Cursor快速搭建了一个UI界面，推荐大家也可以使用自己擅长的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/zh-Hans/spring-ai-with-deepseek#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="总结的直接链接" title="总结的直接链接">​</a></h3>
<p>本文介绍了如何使用 Spring AI 连接 DeepSeek API，并实现一个基础的 AI 聊天机器人。</p>
<p>作为 OpenAI 的强劲竞争对手，DeepSeek 未来有望在 AI 市场上占据重要地位。</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cursor AI 사용법: 코드 편집을 넘어, 다목적 AI 도구]]></title>
            <link>https://www.geuni.tech/zh-Hans/cursor-ai-usage</link>
            <guid>https://www.geuni.tech/zh-Hans/cursor-ai-usage</guid>
            <pubDate>Wed, 15 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Cursor AI는 코드 자동 완성, 버그 수정 등 개발 생산성을 높여주는 것은 물론, 자연어 생성 기능으로 콘텐츠 크리에이터에게도 유용한 AI 도구입니다. 다양한 기능과 사용법을 자세히 알아보세요.]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cursor-ai-코드-편집을-넘어선-다목적-ai-assist-도구">Cursor AI: 코드 편집을 넘어선 다목적 AI Assist 도구<a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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/zh-Hans/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:encoded>
            <category>Cursor</category>
        </item>
        <item>
            <title><![CDATA[Git 命令、概念与术语：开发者与写作者的必备工具]]></title>
            <link>https://www.geuni.tech/zh-Hans/git-commands-and-glossary</link>
            <guid>https://www.geuni.tech/zh-Hans/git-commands-and-glossary</guid>
            <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Git 不再是开发者的专属工具！探索 Git 命令、概念与术语，提升你的版本管理能力，无论是代码协作还是个人笔记管理。]]></description>
            <content:encoded><![CDATA[<p>本文将 Git 命令、概念与术语。为了让初次接触 Git 的朋友也能轻松跟上，我们将从简单介绍基本概念开始。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git不再是开发者的专属工具">Git：不再是开发者的专属工具！<a href="https://www.geuni.tech/zh-Hans/git-commands-and-glossary#git%E4%B8%8D%E5%86%8D%E6%98%AF%E5%BC%80%E5%8F%91%E8%80%85%E7%9A%84%E4%B8%93%E5%B1%9E%E5%B7%A5%E5%85%B7" 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>如今，Git 也经常与 Obsidian、Logseq 等笔记管理工具结合使用，广泛应用于个人知识管理（PKM）中。</p>
<p>对于初学者，建议从 GUI 工具开始使用。（如 <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>
<p><strong>基本的 Git 工作流程</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">---- 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>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-术语整理">Git 术语整理<a href="https://www.geuni.tech/zh-Hans/git-commands-and-glossary#git-%E6%9C%AF%E8%AF%AD%E6%95%B4%E7%90%86" class="hash-link" aria-label="Git ��术语整理的直接链接" title="Git 术语整理的直接链接">​</a></h2>
<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> (查看工作目录的状态)</td></tr><tr><td><code>暂存区 (Staging Area)</code></td><td>用于准备提交的临时存储区域。通过 <code>git add</code> 命令将文件添加到此区域，提交时会将这些更改保存到仓库中。</td><td><code>git add &lt;文件&gt;</code> (将文件添加到暂存区)</td></tr><tr><td><code>索引 (Index)</code></td><td>Git 内部使用的技术性术语，指用于跟踪文件状态的数据结构，与 <code>暂存区</code> 通常是同义词，但更具体地表示 Git 内部的文件快照和元数据结构。</td><td><code>git ls-files --stage</code> (查看索引中的文件列表)</td></tr><tr><td><code>工作树 (Worktree)</code></td><td>允许在同一个 Git 仓库中管理多个工作目录的功能，每个目录对应一个分支，适用于需要同时开发多个任务的场景。</td><td><code>git worktree add &lt;路径&gt; &lt;分支&gt;</code> (添加新的工作树)</td></tr><tr><td><code>HEAD</code></td><td>指向当前工作分支最新提交的指针。通常指向分支名称，表示当前所在的分支。</td><td><code>git checkout main</code> (HEAD 指向 <code>main</code> 分支)</td></tr><tr><td><code>分离头指针 (Detached HEAD)</code></td><td><code>HEAD</code> 直接指向某个提交而不是分支的状态。在此状态下可以创建新提交，但由于没有分支引用，可能会丢失这些提交。可以通过创建分支来保存这些提交，避免丢失。</td><td><code>git checkout &lt;提交哈希&gt;</code> (进入分离头指针状态)</td></tr><tr><td><code>仓库 (Repository)</code></td><td>Git 管理的项目存储库，包含完整的项目历史和元数据。分为本地仓库（存储在本地的项目历史）和远程仓库（存储在远程服务器上的项目历史）。</td><td><code>git init</code> (创建本地仓库), <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> (创建新分支)</td></tr><tr><td><code>切换 (Checkout)</code></td><td>切换到特定分支或提交的命令。<code>git switch</code> 是更现代的替代命令。</td><td><code>git checkout feature-branch</code> (切换分支)</td></tr><tr><td><code>合并 (Merge)</code></td><td>将两个分支的更改合并为一个。分为快进合并（Fast-forward）和三方合并（Three-way merge）。</td><td><code>git merge feature-branch</code> (将 <code>feature-branch</code> 合并到当前分支)</td></tr><tr><td><code>拉取 (Pull)</code></td><td>将远程仓库的更改拉取到本地仓库并合并。<code>git pull</code> 是 <code>git fetch</code> 和 <code>git merge</code> 的组合。</td><td><code>git pull origin main</code> (拉取远程 <code>main</code> 分支的更改)</td></tr><tr><td><code>推送 (Push)</code></td><td>将本地仓库的更改上传到远程仓库。默认推送到与当前分支关联的远程分支。</td><td><code>git push origin feature-branch</code> (将 <code>feature-branch</code> 推送到远程仓库)</td></tr><tr><td><code>获取 (Fetch)</code></td><td>将远程仓库的更改拉取到本地仓库，但不合并。用于查看远程仓库的最新状态。</td><td><code>git fetch origin</code> (获取远程仓库的更改)</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> (临时保存更改), <code>git stash pop</code> (恢复临时保存的更改)</td></tr><tr><td><code>变基 (Rebase)</code></td><td>将分支的基址重置为另一个提交，使提交历史更整洁。注意：变基会重写提交历史，可能导致冲突。</td><td><code>git rebase main</code> (将当前分支变基到 <code>main</code> 分支)</td></tr><tr><td><code>标签 (Tag)</code></td><td>为特定提交打上标签。通常用于版本发布，分为轻量标签（Lightweight）和附注标签（Annotated）。</td><td><code>git tag v1.0.0</code> (创建 <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> (添加远程仓库)</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;提交哈希&gt;</code> (应用特定提交)</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> (完全回退到上一个提交)</td></tr><tr><td><code>回退 (Revert)</code></td><td>创建一个新的提交来撤销特定提交。适用于需要保留历史记录的场景。</td><td><code>git revert &lt;提交哈希&gt;</code> (撤销特定提交)</td></tr><tr><td><code>追溯 (Blame)</code></td><td>查看文件中每一行是谁在何时修改的，适用于代码审查、定位问题代码或了解变更背景。</td><td><code>git blame &lt;文件&gt;</code> (查看文件的修改历史)</td></tr><tr><td><code>日志 (Log)</code></td><td>查看提交历史。常用选项包括 <code>--oneline</code>、<code>--graph</code> 和 <code>--stat</code>。</td><td><code>git log</code> (查看提交历史)</td></tr><tr><td><code>差异 (Diff)</code></td><td>比较文件的更改。常用命令包括 <code>git diff</code>（工作目录与暂存区）、<code>git diff --cached</code>（暂存区与最新提交）。</td><td><code>git diff</code> (比较工作目录和暂存区的差异)</td></tr><tr><td><code>暂存 (Stage)</code></td><td>将更改从工作目录添加到暂存区，以便在提交时包括这些更改。</td><td><code>git add &lt;文件&gt;</code> (将文件添加到暂存区)</td></tr><tr><td><code>取消暂存 (Unstage)</code></td><td>将暂存区中的更改移回工作目录，适用于撤销误添加或重新修改文件。</td><td><code>git reset &lt;文件&gt;</code> (将文件从暂存区移除)</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> (添加子模块)</td></tr><tr><td><code>二分查找 (Bisect)</code></td><td>通过二分查找定位引入 bug 的提交。适用于快速定位问题代码。</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> (查看操作记录)</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> (设置上游分支)</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="git-命令">Git 命令<a href="https://www.geuni.tech/zh-Hans/git-commands-and-glossary#git-%E5%91%BD%E4%BB%A4" class="hash-link" aria-label="Git 命令的直接链接" title="Git 命令的直接链接">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-仓库配置">1. 仓库配置<a href="https://www.geuni.tech/zh-Hans/git-commands-and-glossary#1-%E4%BB%93%E5%BA%93%E9%85%8D%E7%BD%AE" 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/zh-Hans/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>，如果是通过 Homebrew 安装的 Git，可能位于 <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> 选项查看配置文件的位置（例如：<code>git config --global -e</code>）。</p>
<p><strong>global vs. local</strong> 通常用户信息使用global配置，项目特定设置使用local配置。</p>
<p><strong>配置优先级：</strong> local config&gt; global config &gt; system config</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/zh-Hans/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"># 设置别名（常用别名）</span><span class="token plain"></span><br></span><span 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"># 查看所有别名</span><span class="token plain"></span><br></span><span 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"># 删除别名</span><span class="token plain"></span><br></span><span 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. 2. 通过配置文件 .gitconfig 设置alias</strong>
你也可以直接编辑 <code>.gitconfig</code> 文件来设置别名。<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/zh-Hans/git-commands-and-glossary#2-%E5%88%9B%E5%BB%BA%E4%BB%93%E5%BA%93" class="hash-link" aria-label="2. 创建仓库的直接链接" title="2. 创建仓库的直接链接">​</a></h3>
<p>创建 Git 仓库的方式有两种：<code>git init</code> 和 <code>git clone</code>。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="git-init">git init<a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/git-commands-and-glossary#git-clone" class="hash-link" aria-label="git clone的直接链接" title="git clone的直接链接">​</a></h4>
<p><code>git clone</code> 是 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>使用示例：</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/zh-Hans/git-commands-and-glossary#3-%E5%8F%98%E6%9B%B4%E8%B7%9F%E8%B8%AA%E4%B8%8E%E7%AE%A1%E7%90%86" 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/zh-Hans/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>使用示例:</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/zh-Hans/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/zh-Hans/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/zh-Hans/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>可以保存多个 stash，每个 stash 都有一个唯一的标识符（<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>查看已保存的 stash 列表。</td></tr><tr><td><code>git stash apply</code></td><td>应用最近保存的 stash。</td></tr><tr><td><code>git stash apply &lt;stash&gt;</code></td><td>应用特定的 stash。</td></tr><tr><td><code>git stash pop</code></td><td>应用最近保存的 stash 并从栈中移除。</td></tr><tr><td><code>git stash drop</code></td><td>移除最近保存的 stash。</td></tr><tr><td><code>git stash clear</code></td><td>移除所有 stash。</td></tr><tr><td><code>git stash show</code></td><td>查看最近保存的 stash 的变更内容。</td></tr><tr><td><code>git stash show -p</code></td><td>以补丁格式查看最近保存的 stash 的变更内容。</td></tr><tr><td><code>git stash --include-untracked</code></td><td>将未跟踪的文件也保存到 stash 中。</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"># 查看已保存的 stash 列表</span><span class="token plain"></span><br></span><span 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"># 应用最近保存的 stash</span><span class="token plain"></span><br></span><span 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"># 应用特定的 stash</span><span class="token plain"></span><br></span><span 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"># 应用最近保存的 stash 并从栈中移除</span><span class="token plain"></span><br></span><span 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"># 移除最近保存的 stash</span><span class="token plain"></span><br></span><span 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"># 移除所有 stash</span><span class="token plain"></span><br></span><span 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"># 查看最近保存的 stash 的变更内容</span><span class="token plain"></span><br></span><span 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"># 以补丁格式查看最近保存的 stash 的变更内容</span><span class="token plain"></span><br></span><span 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"># 将未跟踪的文件也保存到 stash 中</span><span class="token plain"></span><br></span><span 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/zh-Hans/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><strong>提交哈希 (Commit Hash):</strong> 用于唯一标识提交的 40 位 SHA-1 哈希值。<!-- -->
<ul>
<li>哈希值基于提交的内容（变更、作者、日期等）生成。</li>
</ul>
</li>
<li><strong>树对象 (Tree Object):</strong> 表示提交时工作目录结构的对象。<!-- -->
<ul>
<li>树对象存储文件和目录的结构，并包含每个文件的哈希值。</li>
<li>通过树对象可以重建提交时的文件状态。</li>
</ul>
</li>
<li><strong>父提交 (Parent Commit):</strong> 指向当前提交的上一个提交（父提交）的哈希值。<!-- -->
<ul>
<li>通常有一个父提交，但合并提交可能有两个或多个父提交。</li>
<li>通过父提交可以追踪提交历史。</li>
</ul>
</li>
<li><strong>作者 (Author):</strong> 创建提交的人的姓名和邮箱。</li>
<li><strong>提交者 (Committer):</strong> 实际将提交记录到仓库的人的姓名和邮箱。（可能与作者不同）</li>
<li><strong>提交日期 (Commit Date):</strong> 提交创建的日期和时间。</li>
<li><strong>提交消息 (Commit Message):</strong> 对提交变更的描述。</li>
<li><strong>GPG 签名 (GPG Signature) (可选):</strong> 使用 <code>--gpg-sign</code> 选项为提交添加 GPG 签名，确保提交的完整性（是否被篡改）。</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">"添加新功能"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 自动暂存已跟踪文件的变更并提交</span><span class="token plain"></span><br></span><span 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">"更新已跟踪文件"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 修改最新提交（更改提交消息或添加文件）</span><span class="token plain"></span><br></span><span 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"># 提交前不运行钩子脚本</span><span class="token plain"></span><br></span><span 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">"绕过钩子"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建空提交（无变更提交）</span><span class="token plain"></span><br></span><span 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">"空提交"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><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">"添加签名"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><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/zh-Hans/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>以美观格式输出提交信息。（例如：<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"># 以美观格式输出提交信息</span><span class="token plain"></span><br></span><span 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/zh-Hans/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/zh-Hans/git-commands-and-glossary#5-%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86" 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/zh-Hans/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/zh-Hans/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>因为仍然被广泛使用，说目前没有弃用计划。</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/zh-Hans/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 版本引入的一个新命令，它的主要目的是为了取代传统的 <code>git checkout</code> 命令，提供一种更简洁、直观的分支切换方式。</p>
<p><strong>为什么引入 git switch？</strong></p>
<ul>
<li><strong>更清晰的命令意图:</strong> git switch 的命令名更明确地表达了它的功能，即切换分支。</li>
<li><strong>减少歧义:</strong> git checkout 命令既可以用于创建新分支，也可以用于切换分支，这在某些情况下可能会导致混淆。</li>
<li><strong>更符合直觉:</strong> switch 这个词在日常生活中更常用于表示切换，因此更容易记忆和理解。</li>
</ul>
<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/zh-Hans/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> (默认)</td><td>无分叉或分叉内容相同</td><td>将分支指针移动到目标分支的末尾。保持历史线性，且不生成合并提交。</td></tr><tr><td><code>--ff-only</code></td><td>无分叉</td><td>仅允许快进合并，如果无法快进合并则中止操作。适用于需要保持历史线性时。</td></tr><tr><td><code>--no-ff</code></td><td>无条件</td><td>无论是否可以进行快进合并，始终生成合并提交。在历史中清晰记录合并操作。</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">* 合并 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">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">2. 执行 `git merge --ff feature`（在快进合并条件下）</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><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>
<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 合并（无法 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"># 将指定分支的变更压缩为一个提交并合并</span><span class="token plain"></span><br></span><span 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/zh-Hans/git-commands-and-glossary#6-%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93" 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/zh-Hans/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/zh-Hans/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>拉取变更后执行变基（rebase）而非合并。</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>自动暂存工作目录中的变更，合并后再恢复。</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 合并（无法 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/zh-Hans/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"># 推送前不运行钩子脚本</span><span class="token plain"></span><br></span><span 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/zh-Hans/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> 不同，<code>fetch</code> 不会自动合并变更。因此，它更安全，允许用户在需要时手动合并。</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> 命令及选项                      </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row table-header important"> 说明                                                                                             </span><span class="token table table-header-row punctuation" style="color:#393A34">|</span><span class="token table table-header-row"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-header-row"></span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line punctuation" style="color:#393A34">-------------------------------------</span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line punctuation" style="color:#393A34">------------------------------------------------------------------------------------------------</span><span class="token table table-line punctuation" style="color:#393A34">|</span><span class="token table table-line"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-line"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch`</span><span class="token table table-data-rows table-data">                         </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 拉取远程仓库的所有变更。                                                           </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch &lt;remote&gt;`</span><span class="token table table-data-rows table-data">                </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 拉取指定远程仓库的所有变更。                                                    </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch &lt;remote&gt; &lt;branch&gt;`</span><span class="token table table-data-rows table-data">       </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 拉取指定远程仓库的特定分支变更。                                                       </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch --all`</span><span class="token table table-data-rows table-data">                   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 拉取所有远程仓库的数据。                                                              </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch --prune`</span><span class="token table table-data-rows table-data">                 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 清理本地不存在的远程分支。                                                                  </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch --tags`</span><span class="token table table-data-rows table-data">                  </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 拉取远程仓库的所有标签。                                                                </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> </span><span class="token table table-data-rows table-data code-snippet code keyword" style="color:#00009f">`git fetch --force`</span><span class="token table table-data-rows table-data">                 </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows table-data"> 强制拉取远程数据，覆盖本地分支的变更。                                   </span><span class="token table table-data-rows punctuation" style="color:#393A34">|</span><span class="token table table-data-rows"></span><br></span><span class="token-line" style="color:#393A34"><span class="token table table-data-rows"></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token bold punctuation" style="color:#393A34">**</span><span class="token bold content">使用示例:</span><span class="token bold 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">```bash</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> 拉取远程仓库的所有变更</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git 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 title important punctuation" style="color:#393A34">#</span><span class="token title important"> 拉取指定远程仓库的所有变更</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git 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 title important punctuation" style="color:#393A34">#</span><span class="token title important"> 拉取指定远程仓库的特定分支变更</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git 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 title important punctuation" style="color:#393A34">#</span><span class="token title important"> 拉取所有远程仓库的变更</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git fetch --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 title important punctuation" style="color:#393A34">#</span><span class="token title important"> 清理本地不存在的远程分支</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git fetch --prune</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> 拉取远程仓库的所有标签</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git fetch --tags</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token title important punctuation" style="color:#393A34">#</span><span class="token title important"> 强制拉取远程数据，覆盖本地分支的变更</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">git fetch --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/zh-Hans/git-commands-and-glossary#7-%E6%A0%87%E7%AD%BE" 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/zh-Hans/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/zh-Hans/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/zh-Hans/git-commands-and-glossary#8-%E6%8F%90%E4%BA%A4%E8%AE%B0%E5%BD%95%E6%97%A5%E5%BF%97" 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/zh-Hans/git-commands-and-glossary#git-log">🔗git log</a><a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/git-commands-and-glossary#git-show">🔗git show</a><a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/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/zh-Hans/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 中 <code>HEAD</code> 和分支的移动记录。该命令在恢复误删的分支或提交时非常有用。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/zh-Hans/git-commands-and-glossary#9-%E6%92%A4%E9%94%80%E4%BF%AE%E6%94%B9%E5%8F%8A%E5%9B%9E%E9%80%80" 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/zh-Hans/git-commands-and-glossary#git-checkout">🔗git checkout</a><a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/git-commands-and-glossary#git-reset" class="hash-link" aria-label="git reset的直接链接" title="git reset的直接链接">​</a></h4>
<p><code>git reset</code> 命令是 Git 中一个非常强大的命令，用于回退版本。它可以将当前 HEAD 指向不同的提交，从而达到撤销修改的目的。</p>
<p><strong>reset 命令有三种模式，对工作区、暂存区有不同影响：</strong></p>
<table><thead><tr><th><strong>模式    </strong></th><th><strong>作用</strong></th><th><strong>影响范围</strong></th><th><strong>使用场景</strong></th></tr></thead><tbody><tr><td><code>--soft</code></td><td>仅移动分支指针（HEAD），不修改暂存区和工作目录。</td><td>- 分支指针移动到指定提交<br> - 暂存区和工作目录保持不变</td><td>撤销提交但保留更改在暂存区，便于重新提交。</td></tr><tr><td><code>--mixed</code></td><td>移动分支指针（HEAD）并重置暂存区，但不修改工作目录。</td><td>- 分支指针移动到指定提交<br> - 暂存区被重置<br> - 工作目录保持不变</td><td>撤销提交并取消暂存更改，但保留工作目录中的修改。</td></tr><tr><td><code>--hard</code></td><td>移动分支指针（HEAD）、重置暂存区和工作目录。</td><td>- 分支指针移动到指定提交<br> - 暂存区被重置<br> - 工作目录被重置</td><td>完全丢弃最近的提交和所有更改，恢复到指定提交的状态。</td></tr></tbody></table>
<p><strong>示例命令对比：</strong></p>
<table><thead><tr><th><strong>命令</strong></th><th><strong>效果</strong></th></tr></thead><tbody><tr><td><code>git reset --soft HEAD~1</code></td><td>撤销最近一次提交，但保留更改在暂存区。</td></tr><tr><td><code>git reset --mixed HEAD~1</code></td><td>撤销最近一次提交，并将更改从暂存区移除，但保留工作目录中的修改。</td></tr><tr><td><code>git reset --hard HEAD~1</code></td><td>撤销最近一次提交，并丢弃所有暂存区和工作目录的更改。</td></tr></tbody></table>
<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/zh-Hans/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 版本引入的一个新命令，用于简化和改进文件恢复操作。它比 <code>git checkout</code> 和<code> git reset</code> 命令更专注于恢复文件内容和工作区状态。</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/zh-Hans/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/zh-Hans/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>在 rebase 过程中发生冲突时，解决冲突后需运行 <code>git rebase --continue</code>。</li>
<li>在交互模式（<code>-i</code>）下，可以修改、删除、合并或重新排序提交。（例如，将 <code>pick</code> 改为 <code>squash</code> 可以将多个提交合并为一个。）</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>解决冲突后继续 rebase。</td></tr><tr><td><code>git rebase --abort</code></td><td>中止 rebase 并恢复到原始状态。</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>自动暂存工作目录中的更改，rebase 后恢复。</td></tr><tr><td><code>git rebase --root</code></td><td>从初始提交开始执行 rebase。</td></tr><tr><td><code>git rebase --no-verify</code></td><td>在 rebase 前不运行钩子（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"># 解决冲突后继续 rebase</span><span class="token plain"></span><br></span><span 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"># 中止 rebase 并恢复到原始状态</span><span class="token plain"></span><br></span><span 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"># 自动暂存工作目录中的更改，rebase 后恢复</span><span class="token plain"></span><br></span><span 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"># 从初始提交开始执行 rebase</span><span class="token plain"></span><br></span><span 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"># 在 rebase 前不运行钩子脚本</span><span class="token plain"></span><br></span><span 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/zh-Hans/git-commands-and-glossary#11-%E5%AD%90%E6%A8%A1%E5%9D%97" 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/zh-Hans/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/zh-Hans/git-commands-and-glossary#12-%E5%85%B6%E4%BB%96%E6%9C%89%E7%94%A8%E7%9A%84%E5%91%BD%E4%BB%A4" 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/zh-Hans/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> 直译过来就是“挑选樱桃”，它允许你从其他分支中“摘取”特定的提交（commit），并将其应用到当前分支上。换句话说，你可以将某个分支上的单个提交“复制”到另一个分支。</p>
<p>**为什么使用 Cherry-Pick？</p>
<ul>
<li>
<p>选择性合并: 当你只想从另一个分支合并特定的修改，而不是整个分支时。</p>
</li>
<li>
<p>修复bug: 如果在某个分支上修复了一个bug，想要将这个修复应用到其他分支。</p>
</li>
<li>
<p>在 <code>cherry-pick</code> 过程中发生冲突时，解决冲突后需运行 <code>git cherry-pick --continue</code>。</p>
</li>
<li>
<p>若要中止冲突解决，可以使用 <code>git cherry-pick --abort</code>。</p>
</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/zh-Hans/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）来定位引入 bug 的提交的命令。该命令在精确查找 bug 何时引入时非常有用。<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:encoded>
            <category>Git</category>
        </item>
        <item>
            <title><![CDATA[用 Docusaurus 创建属于自己的博客]]></title>
            <link>https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus</link>
            <guid>https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus</guid>
            <pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[了解如何使用 Docusaurus 搭建功能强大且易于维护的个人博客。从安装、配置 Blog-only 模式到 SEO 优化与多语言支持，本指南涵盖了所有关键步骤，帮助您快速构建并发布自己的在线博客平台。]]></description>
            <content:encoded><![CDATA[<p>之前我一直使用 Jekyll 构建我的博客，直到偶然接触到 Docusaurus 并立即被其吸引，于是决定尝试迁移。</p>
<p>Docusaurus 提供了简洁直观的用户界面、强大的代码块展示功能、活跃的社区支持以及丰富的插件生态，加上由 Meta（原 Facebook）维护的背景，这些优点让我对它一见钟情。</p>
<p>在转移过程中，我梳理了从基础安装到契合我个人需求的相关操作内容。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="什么是-docusaurus">什么是 Docusaurus<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#%E4%BB%80%E4%B9%88%E6%98%AF-docusaurus" class="hash-link" aria-label="什么是 Docusaurus的直接链接" title="什么是 Docusaurus的直接链接">​</a></h3>
<p>Docusaurus 是一个基于 React 和 MDX 的静态网站生成工具，现在由 Meta 维护，是一个开源项目。它的设计初衷是让用户能够快速、轻松地创建文档类网站。</p>
<p>以下是它的一些主要特点：</p>
<ul>
<li>文档与博客功能：强大的文档支持，同时能轻松创建多种类型的网站。</li>
<li>基于 MDX：结合 Markdown 语法与 React 组件，支持扩展性的内容创作。</li>
<li>多语言支持 (i18n)：轻松实现多语言网站。</li>
<li>SEO 友好：自动生成站点地图（sitemap）和元标签（meta tags）等。</li>
<li>代码块：支持强大的 <code>Syntax highlighting</code> 功能。</li>
<li>易于部署：支持在 Vercel、GitHub Pagesl、Netlify 等平台上轻松部署。</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装">安装<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#%E5%AE%89%E8%A3%85" 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> 后，可以通过以下命令创建一个新的 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 plain">npx create-docusaurus@latest my-site classic </span><span class="token parameter variable" style="color:#36acaa">--typescript</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 启动本地开发服务器</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> my-site</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run start</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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> 后应该能看到默认的 Docusaurus 页面。
<img decoding="async" loading="lazy" alt="Docusaurus" src="https://www.geuni.tech/zh-Hans/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/zh-Hans/creating-a-personal-blog-using-docusaurus#blog-only-%E6%A8%A1%E5%BC%8F" class="hash-link" aria-label="Blog-only 模式的直接链接" title="Blog-only 模式的直接链接">​</a></h3>
<p>如果你不打算要额外的着陆页，并希望首页直接展示博文列表，可以进行如下修改：</p>
<ol>
<li>删除 <code>./src/pages/index.{js,tsx}</code> 文件，以防止多个文件映射到同一路径。</li>
<li>在 <code>docusaurus.config.ts</code> 中，将blog模块的 <code>routeBasePath</code> 设置为根路径 <code>/</code>：</li>
</ol>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_Ktv7">docusaurus.config.ts</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">default</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">presets</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token string" style="color:#e3116c">'@docusaurus/preset-classic'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">docs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Optional: disable the docs plugin</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">blog</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">routeBasePath</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'/'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Serve the blog at the site's root</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/zh-Hans/creating-a-personal-blog-using-docusaurus#%E5%A4%9A%E8%AF%AD%E8%A8%80-i18n-%E9%85%8D%E7%BD%AE" class="hash-link" aria-label="多语言 (i18n) 配置的直接链接" title="多语言 (i18n) 配置的直接链接">​</a></h3>
<p>随着 ChatGPT 等工具的出现，管理和运营多语言博客变得更为简便。Docusaurus 内置了 <code>i18n</code> 支持，通过简单的设置即可添加多种语言。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-多语言配置">1. 多语言配置<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#1-%E5%A4%9A%E8%AF%AD%E8%A8%80%E9%85%8D%E7%BD%AE" 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">'zh-Hans'</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">'zh-Hans'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'en'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">localeConfigs</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token string-property property" style="color:#36acaa">'zh-Hans'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">label</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'中文'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">htmlLang</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'zh-CN'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">themeConfig</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">navbar</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token literal-property property" style="color:#36acaa">items</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">          </span><span class="token literal-property property" style="color:#36acaa">type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'localeDropdown'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">position</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'left'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/zh-Hans/creating-a-personal-blog-using-docusaurus#2-%E7%94%9F%E6%88%90%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%96%87%E4%BB%B6" class="hash-link" aria-label="2. 生成多语言文件的直接链接" title="2. 生成多语言文件的直接链接">​</a></h4>
<p>利用 <code>write-translations</code> 命令，根据配置的语言自动生成 i18n 目录及其 JSON 文件，用于存储各语言的内容，以便后续翻译工作。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run write-translations -- </span><span class="token parameter variable" style="color:#36acaa">--locale</span><span class="token plain"> zh-Hans</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">npm</span><span class="token plain"> run write-translations -- </span><span class="token parameter variable" style="color:#36acaa">--locale</span><span class="token plain"> en</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>将默认语言的文章存放在 <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">│ # 已翻译的博文</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 options的翻译</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/zh-Hans/creating-a-personal-blog-using-docusaurus#seo---sitemap%E9%85%8D%E7%BD%AE" 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>此功能仅在生产环境中启用。</p></div></div>
<p>Docusaurus 默认集成了 <a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-sitemap" target="_blank" rel="noopener noreferrer">plugin-sitemap</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>需要注意的是，当配置 i18n 后，每种语言都会生成独立的sitemap。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="code-blocks">Code blocks<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#code-blocks" class="hash-link" aria-label="Code blocks的直接链接" title="Code blocks的直接链接">​</a></h3>
<p>Docusaurus 的代码块功能非常强大，尽管 Docusaurus 默认支持多种编程语言的语法高亮，但某些常用语言（如 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>
<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/zh-Hans/creating-a-personal-blog-using-docusaurus#google-%E6%95%B4%E5%90%88" 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/zh-Hans/creating-a-personal-blog-using-docusaurus#google-analytics-%E9%85%8D%E7%BD%AE" 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>此功能仅在生产环境中启用。</p></div></div>
<p>只需通过<a href="https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-google-gtag#ex-config" target="_blank" rel="noopener noreferrer">预设配置项</a> ，Docusaurus 即可轻松集成 Google Analytics：</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/zh-Hans/creating-a-personal-blog-using-docusaurus#google-adsense-%E9%9B%86%E6%88%90" class="hash-link" aria-label="Google Adsense 集成的直接链接" title="Google Adsense 集成的直接链接">​</a></h4>
<p>Google Adsense 的集成非常简单，只需要加载对应的脚本即可。可以使用 <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="url迁移">URL迁移<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#url%E8%BF%81%E7%A7%BB" class="hash-link" aria-label="URL迁移的直接链接" title="URL迁移的直接链接">​</a></h3>
<p>在迁移博客时，如果 URL 结构发生变化，可能会导致链接失效。为了避免这种情况，需要进行 URL 迁移工作。Docusaurus 支持通过 slug 设置或重定向方式进行 URL 迁移。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="front-matter---slug">Front Matter - <code>slug</code><a href="https://www.geuni.tech/zh-Hans/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 的 <a href="https://docusaurus.io/docs/next/api/plugins/@docusaurus/plugin-content-blog#markdown-front-matter" target="_blank" rel="noopener noreferrer">front matter</a> 中可以使用 slug 属性自由设置博客文章或页面的 URL。例如，可以通过 <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="redirects">Redirects<a href="https://www.geuni.tech/zh-Hans/creating-a-personal-blog-using-docusaurus#redirects" class="hash-link" aria-label="Redirects的直接链接" title="Redirects的直接链接">​</a></h4>
<p>在URL迁移时，重定向也是一种常用方法。Docusaurus支持客户端重定向，但这对SEO来说并不是最佳方式。</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/zh-Hans/creating-a-personal-blog-using-docusaurus#server-side-redirect-%E6%8E%A8%E8%8D%90" class="hash-link" aria-label="Server-side redirect (推荐)的直接链接" title="Server-side redirect (推荐)的直接链接">​</a></h5>
<p>Google官方文档能看到，使用服务端(301)重定向不会影响Page rank。</p>
<p>相关Google文档：<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>相比之下，客户端重定向有时可能无法被搜索引擎正确处理，或者新的URL无法获得适当的评估。</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">Google文档</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/zh-Hans/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>配置示例：</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/zh-Hans/creating-a-personal-blog-using-docusaurus#%E9%83%A8%E7%BD%B2-cicd" class="hash-link" aria-label="部署 (CI/CD)的直接链接" title="部署 (CI/CD)的直接链接">​</a></h3>
<p>选择托管平台时，Vercel、GitHub Pages、Netlify 等都是不错的选择。</p>
<p>作为一位长期使用 Vercel 的用户，我特别推荐新手选择 Vercel，因为它的设置过程极其简便，只需几次点击就能将 GitHub 项目导入并配置 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/zh-Hans/creating-a-personal-blog-using-docusaurus#%E7%BB%93%E8%AF%AD" class="hash-link" aria-label="结语的直接链接" title="结语的直接链接">​</a></h3>
<p>花了一个周末的时间，完成了从Jekyll到Docusaurus的迁移。</p>
<p>在这篇文章里，我总结了从基本设置到迁移的关键步骤和实用技巧，希望能帮助有需要的朋友轻松构建出自己理想的网站。</p>]]></content:encoded>
            <category>Docusaurus</category>
            <category>Blog</category>
        </item>
        <item>
            <title><![CDATA[RHCE9练习题 (EX294)]]></title>
            <link>https://www.geuni.tech/zh-Hans/linux/rhce_practice</link>
            <guid>https://www.geuni.tech/zh-Hans/linux/rhce_practice</guid>
            <pubDate>Fri, 27 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[RHCE 9 (EX294) 备考实战指南：涵盖 Ansible 安装配置、YUM 仓库配置、软件包管理、SELinux 系统角色、Ansible Galaxy 角色、逻辑卷管理、文件操作、用户管理、密码库加密、定时任务 (cron) 等核心考点。通过实例练习，助您高效备战 RHCE 认证考试。]]></description>
            <content:encoded><![CDATA[<h4 class="anchor anchorWithStickyNavbar_LWe7" id="lab环境">Lab环境<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#lab%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Lab环境的直接链接" title="Lab环境的直接链接">​</a></h4>
<table><thead><tr><th><strong>FQDN</strong></th><th><strong>Description</strong></th><th><strong>IP Addresses</strong></th><th><strong>Roles</strong></th></tr></thead><tbody><tr><td>control.lab.example.com</td><td>control</td><td>172.25.250.254</td><td>ansible control node</td></tr><tr><td>classroom.lab.example.com</td><td>classroom</td><td>172.25.250.254</td><td>materials</td></tr><tr><td>content.lab.example.com</td><td>content</td><td>172.25.250.254</td><td>YUM repo</td></tr><tr><td>node1.lab.example.com</td><td>node1</td><td>172.25.250.9</td><td>ansible managed node</td></tr><tr><td>node2.lab.example.com</td><td>node2</td><td>172.25.250.10</td><td>ansible managed node</td></tr><tr><td>node3.lab.example.com</td><td>node3</td><td>172.25.250.11</td><td>ansible managed node</td></tr><tr><td>node4.lab.example.com</td><td>node4</td><td>172.25.250.12</td><td>ansible managed node</td></tr><tr><td>node5.lab.example.com</td><td>node5</td><td>172.25.250.13</td><td>ansible managed node</td></tr><tr><td>utility.lab.example.com</td><td>utilit</td><td>172.25.250.220</td><td>utility</td></tr></tbody></table>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-安装和配置-ansible">1. 安装和配置 Ansible<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#1-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE-ansible" class="hash-link" aria-label="1. 安装和配置 Ansible的直接链接" title="1. 安装和配置 Ansible的直接链接">​</a></h4>
<p>在控制节点 <em><strong>control</strong></em> 上安装并配置 Ansible，要求如下：</p>
<ol>
<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>playbook中角色的位置包括 <em><strong>/home/greg/ansible/roles</strong></em>。</li>
<li>自定义collection目录为 <em><strong>/home/greg/ansible/mycollection</strong></em>。</li>
</ul>
</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 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"># 安装软件包</span><span class="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"> ansible-core 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"># 创建清单文件</span><span class="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"># 确认清单文件的正确性</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-配置系统以使用默认存储库">2. 配置系统以使用默认存储库<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#2-%E9%85%8D%E7%BD%AE%E7%B3%BB%E7%BB%9F%E4%BB%A5%E4%BD%BF%E7%94%A8%E9%BB%98%E8%AE%A4%E5%AD%98%E5%82%A8%E5%BA%93" class="hash-link" aria-label="2. 配置系统以使用默认存储库的直接链接" title="2. 配置系统以使用默认存储库的直接链接">​</a></h4>
<p>作为系统管理员，您需要在受管节点上安装软件。</p>
<p>请按照正⽂所述，创建一个名为 <em><strong>/home/greg/ansible/yum_repo.yml</strong></em> 的剧本，在各个受管节点上安装 yum 存储库。</p>
<ul>
<li>配置存储库1：<!-- -->
<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>配置存储库2：<!-- -->
<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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3安装软件包">3.安装软件包<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#3%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E5%8C%85" class="hash-link" aria-label="3.安装软件包的直接链接" title="3.安装软件包的直接链接">​</a></h4>
<p>创建一个名为 <em><strong>/home/greg/ansible/packages.yml</strong></em> 的playbook，并按以下要求在受管节点上安装软件包：</p>
<ol>
<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>
</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 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="4使用-rhel-系统角色">4.使用 RHEL 系统角色<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#4%E4%BD%BF%E7%94%A8-rhel-%E7%B3%BB%E7%BB%9F%E8%A7%92%E8%89%B2" class="hash-link" aria-label="4.使用 RHEL 系统角色的直接链接" title="4.使用 RHEL 系统角色的直接链接">​</a></h4>
<p>创建一个名为 <em><strong>/home/greg/ansible/selinux.yml</strong></em> 的playbook，满足以下要求：</p>
<ol>
<li>在 <strong>所有受管节点</strong> 上运行。</li>
<li>使用 RHEL 提供的 <em><strong>selinux</strong></em> 系统角色。</li>
<li>将受管节点的 SELinux 配置为 <em><strong>enforcing</strong></em> 模式。</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"># 查询系统角色包名</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" 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">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包安装的role，用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><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="5配置-collection">5.配置 Collection<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#5%E9%85%8D%E7%BD%AE-collection" class="hash-link" aria-label="5.配置 Collection的直接链接" title="5.配置 Collection的直接链接">​</a></h4>
<ul>
<li><a href="http://classroom/materials" target="_blank" rel="noopener noreferrer">http://classroom/materials</a>
<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>上⾯3个collection安装到 <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"># install</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="6使用ansible-galaxy-安装角色">6.使用Ansible Galaxy 安装角色<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#6%E4%BD%BF%E7%94%A8ansible-galaxy-%E5%AE%89%E8%A3%85%E8%A7%92%E8%89%B2" class="hash-link" aria-label="6.使用Ansible Galaxy 安装角色的直接链接" title="6.使用Ansible Galaxy 安装角色的直接链接">​</a></h4>
<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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="7创建和使用角色">7.创建和使用角色<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#7%E5%88%9B%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8%E8%A7%92%E8%89%B2" class="hash-link" aria-label="7.创建和使用角色的直接链接" title="7.创建和使用角色的直接链接">​</a></h4>
<p>根据以下要求，在目录 <em><strong>/home/greg/ansible/roles</strong></em> 中创建一个名为 <em><strong>apache</strong></em> 的角色，并满足以下条件：</p>
<ul>
<li>httpd 软件包已安装，设为在 <em><strong>系统启动时启⽤<em><strong>并</strong></em>启动</strong></em></li>
<li><em><strong>防⽕墙</strong></em> 已启⽤并正在运⾏，并使⽤允许访问 Web 服务器的规则</li>
<li>模板⽂件 index.html.j2 已存在，⽤于创建具有以下输出的⽂件<!-- -->
<ul>
<li><em><strong>/var/www/html/index.html</strong></em> ：<br>
<em>Welcome to HOSTNAME on IPADDRESS</em> <br>
其中，HOSTNAME 是受管节点的 完全限定域名 ， IPADDRESS 则是受管节点的 IP 地址。</li>
</ul>
</li>
</ul>
<p>创建⼀个名为 <em><strong>/home/greg/ansible/apache.yml</strong></em> 的 playbook：</p>
<ul>
<li>该 play 在 <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</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">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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="8从-ansible-galaxy-使用角色">8.从 Ansible Galaxy 使用角色<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#8%E4%BB%8E-ansible-galaxy-%E4%BD%BF%E7%94%A8%E8%A7%92%E8%89%B2" class="hash-link" aria-label="8.从 Ansible Galaxy 使用角色的直接链接" title="8.从 Ansible Galaxy 使用角色的直接链接">​</a></h4>
<p>根据下列要求，创建一个名为 <em><strong>/home/greg/ansible/roles.yml</strong></em> 的 playbook：</p>
<ul>
<li>
<p><em><strong>playbook</strong></em> 中包含一个 play，该play在 <em><strong>balancers</strong></em> 主机组中的主机上运行并将使用 <em><strong>balancer</strong></em> 角色。</p>
<ul>
<li>此角色配置一项服务，以在 <em><strong>webservers</strong></em> 主机组中的主机之间平衡 Web 服务器请求的负载。</li>
<li>浏览到 <em><strong>balancers</strong></em> 主机组中的主机（例如 <em><strong><a href="http://172.25.250.13/" target="_blank" rel="noopener noreferrer">http://172.25.250.13</a></strong></em>) 将生成以下输出：
<em><strong>Welcome to node3.lab.example.com on 172.25.250.11</strong></em></li>
<li>重新加载浏览器将从另一 Web 服务器生成输出：<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> 中包含一个play，该play在 <em><strong>webservers</strong></em> 主机组中的主机上运行并将使用 <em><strong>phpinfo</strong></em> 角色。</p>
<ul>
<li>请通过 URL <em><strong>/hello.php</strong></em> 浏览到 <em><strong>webservers</strong></em> 主机组中的主机，将生成以下输出：<br>
<em><strong>Hello PHP World from FQDN</strong></em></li>
<li>其中 <em><strong>FQDN</strong></em> 是主机的完全限定名称。</li>
<li>示例输出：
<em><strong>Hello PHP World from node3.lab.example.com</strong></em> <br>
另外还有 PHP 配置的各种详细信息，如安装的 PHP 版本等。</li>
</ul>
</li>
<li>
<p>同样，浏览到 <em><strong><a href="http://172.25.250.12/hello.php" target="_blank" rel="noopener noreferrer">http://172.25.250.12/hello.php</a></strong></em> 会生成以下输出：<br>
<em><strong>Hello PHP World from node4.lab.example.com</strong></em> <br>
另外还有 PHP 配置的各种详细信息，如安装的 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="9创建和使用逻辑卷">9.创建和使用逻辑卷<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#9%E5%88%9B%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8%E9%80%BB%E8%BE%91%E5%8D%B7" class="hash-link" aria-label="9.创建和使用逻辑卷的直接链接" title="9.创建和使用逻辑卷的直接链接">​</a></h4>
<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>如果卷组 research 不存在，应显⽰错误信息<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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/lv.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 done 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空间不足，LV只分配了800M</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></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="10生成主机文件">10.生成主机文件<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#10%E7%94%9F%E6%88%90%E4%B8%BB%E6%9C%BA%E6%96%87%E4%BB%B6" class="hash-link" aria-label="10.生成主机文件的直接链接" title="10.生成主机文件的直接链接">​</a></h4>
<ul>
<li>将⼀个初始模板⽂件从 <em><strong><a href="http://classroom/materials/hosts.j2" target="_blank" rel="noopener noreferrer">http://classroom/materials/hosts.j2</a></strong></em> 下载到***/home/greg/ansible***</li>
<li>完成该模板，以便⽤它⽣成以下⽂件：针对每个清单主机包含⼀⾏内容，其格式与***/etc/hosts*** 相同</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>该 playbook 运⾏后， <em><strong>dev</strong></em> 主机组中主机上的⽂件 <em><strong>/etc/myhosts</strong></em> 应针对<em><strong>每个受管主机</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><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="11修改文件内容">11.修改文件内容<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#11%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9" class="hash-link" aria-label="11.修改文件内容的直接链接" title="11.修改文件内容的直接链接">​</a></h4>
<p>按照下⽅所述，创建⼀个名为 <em><strong>/home/greg/ansible/issue.yml</strong></em> 的 playbook ：</p>
<ul>
<li>该 playbook 将在 <em><strong>所有清单主机</strong></em> 上运⾏</li>
<li>该 playbook 会将 <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>
</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"># 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 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="12创建-web-内容目录">12.创建 Web 内容目录<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#12%E5%88%9B%E5%BB%BA-web-%E5%86%85%E5%AE%B9%E7%9B%AE%E5%BD%95" class="hash-link" aria-label="12.创建 Web 内容目录的直接链接" title="12.创建 Web 内容目录的直接链接">​</a></h4>
<p>按照下列要求，创建一个名为 <em><strong>/home/greg/ansible/webcontent.yml</strong></em> 的 playbook：</p>
<ol>
<li>该 playbook 在 <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>在 dev 主机组中主机上浏览此⽬录（例如 <a href="http://172.25.250.9/webdev/" target="_blank" rel="noopener noreferrer">http://172.25.250.9/webdev/</a> ）将⽣成以下输出：<br>
<em><strong>Development</strong></em></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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="13生成硬件报告">13.生成硬件报告<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#13%E7%94%9F%E6%88%90%E7%A1%AC%E4%BB%B6%E6%8A%A5%E5%91%8A" class="hash-link" aria-label="13.生成硬件报告的直接链接" title="13.生成硬件报告的直接链接">​</a></h4>
<p>创建⼀个名为 /home/greg/ansible/hwreport.yml 的 playbook ，它将在所有受管节点上⽣成含有以下 信息的输出⽂件 /root/hwreport.txt ：</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>您的 playbook 应当：</p>
<ul>
<li>从 <em><strong><a href="http://classroom/materials/hwreport.empty" target="_blank" rel="noopener noreferrer">http://classroom/materials/hwreport.empty</a></strong></em> 下载⽂件，并将它保存为***/root/hwreport.txt***</li>
<li>使⽤ <em><strong>正确的值</strong></em> 改为 /root/hwreport.txt</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="14创建密码库">14.创建密码库<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#14%E5%88%9B%E5%BB%BA%E5%AF%86%E7%A0%81%E5%BA%93" class="hash-link" aria-label="14.创建密码库的直接链接" title="14.创建密码库的直接链接">​</a></h4>
<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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="15创建帐">15.创建⽤⼾帐⼾<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#15%E5%88%9B%E5%BB%BA%E5%B8%90" class="hash-link" aria-label="15.创建⽤⼾帐⼾的直接链接" title="15.创建⽤⼾帐⼾的直接链接">​</a></h4>
<p>创建⽤⼾帐⼾</p>
<ul>
<li>从 <em><strong><a href="http://classroom/materials/user_list.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/user_list.yml</a></strong></em> 下载要创建的⽤⼾的列表，并将它保存到 <em><strong>/home/greg/ansible</strong></em></li>
<li>在本次练习中使⽤在其他位置创建的密码库 <em><strong>/home/greg/ansible/locker.yml</strong></em> 。创建名为 <em><strong>/home/greg/ansible/users.yml</strong></em> 的playbook ，从⽽按以下所述创建⽤⼾帐⼾：<!-- -->
<ul>
<li>职位描述为 <em><strong>developer</strong></em> 的⽤⼾应当：<!-- -->
<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>职位描述为 <em><strong>manager</strong></em> 的⽤⼾应当：<!-- -->
<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>密码采⽤ <em><strong>sha512</strong></em> 哈希格式。</li>
<li>您的playbook应能够在本次练习中使⽤在其他位置创建的库密码⽂件***/home/greg/ansible/secret.txt*** 正常运⾏。</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="16更新-ansible-库的密钥">16.更新 Ansible 库的密钥<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#16%E6%9B%B4%E6%96%B0-ansible-%E5%BA%93%E7%9A%84%E5%AF%86%E9%92%A5" class="hash-link" aria-label="16.更新 Ansible 库的密钥的直接链接" title="16.更新 Ansible 库的密钥的直接链接">​</a></h4>
<p>按照下⽅所述，更新现有 Ansible 库的密钥：</p>
<ul>
<li>从 <em><strong><a href="http://classroom/materials/salaries.yml" target="_blank" rel="noopener noreferrer">http://classroom/materials/salaries.yml</a></strong></em> 下载 Ansible 库到***/home/greg/ansible***</li>
<li>当前的库密码为 <em><strong>insecure8sure</strong></em></li>
<li>新的库密码为 <em><strong>bbs2you9527</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"># 下载库文件</span><span class="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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="17配置-cron-作业">17.配置 cron 作业<a href="https://www.geuni.tech/zh-Hans/linux/rhce_practice#17%E9%85%8D%E7%BD%AE-cron-%E4%BD%9C%E4%B8%9A" class="hash-link" aria-label="17.配置 cron 作业的直接链接" title="17.配置 cron 作业的直接链接">​</a></h4>
<p>创建⼀个名为 <em><strong>/home/greg/ansible/cron.yml</strong></em> 的 playbook :</p>
<ul>
<li>该 playbook 在 <em><strong>test</strong></em> 主机组中的受管节点上运⾏</li>
<li>配置 <em><strong>cron</strong></em> 作业，该作业 <em><strong>每隔 2 分钟</strong></em> 运⾏并执⾏以下命令： <em>logger "EX200 in progress"</em> ，以⽤⼾ <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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> /home/greg/ansible/cron.yml</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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 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:encoded>
            <category>Linux</category>
            <category>RHCE</category>
        </item>
        <item>
            <title><![CDATA[RHCSA9练习题 (EX200)]]></title>
            <link>https://www.geuni.tech/zh-Hans/linux/rhcsa_practice</link>
            <guid>https://www.geuni.tech/zh-Hans/linux/rhcsa_practice</guid>
            <pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[提供了全面的RHEL 9系统Red Hat认证系统管理员(RHCSA) EX200考试的练习题和解决方案。它涵盖了重要的系统管理任务，包括网络配置、存储库设置、SELinux故障排除、用户和组管理、cron作业、共享目录、NTP、autofs、逻辑卷管理、交换分区、文件系统操作、使用Podman的容器镜像创建和管理、sudo配置以及使用tuned进行系统调优。非常适合RHCSA考试准备。]]></description>
            <content:encoded><![CDATA[<h4 class="anchor anchorWithStickyNavbar_LWe7" id="1-设置网络">1. 设置网络<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#1-%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C" class="hash-link" aria-label="1. 设置网络的直接链接" title="1. 设置网络的直接链接">​</a></h4>
<p>配置⽹络设置 将 node1 配置为具有以下⽹络配置：</p>
<ul>
<li>主机名： <em><strong>node1.domain250.example.com</strong></em></li>
<li>IP 地址： <em><strong>172.25.250.100</strong></em></li>
<li>⼦⽹掩码： <em><strong>255.255.255.0</strong></em></li>
<li>⽹关： <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"># 显示所有网络连接</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"># 修改连接信息</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 (已激活的情况下有重启作用)</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="2-配置您的系统以使默认存储库">2. 配置您的系统以使⽤默认存储库<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#2-%E9%85%8D%E7%BD%AE%E6%82%A8%E7%9A%84%E7%B3%BB%E7%BB%9F%E4%BB%A5%E4%BD%BF%E9%BB%98%E8%AE%A4%E5%AD%98%E5%82%A8%E5%BA%93" class="hash-link" aria-label="2. 配置您的系统以使⽤默认存储库的直接链接" title="2. 配置您的系统以使⽤默认存储库的直接链接">​</a></h4>
<p>YUM 存储库已可以从 <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> 和 <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> 使用配置您的系统，以将这些位置用作默认存储库</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><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>dnf 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="3-调试selinux">3. 调试SELinux<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#3-%E8%B0%83%E8%AF%95selinux" class="hash-link" aria-label="3. 调试SELinux的直接链接" title="3. 调试SELinux的直接链接">​</a></h4>
<p>非标准端口 <em><strong>82</strong></em> 上运行的 Web 服务器在提供内容时遇到问题。根据需要调试并解决问题，使其满足以下条件:</p>
<ul>
<li>系统上的 Web 服务器能够提供 <em><strong>/var/www/html</strong></em> 中所有现有的 HTML 文件(注:不要删除或以其他方式改动现有的文件内容)</li>
<li>Web 服务器在端口 <em><strong>82</strong></em> 上提供此内容</li>
<li>Web 服务器在系统启动时 <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 plain">systemctl status httpd</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" style="display:inline-block"></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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="4-创建帐">4. 创建⽤⼾帐⼾<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#4-%E5%88%9B%E5%BB%BA%E5%B8%90" class="hash-link" aria-label="4. 创建⽤⼾帐⼾的直接链接" title="4. 创建⽤⼾帐⼾的直接链接">​</a></h4>
<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> ,<em><strong>无权访问</strong></em>系统上的 <em><strong>交互式 shell</strong></em> 且不是 <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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="5-配置cron作业">5. 配置cron作业<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#5-%E9%85%8D%E7%BD%AEcron%E4%BD%9C%E4%B8%9A" class="hash-link" aria-label="5. 配置cron作业的直接链接" title="5. 配置cron作业的直接链接">​</a></h4>
<p>配置 <em><strong>cron</strong></em> 作业，以用户 <em><strong>harry</strong></em> 身份<em><strong>每天14:23 分</strong></em>执行 <em><strong>/usr/bin/echo hello</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"># 检查</span><span class="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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="6-创建协作录">6. 创建协作⽬录<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#6-%E5%88%9B%E5%BB%BA%E5%8D%8F%E4%BD%9C%E5%BD%95" class="hash-link" aria-label="6. 创建协作⽬录的直接链接" title="6. 创建协作⽬录的直接链接">​</a></h4>
<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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="7-配置-ntp">7. 配置 NTP<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#7-%E9%85%8D%E7%BD%AE-ntp" class="hash-link" aria-label="7. 配置 NTP的直接链接" title="7. 配置 NTP的直接链接">​</a></h4>
<p>配置您的系统，使其成为 <em><strong>materials.example.com</strong></em> 的 <em><strong>NTP</strong></em> 客户端。（注： materials.example.com 是 classroom.example.com 的 DNS 别名）</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="8-配置-autofs">8. 配置 autofs<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#8-%E9%85%8D%E7%BD%AE-autofs" class="hash-link" aria-label="8. 配置 autofs的直接链接" title="8. 配置 autofs的直接链接">​</a></h4>
<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>主目录必须可供其用户 <em><strong>写入</strong></em></li>
<li><em><strong>remoteuser1</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 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="9-配置帐">9. 配置⽤⼾帐⼾<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#9-%E9%85%8D%E7%BD%AE%E5%B8%90" class="hash-link" aria-label="9. 配置⽤⼾帐⼾的直接链接" title="9. 配置⽤⼾帐⼾的直接链接">​</a></h4>
<p>配置用户 <em><strong>manalo</strong></em> ，其用户 ID 为 <em><strong>3533</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="10-查找件-find">10. 查找⽂件 (find)<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#10-%E6%9F%A5%E6%89%BE%E4%BB%B6-find" class="hash-link" aria-label="10. 查找⽂件 (find)的直接链接" title="10. 查找⽂件 (find)的直接链接">​</a></h4>
<p>查找当&nbsp;<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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="11-查找字符串-grep">11. 查找字符串 (grep)<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#11-%E6%9F%A5%E6%89%BE%E5%AD%97%E7%AC%A6%E4%B8%B2-grep" class="hash-link" aria-label="11. 查找字符串 (grep)的直接链接" title="11. 查找字符串 (grep)的直接链接">​</a></h4>
<p>查找文件&nbsp;<em><strong>/usr/share/xml/iso-codes/iso_639_3.xml</strong></em> 中包含字符串 <em><strong>ng</strong></em> 的所有行。将所有这些行的副本按原始顺序放在文件&nbsp;<em><strong>/root/list</strong></em> 中。 <em><strong>/root/list</strong></em> 不得包含空行，且所有行必须是***/usr/share/xml/iso-codes/iso_639_3.xml*** 中原始行的确切副本。</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="12-创建存档">12. 创建存档<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#12-%E5%88%9B%E5%BB%BA%E5%AD%98%E6%A1%A3" class="hash-link" aria-label="12. 创建存档的直接链接" title="12. 创建存档的直接链接">​</a></h4>
<p>创建一个名为 <em><strong>/root/backup.tar.bz2</strong></em> 的tar 存档，其应包含 <em><strong>/usr/local</strong></em> 的 tar 存档，其应包含***/usr/local*** 的内容。该 tar 存档必须使用<em><strong>gzip2</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="13创建个容器镜像">13.创建⼀个容器镜像<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#13%E5%88%9B%E5%BB%BA%E4%B8%AA%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F" class="hash-link" aria-label="13.创建⼀个容器镜像的直接链接" title="13.创建⼀个容器镜像的直接链接">​</a></h4>
<p><em><strong>wallah</strong></em> 用户，下载 <em><strong><a href="http://classroom/Containerfile" target="_blank" rel="noopener noreferrer">http://classroom/Containerfile</a></strong></em>
不要修改这个文件内容，构建镜像名为 <em><strong>pdf</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"> 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="14-将容器配置为服务">14. 将容器配置为服务<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#14-%E5%B0%86%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE%E4%B8%BA%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="14. 将容器配置为服务的直接链接" title="14. 将容器配置为服务的直接链接">​</a></h4>
<p><em><strong>wallah</strong></em> 用户，配置一个systemd 服务</p>
<ul>
<li>容器名称为 <em><strong>ascii2pdf</strong></em></li>
<li>使用刚创建的镜像 <em><strong>pdf</strong></em></li>
<li>该服务命名为 <em><strong>container-ascii2pdf</strong></em>，并在系统重启时自动启动，无需干预将服务配置为在启动时自动将***/opt/file*** 挂载到容器中的 <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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="15-添加sudo免密操作">15. 添加sudo免密操作<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#15-%E6%B7%BB%E5%8A%A0sudo%E5%85%8D%E5%AF%86%E6%93%8D%E4%BD%9C" class="hash-link" aria-label="15. 添加sudo免密操作的直接链接" title="15. 添加sudo免密操作的直接链接">​</a></h4>
<p>允许 <em><strong>sysmgrs</strong></em> 组成员sudo时不需要密码</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"># 添加</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="16-设置root密码-rdbreakinitbinbash">16. 设置root密码 (rd.break，init=/bin/bash)<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#16-%E8%AE%BE%E7%BD%AEroot%E5%AF%86%E7%A0%81-rdbreakinitbinbash" class="hash-link" aria-label="16. 设置root密码 (rd.break，init=/bin/bash)的直接链接" title="16. 设置root密码 (rd.break，init=/bin/bash)的直接链接">​</a></h4>
<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>
<!-- -->保险起见两种方式最好都熟悉一下</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><em><strong>rd.break</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"># grub菜单 -&gt; 按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"># grub menu -&gt; 选择rescue kernel -&gt; 按e, 如果列表中看不到带rescue单词的行，选择默认的就行</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 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 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 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><em><strong>init=/bin/bash</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"># grub菜单 -&gt; 按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 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 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="17-配置您的系统以使默认存储库">17. 配置您的系统以使⽤默认存储库<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#17-%E9%85%8D%E7%BD%AE%E6%82%A8%E7%9A%84%E7%B3%BB%E7%BB%9F%E4%BB%A5%E4%BD%BF%E9%BB%98%E8%AE%A4%E5%AD%98%E5%82%A8%E5%BA%93" class="hash-link" aria-label="17. 配置您的系统以使⽤默认存储库的直接链接" title="17. 配置您的系统以使⽤默认存储库的直接链接">​</a></h4>
<p>YUM 存储库已可以从 <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> 和 <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> 使用配置您的系统，以将这些位置用作默认存储库</p>
<blockquote>
<p>参考Node1 第2题, 可以用scp命令直接拿过来</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="18-调整逻辑卷">18. 调整逻辑卷⼤⼩<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#18-%E8%B0%83%E6%95%B4%E9%80%BB%E8%BE%91%E5%8D%B7" class="hash-link" aria-label="18. 调整逻辑卷⼤⼩的直接链接" title="18. 调整逻辑卷⼤⼩的直接链接">​</a></h4>
<p>将逻辑卷&nbsp;<em><strong>vo</strong></em> 及其文件系统的大小调整到 <em><strong>230 MiB</strong></em>。确保文件系统内容保持不变。<br>
注：分区大小很少与请求的大小完全相同，因此可以接受范围为 213 MiB 到 243 MiB 的大小。</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="19-添加交换分区">19. 添加交换分区<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#19-%E6%B7%BB%E5%8A%A0%E4%BA%A4%E6%8D%A2%E5%88%86%E5%8C%BA" class="hash-link" aria-label="19. 添加交换分区的直接链接" title="19. 添加交换分区的直接链接">​</a></h4>
<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 comment" style="color:#999988;font-style:italic"># RH134教材可以看出， Redhat推的还是parted工具，最好熟悉一下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 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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="20--创建逻辑卷">20.  创建逻辑卷<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#20--%E5%88%9B%E5%BB%BA%E9%80%BB%E8%BE%91%E5%8D%B7" class="hash-link" aria-label="20.  创建逻辑卷的直接链接" title="20.  创建逻辑卷的直接链接">​</a></h4>
<p>根据如下要求，创建新的逻辑卷</p>
<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>16 MiB</strong></em></li>
<li>使用 <em><strong>ext3</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及设置扩展块大小</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"># 创建逻辑卷及大小设置</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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="21--配置系统调优">21.  配置系统调优<a href="https://www.geuni.tech/zh-Hans/linux/rhcsa_practice#21--%E9%85%8D%E7%BD%AE%E7%B3%BB%E7%BB%9F%E8%B0%83%E4%BC%98" class="hash-link" aria-label="21.  配置系统调优的直接链接" title="21.  配置系统调优的直接链接">​</a></h4>
<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 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"># 查看当前活动配置</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"># 查看系统推荐配置</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"># 设置为推荐配置</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"># 检查</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:encoded>
            <category>Linux</category>
            <category>RHCSA</category>
        </item>
        <item>
            <title><![CDATA[通过Keepalived & HAProxy，实现Nginx高可用及负载均衡]]></title>
            <link>https://www.geuni.tech/zh-Hans/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy</link>
            <guid>https://www.geuni.tech/zh-Hans/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy</guid>
            <pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[通过 Keepalived、HAProxy 和 Nginx 实现高可用和负载均衡架构，提供详细配置步骤，解决单点故障与资源利用率低的问题，全面提升系统稳定性与性能。]]></description>
            <content:encoded><![CDATA[<p>这篇文章将介绍如何使用Keepalived + HAproxy组合的方式，搭建Nginx的高可用负载均衡架构。</p>
<p>先看看单独使用Keepalived或HAProxy的时候会有什么问题或缺点。</p>
<p><strong>1. Nginx + Keepalived :</strong></p>
<p>该方案缺点是资源使用效率不高，只能在吞吐量不高的场景下使用。</p>
<p>不使用LVS的情况下，我们能做的就是主备(Active-Passive)架构，既然备机要一直开着，为什么不搭建一个SLB做个双主(Active-Active) 架构呢？</p>
<p>Keepalived + LVS的方式也可以实现负载均衡。不过LVS是L4（传输层的）负载均衡，功能比较单一。应用层面的负载均衡HAProxy明显更有优势。</p>
<p><strong>2. Nginx + HAProxy :</strong></p>
<p>该方案有单点故障问题。当单机HAProxy宕机的时候会导致整个服务不可用。</p>
<p><strong>3. Nginx + Keepalived + HAProxy :</strong></p>
<p>既可以在高并发下使用，也解决了单点故障问题。</p>
<p>为了熟悉Keepalived ，HAProxy的特性，我们将分两个步骤搭建架构。</p>
<p>先用Nginx + Keepalived实现高可用主备架构 ，再补充HAProxy的方式实现高可用负载均衡架构。</p>
<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/zh-Hans/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#%E9%80%9A%E8%BF%87keepalived%E5%AE%9E%E7%8E%B0%E4%B8%BB%E5%A4%87%E5%88%87%E6%8D%A2active-passive" class="hash-link" aria-label="通过Keepalived实现主备切换(Active-Passive)的直接链接" title="通过Keepalived实现主备切换(Active-Passive)的直接链接">​</a></h3>
<p>第一阶段我们要实现的架构如下。用户将通过VIP访问nginx，当1号服务器宕机的时候，VIP将飘到2号服务器后继续提供服务。</p>
<p><img decoding="async" loading="lazy" alt="keepalived-active-passive" src="https://www.geuni.tech/zh-Hans/assets/images/image-20240508165429517-06e97905cf39c1aa7e385cf273d2204e.png" width="1089" height="576" class="img_ev3q"></p>
<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 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配置文件</p>
<p><strong>#1服务器</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">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-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">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检测脚本</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"># 实例初始化状态 (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</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，允许一个priority更低的节点作为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"># （官方）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">    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"># vrrp单播，源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"># vrrp单播，对端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"># 用于节点间的通讯认证，需要主备设置一致</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-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/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-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">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检测脚本</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"># 实例初始化状态 (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</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，允许一个priority更低的节点作为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"># 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">    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"># vrrp单播，源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"># vrrp单播，对端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"># 用于节点间的通讯认证，需要主备设置一致</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-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/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-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 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-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">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-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 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-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">● 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-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 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-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">● 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以后，主节点中查看是否绑定了配置中的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-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">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>尝试停止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-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">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>关闭主节点nginx服务后，能看到keepalived正常执行了故障转移</p>
<p><img decoding="async" loading="lazy" alt="keepalived_failover" src="https://www.geuni.tech/zh-Hans/assets/images/keepalived_failover-89bf8e6ad8b50aeefed2fc0aa3e92a60.gif" width="1944" height="587" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="通过keepalived--haproxy实现负载均衡active-active">通过Keepalived &amp; HAProxy，实现负载均衡(Active-Active)<a href="https://www.geuni.tech/zh-Hans/nginx/nginx_ha_and_load_balancing_with_keepalived_haproxy#%E9%80%9A%E8%BF%87keepalived--haproxy%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1active-active" class="hash-link" aria-label="通过Keepalived &amp; HAProxy，实现负载均衡(Active-Active)的直接链接" title="通过Keepalived &amp; HAProxy，实现负载均衡(Active-Active)的直接链接">​</a></h3>
<p>在1阶段的架构上，我们添加HAProxy来实现双主负载均衡。</p>
<p><img decoding="async" loading="lazy" alt="keepalived_haproxy" src="https://www.geuni.tech/zh-Hans/assets/images/image-20240508162845399-2a73dcc5c0b8147899d9ee34cd2ce389.png" width="925" height="748" class="img_ev3q"></p>
<p>两台服务器都安装HAProxy</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">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-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/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-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">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"># 可以当作每个连接占用32KB内存来计算出合适的数值，并分配相应的内存</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>负载均衡及高可用测试</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/zh-Hans/assets/images/keepalived_haproxy_test-7fa62a7273547128ae9664bbff077788.gif" width="1935" height="660" class="img_ev3q"></p>]]></content:encoded>
            <category>Keepalived</category>
            <category>HAProxy</category>
            <category>Nginx</category>
        </item>
        <item>
            <title><![CDATA[Redis源码方式安装及Sentinel配置]]></title>
            <link>https://www.geuni.tech/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration</link>
            <guid>https://www.geuni.tech/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration</guid>
            <pubDate>Mon, 25 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Redis源码安装、Sentinel配置、高可用、故障转移、Redis集群，本教程详细讲解如何通过Sentinel实现Redis故障自动转移，提升系统可用性。]]></description>
            <content:encoded><![CDATA[<p><strong>安装环境及Redis源码版本</strong></p>
<p>OS:  Ubuntu 22.04.3 LTS</p>
<p>Redis: 7.2.3</p>
<p>如下，准备3个VM</p>
<table><thead><tr><th>No.</th><th>host name</th><th>IP</th><th>node roles</th></tr></thead><tbody><tr><td>#1</td><td>redis-server1</td><td>172.25.254.131</td><td>redis (master), sentinel</td></tr><tr><td>#2</td><td>redis-server2</td><td>172.25.254.132</td><td>redis (slave), sentinel</td></tr><tr><td>#3</td><td>redis-server3</td><td>172.25.254.133</td><td>redis (slave), sentinel</td></tr></tbody></table>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="编译器安装">编译器安装<a href="https://www.geuni.tech/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#%E7%BC%96%E8%AF%91%E5%99%A8%E5%AE%89%E8%A3%85" class="hash-link" aria-label="编译器安装的直接链接" title="编译器安装的直接链接">​</a></h3>
<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">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"># or</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"># 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/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#redis-%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD%E5%8F%8A%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85" class="hash-link" aria-label="Redis 源码下载及编译安装的直接链接" title="Redis 源码下载及编译安装的直接链接">​</a></h3>
<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">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配置文件模板到安装目录</span><span class="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"># 生成日志目录</span><span class="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/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#%E5%88%9B%E5%BB%BAredis-%E7%AE%A1%E7%90%86%E8%B4%A6%E6%88%B7" class="hash-link" aria-label="创建Redis 管理账户的直接链接" title="创建Redis 管理账户的直接链接">​</a></h3>
<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"> 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/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#replication%E9%85%8D%E7%BD%AE-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-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"> /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-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"># 监听IP，如果是开发、测试环境可配置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 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"># 为数据同步，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"># 考虑到发生故障转移，建议master,slave配置同样的密码</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"># 设置密码</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"># 日志文件位置</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会周期性的dump RDB文件，故障发生时可能会丢失一些尚未保存的数据</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"># aof文件写入周期，appendonly为yes时，配置将生效</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"># 有3个可配置参数（no, always, 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"># 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: 每次发生Redis的写命令时都会触发持久化动作，非常影响性能</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: 会以一秒的频率触发持久化动作，在这种方式下能很好地平衡持久化需求和性能间的关系，一般情况下取这个值。</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-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"> /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-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"># 监听IP，如果是开发、测试环境可配置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 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"># 为数据同步，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"># 考虑到发生故障转移，建议master,slave配置同样的密码</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"># 设置密码</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"># 日志文件位置</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会周期性的dump RDB文件，故障发生时可能会丢失一些尚未保存的数据</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"># aof文件写入周期，appendonly为yes时，配置将生效</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"># 有3个可配置参数（no, always, 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"># 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: 每次发生Redis的写命令时都会触发持久化动作，非常影响性能</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: 会以一秒的频率触发持久化动作，在这种方式下能很好地平衡持久化需求和性能间的关系，一般情况下取这个值。</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-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"> /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-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"># 监听IP，如果是开发、测试环境可配置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 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"># 为数据同步，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"># 考虑到发生故障转移，建议master,slave配置同样的密码</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"># 设置密码</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"># 日志文件位置</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会周期性的dump RDB文件，故障发生时可能会丢失一些尚未保存的数据</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"># aof文件写入周期，appendonly为yes时，配置将生效</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"># 有3个可配置参数（no, always, 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"># 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: 每次发生Redis的写命令时都会触发持久化动作，非常影响性能</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: 会以一秒的频率触发持久化动作，在这种方式下能很好地平衡持久化需求和性能间的关系，一般情况下取这个值。</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>创建systemd Unit文件</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">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实例</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-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">● 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><strong>确认Replication（主从同步状态）</strong></p>
<p>先确认master的replication状态</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"> /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-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 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-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"># 两台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-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 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/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#sentinel-%E9%85%8D%E7%BD%AE" 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-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"># 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"># 需监控的master信息及判定S_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，将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"></span><span class="token comment" style="color:#999988;font-style:italic"># failover超时时间</span><span class="token plain"></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实例</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">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-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">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-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"> /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/zh-Hans/redis/redis_install_from_source_and_sentinel_configuration#failover%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="Failover测试的直接链接" title="Failover测试的直接链接">​</a></h3>
<p>到了这个步骤可以测试failover。可以直接kill master进程，或通过sleep命令模拟故障。</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">./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>确认日志：</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>大体上会通过如下步骤执行故障转移</p>
<ol>
<li>检测到master宕机后发生+sdown(主观下线)事件</li>
<li>+sdown(主观下线)状态下，经过其他sentinel的同意将状态升级为+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:encoded>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[Kafka介绍，安装及集群搭建]]></title>
            <link>https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster</link>
            <guid>https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster</guid>
            <pubDate>Fri, 01 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[手把手教你搭建 Kafka 集群！本文提供基于 Kraft 和 Zookeeper 两种模式的详细配置步骤，涵盖 Kafka 安装、配置、Topic 创建、消息生产和消费测试，助你轻松构建高可用的 Kafka 集群。]]></description>
            <content:encoded><![CDATA[<h3 class="anchor anchorWithStickyNavbar_LWe7" id="什么是kafka">什么是kafka？<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#%E4%BB%80%E4%B9%88%E6%98%AFkafka" class="hash-link" aria-label="什么是kafka？的直接链接" title="什么是kafka？的直接链接">​</a></h3>
<p>Kafka是一个分布式的事件流平台，用于大规模数据的收集，处理，存储，集成。它的应用场景包含分布式数据流，流处理，数据集成，pub/sub消息。
为更好的理解kafka，我们需要先知道什么是事件。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="什么是事件">什么是事件？<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%8B%E4%BB%B6" class="hash-link" aria-label="什么是事件？的直接链接" title="什么是事件？的直接链接">​</a></h4>
<p>事件是应用程序用于识别或记录的任何类型的操作，事件，变更。例如一次支付，一次网页点击，一次温度读取以及任何对所发生事件的描述。</p>
<p>事件可以看作为通知与状态的组合。通知是为触发下一个事件的时间元素，而状态是事件自身的描述。</p>
<p>我们通常使用熟悉的数据格式，如JSON表达这个状态信息，而且我们更倾向称其为消息。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="kafka的架构及基础概念">Kafka的架构及基础概念<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#kafka%E7%9A%84%E6%9E%B6%E6%9E%84%E5%8F%8A%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5" class="hash-link" aria-label="Kafka的架构及基础概念的直接链接" title="Kafka的架构及基础概念的直接链接">​</a></h3>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="topic">Topic<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#topic" class="hash-link" aria-label="Topic的直接链接" title="Topic的直接链接">​</a></h5>
<p>Kafka的最基本的构成单元是topic，它类似于我们熟悉的关系型数据库中的一张表。</p>
<p>我们可以创建不同的topic来保存不同类型的事件，或创建不同的topic来保存同类事件的过滤，转换过的版本。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="partition">Partition<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#partition" class="hash-link" aria-label="Partition的直接链接" title="Partition的直接链接">​</a></h5>
<p>Kafka是分布式系统，为了读写吞吐量及水平扩展的便利性，它提供的对topic的分区功能。</p>
<p>分区将单个主题日志分解为多个日志，每个日志都可以驻留在 Kafka 集群中的单独节点上。这样，存储消息、写入新消息和处理现有消息的工作就可以分配给集群中的许多节点。</p>
<p>也就是一个topic包含多个partition分别存储在多个服务器上。topic是逻辑上的数据拆分，而partition是物理上的数据拆分。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="brokers">Brokers<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#brokers" class="hash-link" aria-label="Brokers的直接链接" title="Brokers的直接链接">​</a></h5>
<p>Kafka集群的每个节点/服务器成为我们Broker，Broker托管topic的多组分区。</p>
<p>Broker处理每个读取/写入到partition的事件请求，partition间的数据复制也是由broker处理。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="replication">Replication<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#replication" class="hash-link" aria-label="Replication的直接链接" title="Replication的直接链接">​</a></h5>
<p>如果一个partition只储存在一个broker，当发生节点故障的时候会发生数据丢失。为了实现数据的高可用，每个partition都会有冗余的副本（replica）由多个broker管理。</p>
<p>主分区的副本称为leader replica，读写请求一般都由leader replica处理，而follower replica只负责从leader replica中同步数据，不对外提供服务。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="producers--consumers">Producers &amp; Consumers<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#producers--consumers" class="hash-link" aria-label="Producers &amp; Consumers的直接链接" title="Producers &amp; Consumers的直接链接">​</a></h5>
<p>Kafka有两种类型的客户端，一个叫Producer，另一个叫Consumer。</p>
<p>Producer是负责生产消息的客户端，Consumer负责消息的消费。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="安装及配置集群">安装及配置集群<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#%E5%AE%89%E8%A3%85%E5%8F%8A%E9%85%8D%E7%BD%AE%E9%9B%86%E7%BE%A4" class="hash-link" aria-label="安装及配置集群的直接链接" title="安装及配置集群的直接链接">​</a></h3>
<p>我这里准备了3个虚拟机用于构建集群环境。</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-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">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><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 创建日志目录</span><span class="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" 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的集群搭建">基于<code>Kraft</code>的集群搭建<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#%E5%9F%BA%E4%BA%8Ekraft%E7%9A%84%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="基于kraft的集群搭建的直接链接" title="基于kraft的集群搭建的直接链接">​</a></h4>
<p>编辑各节点kraft配置文件</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"> /usr/local/kafka_2.13-3.6.0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">sudo</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">vim</span><span class="token plain"> config/kraft/server.properties</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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-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"># 获取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"># 格式化存储，分别在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">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>启动服务</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">sudo</span><span class="token plain"> ./bin/kafka-server-start.sh </span><span class="token parameter variable" style="color:#36acaa">-daemon</span><span class="token plain"> ./config/kraft/server.properties</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># log</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> logs/server.log </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,231</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Awaiting socket connections on </span><span class="token number" style="color:#36acaa">172.25</span><span class="token plain">.254.131:9092. </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.network.DataPlaneAcceptor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the authorizer futures to be completed </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Finished waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the authorizer futures to be completed </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the SocketServer Acceptors to be started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Finished waiting </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> all of the SocketServer Acceptors to be started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,243</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">BrokerServer </span><span class="token assign-left variable" style="color:#36acaa">id</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Transition from STARTING to STARTED </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.BrokerServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka version: </span><span class="token number" style="color:#36acaa">3.6</span><span class="token plain">.0 </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka commitId: 60e845626d8a465a </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,244</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO Kafka startTimeMs: </span><span class="token number" style="color:#36acaa">1701395564243</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">org.apache.kafka.common.utils.AppInfoParser</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2023</span><span class="token plain">-12-01 01:52:44,247</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> INFO </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">KafkaRaftServer </span><span class="token assign-left variable" style="color:#36acaa">nodeId</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Kafka Server started </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">kafka.server.KafkaRaftServer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="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/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"># 查看节点分布</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的集群搭建">基于<code>Zookeeper</code>的集群搭建<a href="https://www.geuni.tech/zh-Hans/kafka/kafka_introduce_install_cluster#%E5%9F%BA%E4%BA%8Ezookeeper%E7%9A%84%E9%9B%86%E7%BE%A4%E6%90%AD%E5%BB%BA" class="hash-link" aria-label="基于zookeeper的集群搭建的直接链接" title="基于zookeeper的集群搭建的直接链接">​</a></h4>
<p>配置broker配置文件</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>设置myid</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"> /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-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"># 启动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" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-f</span><span class="token plain"> logs/server.log </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/zh-Hans/kafka/kafka_introduce_install_cluster#topic%E5%88%9B%E5%BB%BA--%E6%B6%88%E6%81%AF%E7%9A%84%E7%94%9F%E4%BA%A7%E6%B6%88%E8%B4%B9%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="topic创建 &amp; 消息的生产，消费测试的直接链接" title="topic创建 &amp; 消息的生产，消费测试的直接链接">​</a></h4>
<p>创建topic</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">./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-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">./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>下一步我们测试消息的生产及消费，为了测试集群我们在#1服务器上生产消息，在#2,#3服务器上读取消息。</p>
<p>通过cli命令开启Producer</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"># 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>通过cli命令开启Consumer</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"># 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终端能看到消息，说明我们的集群配置正常。</p>
<p><img decoding="async" loading="lazy" alt="kafka_produce_consume" src="https://www.geuni.tech/zh-Hans/assets/images/kafka_produce_consume-3cdf03f67f13cfb20686dabd495feec1.gif" width="2843" height="1599" class="img_ev3q"></p>]]></content:encoded>
            <category>Kafka</category>
        </item>
        <item>
            <title><![CDATA[Redis Sentinel的failover过程]]></title>
            <link>https://www.geuni.tech/zh-Hans/redis/redis_sentinel_failover_process</link>
            <guid>https://www.geuni.tech/zh-Hans/redis/redis_sentinel_failover_process</guid>
            <pubDate>Thu, 24 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[深入了解 Redis Sentinel 的故障转移机制，包括 leader 选举、slave 选择和通信方式。掌握 Redis 高可用配置和 Sentinel 工作原理，构建稳定可靠的 Redis 服务。]]></description>
            <content:encoded><![CDATA[<p>Redis Sentinel是 Redis实现高可用(HA)的组件（非集群支持）。Reids有个叫Redis Cluster产品， Sentinel与它无关，Sentinel给无需集群环境的用户提供简单的故障转移功能。</p>
<p>Sentinel的基本功能：</p>
<ul>
<li>Monitoring : Sentinel以自动化的failover(故障转移)为目的，持续监控master/slave的状态。</li>
<li>Notification: redis实例宕机，或发生failover的时候通过pub/sub功能通知客户端，也可以通过预配置的shell script实现通知管理员的功能。</li>
<li>Automatic failover: master发生宕机后将开始执行failover流程，sentinel将挑选适合的slave将它提升为master，并通知其他的slave使用新的master。</li>
<li>Configuration provider: Sentinel给客户端提供服务发现功能，给客户端提供master, slave的信息以提供读写分离等功能。sentinel充当的是配置提供的角色而非提供代理服务。</li>
</ul>
<p>关于Sentinel的基本知识:</p>
<ul>
<li>
<p>为提供高可用高可用最少需要3个sentinel实例，并且为了投票的效率性推荐实例数量为奇数（偶数状态下发生50%投票率将导致重新投票）。</p>
</li>
<li>
<p>各实例应发布到相对独立的VM、物理服务器或可用区(AZ)，以降低故障影响。</p>
</li>
<li>
<p>Sentinel + Redis模式下，redis间的数据同步是异步方式进行的，故障转移有可能会导致数据的丢失。</p>
</li>
<li>
<p>所有构建的HA架构应做充分的验证测试，没有验证有效性的HA架构不能认定为安全的。</p>
</li>
</ul>
<p><strong>两种下线状态： <code>S_DOWN，</code> <code>O_DOWN</code></strong></p>
<ul>
<li><code>S_DOWN</code>(Subjectively Down 主观下线) - 本地单个sentinel没有接收到redis实例的PING响应，此时会进入S_DOWN状态。</li>
<li><code>O_DOWN</code>(Objectively Down 客观下线) - sentinel判定某个实例为S_DOWN后，会通过is-master-down-by-addr命令询问其他sentinel对master的下线与否判定情况，当超出已设定quorum数的sentinel回复S_DOWN状态，下线状态将从S_DOWN -&gt; 升级为ODOWN状态。</li>
</ul>
<p>O_DOWN状态是failover的触发条件，仅适用于master实例。slave宕机时sentinel不做任何操作，当然不会有O_DOWN状态。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="failover过程">failover过程<a href="https://www.geuni.tech/zh-Hans/redis/redis_sentinel_failover_process#failover%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="failover过程的直接链接" title="failover过程的直接链接">​</a></h3>
<p>Sentinel会定时对master, slave做healthcheck。</p>
<p>对master实例做出O_DOWN判定后(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L4611" target="_blank" rel="noopener noreferrer">src@sentinelCheckSubjectivelyDown</a>)将启动failover流程。</p>
<p>首选会选举一个执行failover操作的sentinel leader，被选为leader的sentinel会经过一系列筛选，优先级计算等操作后选出一个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/zh-Hans/redis/redis_sentinel_failover_process#sentinel-leader-%E9%80%89%E4%B8%BE%E8%BF%87%E7%A8%8B" class="hash-link" aria-label="Sentinel leader 选举过程的直接链接" title="Sentinel leader 选举过程的直接链接">​</a></h4>
<ol>
<li>Sentinel对master判定为O_DOWN状态后开始failover流程。<!-- -->
<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>*命令以请求投票(<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会比较请求过来的 req_epoch和自身的current-epoch。如果req_epoch大于 current-epoch将更新master结构体的leader,leader_epoch为请求过来的 req_runid, req_epoch。如果req_epoch等于current-epoch说明接收请求的sentinel已经投过票了，将返回已经投过票的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>选举期间内一半以上sentinel投过票并最少获得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>为什么建议sentinel实例数为奇数</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/zh-Hans/redis/redis_sentinel_failover_process#master-%E9%80%89%E5%87%BA" class="hash-link" aria-label="master 选出的直接链接" title="master 选出的直接链接">​</a></h4>
<p>master选出过程开始后，将首先剔除不适合当作master的slave后通过优先级的计算选择最终的master。</p>
<p>将通过如下条件剔除不适合的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 状态的实例</li>
<li>剔除5秒(sentinel_ping_period*5) 内没有PING响应的实例。</li>
<li>剔除slave_priority(优先顺序)为0的实例 (priority=0的当作废弃实例)</li>
<li>剔除info_validity_time为3秒以前或5秒(master为S_DOWN状态时)以前的实例</li>
<li>剔除master_link_down_time大于  <em>(now - master-&gt;s_down_since_time) + (master-&gt;down_after_period * 10)</em> 的实例</li>
</ol>
<p>剔除不适合的slave以后，将通过如下顺序挑选最终的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>找到适合的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/zh-Hans/redis/redis_sentinel_failover_process#slave-to-master" class="hash-link" aria-label="slave to master的直接链接" title="slave to master的直接链接">​</a></h4>
<p>找到适合（状态最优）的slave后将开始实际的主备切换工作。</p>
<ol>
<li>
<p><code>SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE</code>状态
在failover_state为SENTINEL_FAILOVER_STATE_SEND_SLAVEOF_NOONE状态下，sentinel将发送 <code>SLAVEOF NO ONE</code>命令给被选的slave，让其role变更为master。而后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>状态
sentinel发送<code>SLAVEOF NO ONE</code> 命令后，使用<code>INFO</code>命令确认slave的role是否变更为master。failover_timeout内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>状态
给其他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>状态
内存中的master信息替换为新master信息后重写redis的redis.conf文件。<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流程结束。</p>
</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sentinel的通信">Sentinel的通信<a href="https://www.geuni.tech/zh-Hans/redis/redis_sentinel_failover_process#sentinel%E7%9A%84%E9%80%9A%E4%BF%A1" class="hash-link" aria-label="Sentinel的通信的直接链接" title="Sentinel的通信的直接链接">​</a></h3>
<p>所有sentinel有如下通信对象：</p>
<ul>
<li>监控中的master</li>
<li>所有与master连接的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/zh-Hans/redis/redis_sentinel_failover_process#sentinel%E5%A6%82%E4%BD%95%E4%B8%8Eslave%E9%80%9A%E4%BF%A1%E7%9A%84" 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>)
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/zh-Hans/redis/redis_sentinel_failover_process#sentinel%E9%97%B4%E6%98%AF%E5%A6%82%E4%BD%95%E9%80%9A%E4%BF%A1%E7%9A%84" class="hash-link" aria-label="Sentinel间是如何通信的?的直接链接" title="Sentinel间是如何通信的?的直接链接">​</a></h4>
<p>Sentinel间的通信是通过redis的Pub/Sub功能实现的。master有个<code>__sentinel__:hello</code>sentinel专用渠道，用来发布自己的ip, 端口等信息。(<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的信息到字典中。(<a href="https://github.com/redis/redis/blob/7.2/src/sentinel.c#L2976" target="_blank" rel="noopener noreferrer">src@sentinelReceiveHelloMessages</a>)</p>]]></content:encoded>
            <category>Redis</category>
        </item>
        <item>
            <title><![CDATA[解决ES未分配分片的相关问题，“X 个分片有 Y 个失败”]]></title>
            <link>https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana</link>
            <guid>https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana</guid>
            <pubDate>Mon, 10 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[解决Elasticsearch“X个分片有Y个失败”错误，本指南涵盖分片未分配的常见原因（节点不足、磁盘空间、数据丢失等），提供详细排查步骤、API命令和恢复方案，助您快速恢复ES集群健康状态。]]></description>
            <content:encoded><![CDATA[<p>我们打开kibana的时候，有时候能看到“X 个分片有 Y 个失败”的错误信息，这通常是个别索引存在未分配分片所导致的问题。
这时候我们的ES节点状态通常是Yellow或是Red状态。</p>
<p>先了解一下ES Shard的4种状态：</p>
<ul>
<li>
<p><code>INITIALIZING</code> - 分片初始化状态，该状态下shard不可用。新建索引或刚启动节点的时候短暂的发生。</p>
</li>
<li>
<p><code>RELOCATING</code> - 新增节点或节点掉线的时候会重新分配shard导致shard的移动，也通常是短暂的。</p>
</li>
<li>
<p><code>STARTED</code> - shard活跃状态，该状态下可接收请求</p>
</li>
<li>
<p><code>UNASSIGNED</code> - shard分配失败</p>
</li>
</ul>
<p>那什么情况下shard会分配失败？</p>
<p>分片无法分配通常有如下几个原因：</p>
<ul>
<li>副本分片数设置过大，节点不够用于分配</li>
<li>节点掉线时的延时机制</li>
<li>分片数据丢失</li>
<li>节点磁盘空间不够用</li>
<li>集群中存在多个ES版本</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="首先查看集群状态--确认分片失败原因">首先查看集群状态 &amp; 确认分片失败原因<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E9%A6%96%E5%85%88%E6%9F%A5%E7%9C%8B%E9%9B%86%E7%BE%A4%E7%8A%B6%E6%80%81--%E7%A1%AE%E8%AE%A4%E5%88%86%E7%89%87%E5%A4%B1%E8%B4%A5%E5%8E%9F%E5%9B%A0" class="hash-link" aria-label="首先查看集群状态 &amp; 确认分片失败原因的直接链接" title="首先查看集群状态 &amp; 确认分片失败原因的直接链接">​</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>，查看集群状态以及整体的分片的分配情况。</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>返回如下信息：</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为集群状态，有三个状态</p>
<ul>
<li><em>green</em> - 所有分片已分配</li>
<li><em>yellow</em> - 所有主分片已分配，部分副本分片尚未分配，这时候如果某个节点发生故障部分数据将不可用</li>
<li><em>red</em> - 部分主分片尚未分配，部分数据将不可用，集群刚启动后分配主分片的时候也可能短暂发生</li>
</ul>
<p><code>unassigned_shards</code>是尚未分配的分片数量，当看到分片失败提示的时候，这里是会有数据的。</p>
<p><code>active_shards_percent_as_number</code>是已分配分片的百分比，数值越小说明未分配的分片数量越多。</p>
<p><code>delayed_unassigned_shards</code>是节点掉线后，等待延时时间（<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>查看所有分片的分配情况</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>或通过shell只查看未分配的分片</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>查看分片未分配的具体原因：</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>会有如下输出：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "index" : "my-index",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "shard" : 2,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "primary" : false,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "current_state" : "unassigned",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "unassigned_info" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "reason" : "CLUSTER_RECOVERED",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "at" : "2023-02-06T06:34:22.345Z",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "last_allocation_status" : "no_attempt"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "can_allocate" : "no",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "node_allocation_decisions" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_id" : "dntxO1EFQVSzk7A4n45OLQ",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_name" : "node-1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "transport_address" : "52.208.205.70:9300",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_attributes" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.machine_memory" : "33737449472",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "xpack.installed" : "true",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.max_open_jobs" : "20",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "ml.enabled" : "true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "node_decision" : "no",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      "deciders" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "decider" : "same_shard",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "decision" : "NO",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "explanation" : "the shard cannot be allocated to the same node on which a copy of the shard already exists [[my-index][2], node[dntxO1EFQVSzk7A4n45OLQ], [P], s[STARTED], a[id=ag-Komw1QJu9EKYkrsrdmw]]"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="如何解决">如何解决？<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3" class="hash-link" aria-label="如何解决？的直接链接" title="如何解决？的直接链接">​</a></h3>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="副本分片数设置过大节点不够用于分配">副本分片数设置过大，节点不够用于分配<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E5%89%AF%E6%9C%AC%E5%88%86%E7%89%87%E6%95%B0%E8%AE%BE%E7%BD%AE%E8%BF%87%E5%A4%A7%E8%8A%82%E7%82%B9%E4%B8%8D%E5%A4%9F%E7%94%A8%E4%BA%8E%E5%88%86%E9%85%8D" class="hash-link" aria-label="副本分片数设置过大，节点不够用于分配的直接链接" title="副本分片数设置过大，节点不够用于分配的直接链接">​</a></h4>
<p>shard分为两种，一种是primary shard（主分片），而另一种是replica shard（副本分片）。每个索引文档都将归属于某个primary shard，primary shard数量由<code>number_of_shards</code>属性来决定。这些primary shard一般会有各自的副本，具体的副本数量是由<code>number_of_replicas</code>这个属性来指定的。我们通常是通过index template(索引模板)或创建索引的时候指定这些属性。</p>
<p>而当分配replica shard的时候，有一个重要的规则就是主节点不会将replica shard分配到其primary shard所在的节点上。虽说replica shard会提升查询性能，它存在的主要目的是创建冗余数据来实现高的可用。意思是当你的副本数<strong>大于等于</strong>节点数的时候，你的replica shard没地方可去。虽然对服务没有影响，但ES判断这种状态是不健康的。毕竟我们预期的<code>number_of_replicas</code>没能分配上。最简单又比较常见的case就是单节点而设置<code>number_of_replicas</code>为1（默认值）。</p>
<p>上一步执行的<code>/_cluster/allocation/explain</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">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>这时候解决方法是增加节点数或减少副本数。如下：</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="节点掉线时的延时机制">节点掉线时的延时机制<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E8%8A%82%E7%82%B9%E6%8E%89%E7%BA%BF%E6%97%B6%E7%9A%84%E5%BB%B6%E6%97%B6%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="节点掉线时的延时机制的直接链接" title="节点掉线时的延时机制的直接链接">​</a></h4>
<p>当节点掉线时会发生大规模的分片移动，这时候性能开销有点大成本有点高。集群环境中通常会发生短暂的网络故障，延迟什么的。如果每次发生网络延迟的时候都全部重新分配分片未免大动干戈了。为了解决这个问题ES有节点掉线时的分片延时分配机制。延时时间由<code>index.unassigned.node_left.delayed_timeout</code>属性（默认1分钟）控制</p>
<p>如果我们确定某个节点要永久剔除，可以将<code>index.unassigned.node_left.delayed_timeout</code>属性设置为0，让ES立即执行重新分配：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">PUT _all/_settings</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  "settings": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "index.unassigned.node_left.delayed_timeout": "0"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="分片数据丢失">分片数据丢失<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E5%88%86%E7%89%87%E6%95%B0%E6%8D%AE%E4%B8%A2%E5%A4%B1" class="hash-link" aria-label="分片数据丢失的直接链接" title="分片数据丢失的直接链接">​</a></h4>
<p>假如我们有一个节点有尚未分配的primary shard，在没有任何副本的情况下节点宕机。这时候集群在全局的<em>cluster state</em>文件中检测到primary shard而在所有节点中没有找到该数据。这时候执行<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>这时候我们需要做个决策，让问题节点重新加入到集群，或通过 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-reroute.html" target="_blank" rel="noopener noreferrer">Cluster Reroute API</a> 强制分配空的primary shard（会发生数据丢失）。</p>
<p>如果可以接受丢失该shard数据，决定强制重新分配可执行如下API：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">POST /_cluster/reroute?pretty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "commands" : [</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          "allocate_empty_primary" : {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "index" : "&lt;INDEX_NAME&gt;",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "shard" : 0,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "node" : "&lt;NODE_NAME&gt;",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                "accept_data_loss" : "true"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>当使用allocate_empty_primary命令的时候，因为比较危险会强制要求你指定accept_data_loss为true。以确认你已经准备好丢失数据了。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="节点磁盘空间不够用">节点磁盘空间不够用<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E8%8A%82%E7%82%B9%E7%A3%81%E7%9B%98%E7%A9%BA%E9%97%B4%E4%B8%8D%E5%A4%9F%E7%94%A8" class="hash-link" aria-label="节点磁盘空间不够用的直接链接" title="节点磁盘空间不够用的直接链接">​</a></h4>
<p>当没有足够的节点和磁盘空间的时候，主节点无法分配分片。默认当磁盘空间使用率到底85%的时候，节点将被标记为Low disk watermark，不会被分配更多的分片。</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>确认各节点的分片分配情况及磁盘空间使用率。</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>可以通过删除没用的数据，增加节点或增加服务器的磁盘可用空间等方式解决这个问题。</p>
<p>当我们的磁盘空间足够大的时候，默认的Low disk watermark可能就太低了。这时候可以通过<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>例如调整为90%，需要注意的是这是安全点位，我们应该根据实际的数据增长速率来设置一个合适的值。</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>如果只是需要临时修改该值可把上面的persistent替换未transient。如果想永久修改该值可照上面使用persistent做持久处理就可以。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="集群中存在多个es版本">集群中存在多个ES版本<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E9%9B%86%E7%BE%A4%E4%B8%AD%E5%AD%98%E5%9C%A8%E5%A4%9A%E4%B8%AAes%E7%89%88%E6%9C%AC" class="hash-link" aria-label="集群中存在多个ES版本的直接链接" title="集群中存在多个ES版本的直接链接">​</a></h4>
<p>这种情况应该要避免。不只是ES，所有支持集群的其他组件都一样，应保证集群内的所有节点都使用同样的版本。以免引起不可预期的问题。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="结论">结论<a href="https://www.geuni.tech/zh-Hans/elasticsearch/elasticsearch-shards-failed-error-in-kibana#%E7%BB%93%E8%AE%BA" class="hash-link" aria-label="结论的直接链接" title="结论的直接链接">​</a></h3>
<p>未分配的分片会直接体现为ES集群的亚健康状态。通过上文了解到索引的分片数设置不当，节点离线或节点磁盘空间不够都会引发产生UNASSIGNED Shard。</p>
<p>虽然说有些情况对服务没有影响，但如果ES看起当前集群不是最佳状态，会通过Shard状态、集群状态给我们一个告警，应给予重视。</p>]]></content:encoded>
            <category>Elasticsearch</category>
            <category>Kibana</category>
        </item>
        <item>
            <title><![CDATA[解决Git error: Your local changes to the following files would be overwritten by merge]]></title>
            <link>https://www.geuni.tech/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge</link>
            <guid>https://www.geuni.tech/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge</guid>
            <pubDate>Thu, 28 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Git报错“Your local changes to the following files would be overwritten by merge”？本文详解两种解决方案：先commit本地修改或使用stash命令暂存更改，避免代码丢失，轻松解决合并冲突。]]></description>
            <content:encoded><![CDATA[<p>当本地修改的代码与远程仓库的代码有冲突时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">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将远程仓库的修改更新到本地仓库和工作区。当我们本地修改了一些文件，而远程仓库的这些文件也发生了变化，这时候我们想要拉取代码需要先保存这个修改。这是git的一个代码保护机制，主要是为了防止我们辛苦写的代码因执行一个命令而不翼而飞。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="错误演示">错误演示：<a href="https://www.geuni.tech/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%E9%94%99%E8%AF%AF%E6%BC%94%E7%A4%BA" 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>clone到本地后，我们直接修改了远程仓库的内容（等同于他人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;远程&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;本地&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">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/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95" class="hash-link" aria-label="解决方法：的直接链接" title="解决方法：的直接链接">​</a></h3>
<p>错误信息中git已经给了我们解决方法，或提交或暂存相关文件。</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="第一种方法使用commit">第一种方法，使用<code>commit</code><a href="https://www.geuni.tech/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%E7%AC%AC%E4%B8%80%E7%A7%8D%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8commit" class="hash-link" aria-label="第一种方法使用commit的直接链接" title="第一种方法使用commit的直接链接">​</a></h4>
<p>若代码是可提交状态，先提交  &gt; 拉取远程代码  &gt; 解决冲突 &gt; 提交 &amp; 推送。</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">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>
<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">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;本地&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;远程&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>剩下就是解决冲突，<code>push</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">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="第二种方法使用stash命令隐藏更改">第二种方法，使用<code>stash</code>命令隐藏更改<a href="https://www.geuni.tech/zh-Hans/git/your_local_changes_to_the_following_files_would_be_overwritten_by_merge#%E7%AC%AC%E4%BA%8C%E7%A7%8D%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8stash%E5%91%BD%E4%BB%A4%E9%9A%90%E8%97%8F%E6%9B%B4%E6%94%B9" class="hash-link" aria-label="第二种方法使用stash命令隐藏更改的直接链接" title="第二种方法使用stash命令隐藏更改的直接链接">​</a></h4>
<p>stash命令的官方介绍：</p>
<blockquote>
<p>当您想记录工作目录和索引的当前状态，但又想回到干净的工作目录时，请使用 git stash。</p>
</blockquote>
<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;本地&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>能确认到我们工作树是干净的，再执行<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>执行上面的命令后，远程代码已经被拉过来了。然后执行<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;远程&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;本地&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>到这，解决冲突后，该做什么做什么就行。</p>]]></content:encoded>
            <category>Git</category>
        </item>
        <item>
            <title><![CDATA[关于MySQL - SELECT list is not in GROUP BY clause and contains nonaggregated column错误]]></title>
            <link>https://www.geuni.tech/zh-Hans/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column</link>
            <guid>https://www.geuni.tech/zh-Hans/mysql/mysql_not_in_group_by_clause_and_contains_nonaggregated_column</guid>
            <pubDate>Sat, 16 Apr 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[解决MySQL 5.7及更高版本中“SELECT list is not in GROUP BY clause and contains nonaggregated column”错误。本文详解ONLY_FULL_GROUP_BY SQL模式的影响，并提供修改sql_mode配置的完整指南，包括配置文件修改和运行时修改方法。]]></description>
            <content:encoded><![CDATA[<p>错误信息：</p>
<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[42000][1055] Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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>选项。</p>
<p>当分组查询中的SELECT，ORDER BY中出现非GROUP BY中的列，这违背了SQL-92标准，该模式下就会报错。（不过也有一些例外，可参考<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，可以看到第一个模式就是ONLY_FULL_GROUP_BY。</p>
<p><img decoding="async" loading="lazy" alt="mysql_sql_mode" src="https://www.geuni.tech/zh-Hans/assets/images/mysql_sql_mode-3807d2c384a2877dc3a7d0be50ba27b0.png" width="2012" height="220" class="img_ev3q"></p>
<p>如果只是当前在写的SQL报这个错误，最好是重新审查一下SQL代码并重写。
如果想从数据库层面想放宽标准来解决该问题，那只需把sql_mode中的ONLY_FULL_GROUP_BY模式取消就行。（如果是已经上线的系统需谨慎开启该模式，如果是项目初期可以开启该模式来约束开发人员编写更为标准的SQL）</p>
<p>打开你的mysql配置文件</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">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">#如果不知道自己的配置文件在哪，可尝试如下步骤。</span><span class="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>添加如下配置项</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中修改该模式（无需重启），可以登陆MySQL执行如下命令：</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">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"></span><span class="token comment" style="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 </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>修改后执行如下命令，确认当前的sql_mode：</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:encoded>
            <category>MySQL</category>
        </item>
        <item>
            <title><![CDATA[Linux源码编译方式安装OpenResty及第三方模块]]></title>
            <link>https://www.geuni.tech/zh-Hans/nginx/linux_install_openresty_from_source</link>
            <guid>https://www.geuni.tech/zh-Hans/nginx/linux_install_openresty_from_source</guid>
            <pubDate>Thu, 03 Feb 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[需要安装 Nginx 或 OpenResty？本文提供 Linux 下源码编译安装的详细教程，涵盖 Nginx 基础安装和 OpenResty 的 LuaJIT 支持，以及第三方模块的添加。无论您是需要轻量级 Web 服务器还是强大的应用平台，都能在这里找到答案。]]></description>
            <content:encoded><![CDATA[<p>以下安装方法完全适用于nginx的安装，下面<code>./configure</code>阶段只需要去掉<code>--with-luajit</code>参数，安装OpenResty主要为了使用LuaJIT。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="安装依赖">安装依赖<a href="https://www.geuni.tech/zh-Hans/nginx/linux_install_openresty_from_source#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96" class="hash-link" aria-label="安装依赖的直接链接" title="安装依赖的直接链接">​</a></h5>
<p>因为OpenResty是基于Nginx构建的，安装之前需要先安装Nginx的依赖组件。</p>
<ul>
<li>
<p><a href="http://pcre.org/" target="_blank" rel="noopener noreferrer">PCRE</a> - 正则库，Nginx Core及Rewrite模块需要用到它。</p>
</li>
<li>
<p><a href="http://www.zlib.net/" target="_blank" rel="noopener noreferrer">zlib</a> - 提供数据压缩的函数库，<a href="https://nginx.org/en/docs/http/ngx_http_gzip_module.html" target="_blank" rel="noopener noreferrer">Gzip</a> 模块需要用到它。</p>
</li>
<li>
<p><a href="https://www.openssl.org/" target="_blank" rel="noopener noreferrer">OpenSSL</a> - 用于SSL功能</p>
</li>
<li>
<p><a href="https://gcc.gnu.org/" target="_blank" rel="noopener noreferrer">GCC</a> - GNU编译器套件</p>
</li>
</ul>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="centos-rhelrocky-and-fedora">CentOS, RHEL,Rocky, and Fedora<a href="https://www.geuni.tech/zh-Hans/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-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"> 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/zh-Hans/nginx/linux_install_openresty_from_source#%E5%9F%BA%E4%BA%8Edebian%E7%9A%84linux%E5%8F%91%E8%A1%8C%E7%89%88" class="hash-link" aria-label="基于Debian的Linux发行版的直接链接" title="基于Debian的Linux发行版的直接链接">​</a></h6>
<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">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/zh-Hans/nginx/linux_install_openresty_from_source#%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85" class="hash-link" aria-label="编译安装的直接链接" title="编译安装的直接链接">​</a></h5>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="下载源码">下载源码<a href="https://www.geuni.tech/zh-Hans/nginx/linux_install_openresty_from_source#%E4%B8%8B%E8%BD%BD%E6%BA%90%E7%A0%81" 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-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">#下载及解压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">#下载及解压njs(非必须，第三方模块我这边选了njs)</span><span class="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及module">编译及安装OpenResty及Module。<a href="https://www.geuni.tech/zh-Hans/nginx/linux_install_openresty_from_source#%E7%BC%96%E8%AF%91%E5%8F%8A%E5%AE%89%E8%A3%85openresty%E5%8F%8Amodule" class="hash-link" aria-label="编译及安装OpenResty及Module。的直接链接" title="编译及安装OpenResty及Module。的直接链接">​</a></h6>
<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">#生成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/zh-Hans/nginx/linux_install_openresty_from_source#%E9%85%8D%E7%BD%AEsystemd%E6%9C%8D%E5%8A%A1" class="hash-link" aria-label="配置systemd服务的直接链接" title="配置systemd服务的直接链接">​</a></h6>
<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"> /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-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">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:encoded>
            <category>Nginx</category>
            <category>OpenResty</category>
        </item>
        <item>
            <title><![CDATA[Ruby gem，bundler默认源替换为国内镜像，可解决bundler install卡住等问题]]></title>
            <link>https://www.geuni.tech/zh-Hans/ruby/ruby_gems_bundler_mirrors</link>
            <guid>https://www.geuni.tech/zh-Hans/ruby/ruby_gems_bundler_mirrors</guid>
            <pubDate>Sat, 08 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[国内使用bundle install卡慢？本文教你如何将Ruby gem和Bundler的默认源替换为国内镜像（如TUNA），快速解决安装卡顿问题，提升开发效率。]]></description>
            <content:encoded><![CDATA[<p>国内使用<code>bundler install</code>等命令时，经常出现卡住或响应慢的现象，替换为国内源即可解决问题。</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="gem">gem<a href="https://www.geuni.tech/zh-Hans/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"># 添加 TUNA 源并移除默认源</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><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"># 应该只有 TUNA 一个</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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/zh-Hans/ruby/ruby_gems_bundler_mirrors#bundle" class="hash-link" aria-label="bundle的直接链接" title="bundle的直接链接">​</a></h5>
<p>使用以下命令替换 bundle 默认源</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">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:encoded>
            <category>Ruby</category>
        </item>
        <item>
            <title><![CDATA[使用Python开源工具locust做性能测试]]></title>
            <link>https://www.geuni.tech/zh-Hans/python/load_testing_locust</link>
            <guid>https://www.geuni.tech/zh-Hans/python/load_testing_locust</guid>
            <pubDate>Fri, 07 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍一个Python开源、 分布式的性能测试工具Locust。相比Loadrunner、Jmeter，单台能发起的负载比较高，而且都是通过代码实现，与其他笨重工具相比对于程序员来说比较易用的。]]></description>
            <content:encoded><![CDATA[<p>介绍一个Python开源、 分布式的性能测试工具Locust。相比Loadrunner、Jmeter，单台能发起的负载比较高，而且都是通过代码实现，与其他笨重工具相比对于程序员来说比较易用的。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="locust安装">Locust安装<a href="https://www.geuni.tech/zh-Hans/python/load_testing_locust#locust%E5%AE%89%E8%A3%85" 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>如果想安装最新版本（预发布版）：</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/zh-Hans/python/load_testing_locust#locust%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%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/zh-Hans/python/load_testing_locust#%E5%88%9B%E5%BB%BAmock-api" 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-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">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</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>如果正常运行，可以看到如下输出：</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/zh-Hans/python/load_testing_locust#%E7%BC%96%E5%86%99locust%E6%B5%8B%E8%AF%95%E8%84%9A%E6%9C%AC" class="hash-link" aria-label="编写Locust测试脚本的直接链接" title="编写Locust测试脚本的直接链接">​</a></h4>
<p>然后下面写最一个简单的locust测试脚本，文件名叫<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继承自HttpUser类。该类用于基于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请求</li>
</ul>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="运行locust">运行Locust<a href="https://www.geuni.tech/zh-Hans/python/load_testing_locust#%E8%BF%90%E8%A1%8Clocust" class="hash-link" aria-label="运行Locust的直接链接" title="运行Locust的直接链接">​</a></h4>
<p>在编写脚本的目录下运行<code>locust</code>命令。</p>
<blockquote>
<p>如果测试脚本的文件名不是<em>locustfile.py</em>，则需要用*-f*参数指定文件名</p>
<p>例如：<em>locust -f testScript.py</em></p>
</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 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">2022</span><span class="token plain">-01-05 </span><span class="token number" style="color:#36acaa">16</span><span class="token plain">:21:55,257</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> MacBook-Pro.local/INFO/locust.main: Starting web interface at http://0.0.0.0: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><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">2022</span><span class="token plain">-01-05 </span><span class="token number" style="color:#36acaa">16</span><span class="token plain">:21:55,275</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> MacBook-Pro.local/INFO/locust.main: Starting Locust </span><span class="token number" style="color:#36acaa">2.5</span><span class="token plain">.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>此时，访问<a href="http://localhost:8089/" target="_blank" rel="noopener noreferrer">http://localhost:8089</a>，输入必要信息后点击<code>START</code>按钮，开始压测。</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/zh-Hans/assets/images/locust-run-b7e6e55816722b9a039fab223515c019.webp" width="3059" height="1596" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="cli命令行模式进行测试">CLI（命令行）模式进行测试<a href="https://www.geuni.tech/zh-Hans/python/load_testing_locust#cli%E5%91%BD%E4%BB%A4%E8%A1%8C%E6%A8%A1%E5%BC%8F%E8%BF%9B%E8%A1%8C%E6%B5%8B%E8%AF%95" class="hash-link" aria-label="CLI（命令行）模式进行测试的直接链接" title="CLI（命令行）模式进行测试的直接链接">​</a></h4>
<p>locust也提供命令模式的测试方法，只需提供<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> —  测试脚本的文件路径（如果文件名为locustfile.py而且在当前目录，可省略该参数）</li>
<li><code>-headless</code> —使用命令模式</li>
<li><code>-u</code> — 用户数</li>
<li><code>-r</code> — 每秒增加速率</li>
</ul>
<ul>
<li><code>--run-time</code> — 测试持续时间（可以用<code>-t</code>替代）</li>
</ul>
<p><img decoding="async" loading="lazy" alt="locust_rs" src="https://www.geuni.tech/zh-Hans/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/zh-Hans/python/load_testing_locust#%E5%88%86%E5%B8%83%E5%BC%8F%E6%A8%A1%E5%BC%8F%E8%BF%90%E8%A1%8Clocust" class="hash-link" aria-label="分布式模式运行Locust的直接链接" title="分布式模式运行Locust的直接链接">​</a></h4>
<p>正式压测的时候，单机发生的负载一般是不够用的，这时候我们就需要分布式的发生负载。</p>
<p>可先用<code>--master</code>参数启动一个master节点，然后用<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>启动woker：</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> :从主节点获取locustfile，而不是从本地文件系统获取。（从Locust 2.23.0开始支持）</li>
<li><code>--master-host</code> : 指定主节点的IP地址。</li>
<li><code>--processes</code> : 不支持Windows。</li>
</ul>
</blockquote>
<p>官方文档：<a href="http://docs.locust.io/en/stable/" target="_blank" rel="noopener noreferrer">http://docs.locust.io/en/stable/</a></p>]]></content:encoded>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[Python pip，pipenv设置国内镜像源]]></title>
            <link>https://www.geuni.tech/zh-Hans/python/pip_index_url</link>
            <guid>https://www.geuni.tech/zh-Hans/python/pip_index_url</guid>
            <pubDate>Wed, 05 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。]]></description>
            <content:encoded><![CDATA[<p>像其他的包管理工具一样，pip和pipenv也可以设置国内源，配置下来速度飞起。</p>
<h6 class="anchor anchorWithStickyNavbar_LWe7" id="pip设置国内源">pip设置国内源<a href="https://www.geuni.tech/zh-Hans/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/zh-Hans/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:encoded>
            <category>Python</category>
        </item>
        <item>
            <title><![CDATA[MacOS下brew install报Error: No such file or directory错误]]></title>
            <link>https://www.geuni.tech/zh-Hans/macos/brew_no_such_file_or_directory</link>
            <guid>https://www.geuni.tech/zh-Hans/macos/brew_no_such_file_or_directory</guid>
            <pubDate>Tue, 04 Jan 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[用brew install的命令时，发生Error: No such file or directory *的错误。]]></description>
            <content:encoded><![CDATA[<p>用brew install的命令时，发生Error: No such file or directory ***的错误。</p>
<p>每次MacOS系统更新后，Homebrew都会发生一些问题，一般重装后即可解决。</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Error: No such </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> or directory @ rb_sysopen - /Users/geuni/Library/Caches/Homebrew/downloads/9c91a337f95d642c3eed905e43f8aa6dd50903ba990691c3001570277ad1ccd2--gdbm-1.21_1.monterey.bottle.tar.gz</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="复制代码到剪贴板" title="复制" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="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：</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">/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://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.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>
<p><img decoding="async" loading="lazy" alt="homebrew_install" src="https://www.geuni.tech/zh-Hans/assets/images/homebrew_install-25640c24cbb00dc59e031e5c776e400a.png" width="1712" height="388" class="img_ev3q"></p>]]></content:encoded>
            <category>MacOS</category>
        </item>
    </channel>
</rss>