<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bash on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/bash/</link><description>Recent content in Bash on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Fri, 21 Aug 2026 10:06:02 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/bash/index.xml" rel="self" type="application/rss+xml"/><item><title>Ansible blockinfileによる冪等性の担保とシェルスクリプト運用における設定重複の回避</title><link>https://klifehack.com/p/ansible-idempotency-blockinfile-hosts-management/</link><pubDate>Fri, 21 Aug 2026 10:06:02 +0900</pubDate><guid>https://klifehack.com/p/ansible-idempotency-blockinfile-hosts-management/</guid><description>&lt;p&gt;インフラストラクチャの自動化において、シェルスクリプトによる命令型のアプローチを長期間運用し続けると、意図しない設定の二重追記や構文破壊といった構成ドリフト（Configuration Drift）が発生しやすくなります。特にノード数が増加する環境やCI/CDパイプラインによる定期実行環境では、実行回数に依存せず常に目標状態を同一に維持する「冪等性（Idempotency）」の担保が不可欠となります。本稿では、シェルコマンドによる追記処理とAnsibleの宣言的アプローチ（&lt;code&gt;ansible.builtin.blockinfile&lt;/code&gt;モジュール）の挙動差を検証し、確実な設定ファイル管理を実現する設計を整理します。&lt;/p&gt;&#10;&lt;h2 id="冪等性の数理的定義と命令型スクリプトの破綻"&gt;冪等性の数理的定義と命令型スクリプトの破綻&#10;&lt;/h2&gt;&lt;p&gt;冪等性とは、ある操作を1回適用した結果と、複数回適用した結果が常に等しくなる性質を指します。&lt;/p&gt;&#10;&lt;p&gt;$$f(f(x)) = f(x)$$&lt;/p&gt;&#10;&lt;p&gt;インフラ構成管理における命令型（Imperative）スクリプトでは、実行時の状態判定を行わずにリダイレクト演算子（&lt;code&gt;&amp;amp;gt;&amp;amp;gt;&lt;/code&gt;）等でテキストを単純追加することが多く、これが非冪等な動作を引き起こします。&lt;/p&gt;&#10;&lt;h3 id="シェルスクリプトによる重複発生の検証"&gt;シェルスクリプトによる重複発生の検証&#10;&lt;/h3&gt;&lt;p&gt;例として、&lt;code&gt;/etc/ansible/hosts&lt;/code&gt; に対してインベントリグループ &lt;code&gt;[tester]&lt;/code&gt; を追記する処理を実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ sudo bash -c &lt;span style="color:#e6db74"&gt;&amp;#39;echo -e &amp;#34;[tester]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;192.168.1.13&amp;#34; &amp;amp;gt;&amp;amp;gt; /etc/ansible/hosts&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ cat /etc/ansible/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;tester&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコマンドを再度実行した場合、状態の検証が行われないため同一ブロックが重複して書き込まれます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ sudo bash -c &lt;span style="color:#e6db74"&gt;&amp;#39;echo -e &amp;#34;[tester]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;192.168.1.13&amp;#34; &amp;amp;gt;&amp;amp;gt; /etc/ansible/hosts&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ cat /etc/ansible/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;tester&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;tester&lt;span style="color:#f92672"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同一のセクショングループが複数存在することにより、後続のパーサー処理でパースエラーや予期せぬパターンの上書きが発生し、運用上のリスクとなります。&lt;/p&gt;&#10;&lt;h2 id="ansibleによる宣言的ブロック管理の実装"&gt;Ansibleによる宣言的ブロック管理の実装&#10;&lt;/h2&gt;&lt;p&gt;Ansibleは目的とする「最終状態」を定義し、ターゲットノードの現状と比較した上で差分がある場合のみ更新を適用します。複数行の設定ブロックを挿入・管理する場合、&lt;code&gt;ansible.builtin.blockinfile&lt;/code&gt; モジュールを使用します。&lt;/p&gt;&#10;&lt;h3 id="playbook定義-playbookansible_vimyml"&gt;Playbook定義 (&lt;code&gt;./playbook/Ansible_vim.yml&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Ansible_vim&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hosts&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;localhost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;gather_facts&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tasks&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Add ansible hosts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ansible.builtin.blockinfile&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/ansible/hosts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;create&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mode&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;0644&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;marker&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;# {mark} ANSIBLE MANAGED BLOCK&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;block&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; [tester]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 192.168.1.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 192.168.1.12&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; 192.168.1.13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="設定パラメータの役割"&gt;設定パラメータの役割&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;path&lt;/code&gt;: 更新対象のファイルパスを指定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;create&lt;/code&gt;: ファイルが存在しない場合に新規作成を許可します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;mode&lt;/code&gt;: ファイルのパーミッションを明示的に固定します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;marker&lt;/code&gt;: Ansibleが管理対象領域を識別するためのデリミタ文字列を指定します（デフォルトは &lt;code&gt;# {mark} ANSIBLE MANAGED BLOCK&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;block&lt;/code&gt;: 挿入する設定内容を複数行リテラルで定義します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="実行検証と状態遷移の確認"&gt;実行検証と状態遷移の確認&#10;&lt;/h2&gt;&lt;h3 id="初回実行差分適用"&gt;初回実行（差分適用）&#10;&lt;/h3&gt;&lt;p&gt;対象ファイルに指定ブロックが存在しない状態でPlaybookを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ sudo ansible-playbook ./playbook/Ansible_vim.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PLAY [Ansible_vim] *******************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TASK [Gathering Facts] ***************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ok: [localhost]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TASK [Add ansible hosts] *************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;changed: [localhost]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PLAY RECAP ***************************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ファイル内容を確認すると、マーカータグに囲まれた状態でブロックが挿入されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ cat /etc/ansible/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# BEGIN ANSIBLE MANAGED BLOCK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[tester]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.12&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;192.168.1.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# END ANSIBLE MANAGED BLOCK&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2回目実行冪等性の実証"&gt;2回目実行（冪等性の実証）&#10;&lt;/h3&gt;&lt;p&gt;全く同じPlaybookを再実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ sudo ansible-playbook ./playbook/Ansible_vim.yml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PLAY [Ansible_vim] *******************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TASK [Gathering Facts] ***************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ok: [localhost]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TASK [Add ansible hosts] *************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ok: [localhost]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PLAY RECAP ***************************************************************************************************************************************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;タスクステータスは &lt;code&gt;changed&lt;/code&gt; ではなく &lt;code&gt;ok&lt;/code&gt; となり、&lt;code&gt;PLAY RECAP&lt;/code&gt; においても &lt;code&gt;changed=0&lt;/code&gt; と記録されます。Ansibleがマーカー内のコンテンツとPlaybookの定義を比較し、差分がないことを検知してディスク書き込みをスキップしたことが確認できます。&lt;/p&gt;&#10;&lt;h2 id="troubleshooting"&gt;Troubleshooting&#10;&lt;/h2&gt;&lt;h3 id="1-マーカーの手動改変によるブロック重複"&gt;1. マーカーの手動改変によるブロック重複&#10;&lt;/h3&gt;&lt;h4 id="発生事象"&gt;発生事象&#10;&lt;/h4&gt;&lt;p&gt;運用者が対象ファイル内の &lt;code&gt;# BEGIN ANSIBLE MANAGED BLOCK&lt;/code&gt; や &lt;code&gt;# END ANSIBLE MANAGED BLOCK&lt;/code&gt; を手作業で編集または削除した場合、Ansibleは管理ブロックが存在しないと判定し、末尾に新たな管理ブロックを追加して設定が重複します。&lt;/p&gt;&#10;&lt;h4 id="対処手順"&gt;対処手順&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;マーカー行は手動で変更せず、変更が必要な場合はPlaybook側の &lt;code&gt;marker&lt;/code&gt; パラメータでカスタムマーカー名を定義して一元管理します。&lt;/li&gt;&#10;&lt;li&gt;重複が発生した場合は、一度 &lt;code&gt;state: absent&lt;/code&gt; を指定して既存ブロックをパージしてから再適用します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Clean up corrupt block&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ansible.builtin.blockinfile&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;/etc/ansible/hosts&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;marker&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;# {mark} ANSIBLE MANAGED BLOCK&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;state&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;absent&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-ファイルアクセス権限およびselinuxコンテキストの拒否"&gt;2. ファイルアクセス権限およびSELinuxコンテキストの拒否&#10;&lt;/h3&gt;&lt;h4 id="発生事象-1"&gt;発生事象&#10;&lt;/h4&gt;&lt;p&gt;Playbookの実行ユーザーが &lt;code&gt;/etc/ansible/hosts&lt;/code&gt; に対する書き込み権限を持たない場合、あるいはSELinuxが有効な環境でテンポラリファイルの作成がブロックされる場合に &lt;code&gt;Permission denied&lt;/code&gt; エラーが発生します。&lt;/p&gt;&#10;&lt;h4 id="対処手順-1"&gt;対処手順&#10;&lt;/h4&gt;&lt;ul&gt;&#10;&lt;li&gt;Playbook実行時に &lt;code&gt;become: true&lt;/code&gt; を指定して昇格を行うか、実行権限を確認します。&lt;/li&gt;&#10;&lt;li&gt;ファイルのSELinuxコンテキストが適切か確認します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vagrant@Ansible-Server:~$ ls -lZ /etc/ansible/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r--. &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root system_u:object_r:etc_t:s0 /etc/ansible/hosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="operational-notes"&gt;Operational Notes&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;単一行の厳密な管理には &lt;code&gt;ansible.builtin.lineinfile&lt;/code&gt; を検討し、セクション単位のまとまった設定ブロックには &lt;code&gt;ansible.builtin.blockinfile&lt;/code&gt; または &lt;code&gt;ansible.builtin.template&lt;/code&gt;（Jinja2テンプレート）を適材適所で使い分ける構成が推奨されます。&lt;/li&gt;&#10;&lt;li&gt;CI/CDパイプラインに組み込む際は、&lt;code&gt;--check&lt;/code&gt; オプションを付与したDry-run実行を組み込み、想定外の &lt;code&gt;changed&lt;/code&gt; が発生しないか定期的に検証することで、構成ドリフトを早期に検知可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>