Ansible lineinfileモジュールを使用してテキストファイルを管理する方法

Ansibleは、一度に数百のノードを管理できる広く使われている自動化ツールです。Ansibleには多くの素晴らしい機能があり、その1つがAnsible lineinfileモジュールを使用してリモートノードのファイル内の1行を管理する能力です。

Ansilbe lineinfileモジュールは、行の置換、行の更新、特定の行の追加など、ファイル内の1行に対してさまざまなアクションを実行するモジュールです。

このチュートリアルでは、Ansible lineinfileモジュールの概要、動作方法、およびテキストファイルの管理方法について学びます。

前提条件

この記事は、Ansible lineinfileモジュールのステップバイステップのチュートリアルです。一緒に進める場合は、以下の準備が整っていることを確認してください:

  • A remote computer to run commands. You’ll need an inventory file set up and one or more hosts already configured to run Ansible command and playbooks on. The remote Linux computer will be called myserver, and the tutorial will use an inventory group called web.
  • チュートリアルを正確に追いかける場合、リモートコンピューターにはすでにApacheがインストールされている必要があります。

Ansibleのlineinfileモジュールを使用してテキストファイルを変更する方法についてのチュートリアルを行います。

まず、アドホックコマンドを使用してAnsibleのlineinfileモジュールを実行します。アドホックコマンドは、リモートホストで単一のコマンドをテストまたは実行するための簡単な方法です。

Ansibleコントローラにログインし、次のコマンドを実行します。このコマンドでは、lineinfileモジュール(-m)を使用してwebマシンに接続し、実行するコマンド(-a)を渡しています。

この例では、lineinfileモジュールが/etc/hostsファイル内のlocalhostエントリをIPアドレス127.0.0.1myapacheのマッピングで更新します。 127.0.0.1myapacheとマッピングすることで、HTTP://myapache:80でローカルでApacheテストページにアクセスできます。

  • pathはファイルの場所を示します。
  • regexpはファイル内の正規表現を検索し、lineパラメータで指定された127.0.0.1 myapacheで更新します。
  • –becomeフラグを使用すると、特権ユーザーとしてコマンドを実行できます。
  • webは、すべてのサーバーのコレクションであるインベントリグループです。
  • ansible.builtin.lineinfileまたは単にlineinfileがモジュール名です。
ansible web -m ansible.builtin.lineinfile -a "path=/etc/hosts regexp='^127\.0\.0\.1'  line='127.0.0.1 myapache' state=present" --become

コマンドを実行すると、リモートホスト上で行が正常に更新されたことを示すCHANGEDメッセージが表示されます。

Running the ad hoc command with ansible lineinfile module

SSHクライアントを使用してリモートノードにログインし、/etc/hostsファイルが新しい値で更新されたかどうかをcatコマンドを使用して確認します。

以下のように、リモートマシン上でローカルホストのエントリが127.0.0.1 myapacheで正常に更新されました。

Verifying the host file on remote machine

Playbook内で複数のテキストファイルを変更する

単一のadhocコマンドを使用してリモートマシンの行を管理する場合は、まあまあですが、複数のファイルに行またはファイル内の複数の行を管理する場合は困難になります。adhocコマンドの代わりに、ansible-playbookコマンドを使用してPlaybook内でAnsible lineinfileモジュールを使用することを検討してください。

では、プレイブック内でAnsible lineinfileモジュールを使用していくつかの行を変更する方法を学びましょう。

Ansibleコントローラーホストにすでにログインしていると仮定します。

1. ホームディレクトリにansible_lineinfile_module_demoという名前のディレクトリを作成します。このディレクトリにはlineinfileモジュールを呼び出すために使用するplaybookが含まれます。

mkdir ~/ansible_lineinfile_module_demo
cd ~/ansible_lineinfile_module_demo

2. my_playbook.ymlという別のファイルを~/ansible_lineinfile_module_demoディレクトリに作成し、以下のYAMLプレイブックの内容を貼り付けます。このプレイブックには、リモートマシンのApacheの異なる設定ファイルの行を管理するためにAnsibleのlineinefileモジュールを使用する複数のタスクが含まれています。

以下のプレイブックには、次のタスクが含まれています:

1. /etc/sudoersファイルにADMINが存在するかをチェックし、存在しない場合は追加します。

2. /etc/apache2/ports.confファイル内でApacheのデフォルトがポート8080でリッスンしていることを確認します。他のポートの行が見つかった場合、lineinfileモジュールはそれをポート8080に更新します。同様に、/etc/apache2/apache2.confファイルでは、MaxKeepAliveRequestsを1000に、KeepAliveTimeoutを100に更新します。

3. リモートサーバーのindex.htmlページの末尾に、テキスト「Hello This is my Apache Page」を追加します。追加先は/var/www/htmlディレクトリです。

AnsibleプレイブックはYAML形式で書かれています。YAMLについて詳しく知るには、ここをクリックしてください

---
- name: Ansible lineinfile module example
# Ansibleのlineinfileモジュールが影響を及ぼすリモートサーバーを定義する
  hosts: web
  remote_user: ubuntu   # リモートホストとしてubuntuを使用する
  become: true
  tasks:

# (タスク-1) Sudoersファイルを確認し、管理者がすべての操作を許可されているかをチェックする
    - name: Validate the sudoers file before saving
      ansible.builtin.lineinfile:
         path: /etc/sudoers
         state: present
         regexp: '^%ADMIN ALL='
         line: '%ADMIN ALL=(ALL) NOPASSWD: ALL'

# (タスク-2) Apacheのデフォルトポートを8080に更新する
    - name: Ensure the default Apache port is 8080
      ansible.builtin.lineinfile:
         path: /etc/apache2/ports.conf
         regexp: '^Listen '
         insertafter: '^#Listen '
         line: Listen 8080

# (タスク-3) htmlページの末尾に行を追加する:Hello This is my Apache Page
    - name: Add a line to a file if the file does not exist
      ansible.builtin.lineinfile:
         path: /var/www/html/index.html
         line: Hello This is my Apache Page
         create: yes

# (タスク-4) Sudoersファイルを確認し、管理者がすべての操作を許可されているかをチェックする
    - name: Ensure MaxKeepAliveRequests is set to greater than 100
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^MaxKeepAliveRequests'
         line: MaxKeepAliveRequests=1000

# (タスク-5) Sudoersファイルを確認し、管理者がすべての操作を許可されているかをチェックする
    - name: Ensure KeepAliveTimeout is set to greater than 50
      ansible.builtin.lineinfile:
         path: /etc/apache2/apache2.conf
         regexp: '^KeepAliveTimeout'
         line: KeepAliveTimeout=100

3. プレイブックを呼び出し、ansible-playbookコマンドを使用してリモートホスト上のプレイブックで定義されたすべての行を追加または更新します。

ansible-playbook my_playbook.yml 
Invoking the ansible playbook

以下では、TASKのステータスがchangedであることがわかります。これはリモートホストが適切な状態になく、コマンドが変更されたことを意味します。OKステータスを持つTASKは変更を必要としないことを示します。

4. 次に、お気に入りのSSHクライアントを使用してリモートホストにSSH接続します。

5. 最後に、my_playbook.ymlで定義されたすべての行がリモートホストに追加または更新されているかをcatコマンドを使用して確認します。

#管理者が完全な権限を持っているかを確認し、持っていない場合は追加する
cat /etc/sudoers
#MaxKeepAliveRequestsとKeepAliveTimeoutがそれぞれ1000と100に更新されたことを確認する
cat /etc/apache2/apache.config | grep Alive
#Apacheがポート8080でリスニングしているかを確認する
cat /etc/apache2/ports.config

以下のスクリーンショットは、adminが既にsudoersファイルに追加されていることを確認しています。

Verifying the sudoers file

また、以下のスクリーンショットは、Apacheがデフォルトでポート8080でリスニングしていることを確認しています。

Verifying the ports for in the config file

最後に、MaxKeepAliveRequestsKeepAliveTimeoutがそれぞれ1000と100に更新されたかどうかを確認してください。

Verifying the MaxKeepAliveRequests and KeepAliveTimeout in the config file

結論

Ansibleのlineinfileモジュールは、リモートホスト上のテキストファイルを変更する素晴らしい方法です。このモジュールは、プレイブック内のテキストファイルの行を追加、削除、変更するための素晴らしい方法を提供します。

Ansibleのlineinfileモジュールが利益をもたらすと思われる他のユースケースはありますか?

Source:
https://adamtheautomator.com/ansible-lineinfile/