Ansible でコンテンツを含むファイルを作成する方法

AnsibleBeginner
オンラインで実践に進む

はじめに

Ansible は、インフラストラクチャ管理を簡素化する強力な IT 自動化ツールです。この実践的な実験(Lab)では、Ansible を使用して、ターゲットシステム上に特定のコンテンツを持つファイルを作成する方法を学びます。この実験(Lab)の終わりには、Ansible のファイル管理の基本を理解し、独自のインフラストラクチャで自動化されたファイル作成を実装できるようになります。

Ansible のインストールとセットアップ

Ansible を使用してファイルを作成する前に、システムにインストールして設定する必要があります。環境をセットアップしましょう。

Ansible のインストール

まず、パッケージリストを更新し、Ubuntu 22.04 システムに Ansible をインストールします。

sudo apt update
sudo apt install -y ansible

これらのコマンドを実行すると、Ansible が正常にインストールされたことを示す出力が表示されるはずです。インストールを確認しましょう。

ansible --version

次のような出力が表示されるはずです。

ansible [core 2.12.0]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/labex/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/labex/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, ...) [GCC 11.2.0]
  jinja version = 3.0.3
  libyaml = True

簡単な Ansible インベントリの作成

Ansible は、管理するホストを定義するためにインベントリファイルを使用します。この実験(Lab)では、自分のマシンを含むローカルインベントリを作成します。

  1. Ansible プロジェクト用の新しいディレクトリを作成します。
mkdir -p ~/project/ansible-files
cd ~/project/ansible-files
  1. VSCode を使用してインベントリファイルを作成します。
    • WebIDE のエクスプローラーアイコンをクリックします。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を inventory とします。
    • ファイルに次の内容を追加します。
[local]
localhost ansible_connection=local

このインベントリファイルは、SSH を使用せずにローカルマシンでコマンドを実行するように Ansible に指示します。

  1. 同じディレクトリに簡単な ansible.cfg ファイルを作成します。
    • WebIDE のエクスプローラーアイコンをクリックします。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を ansible.cfg とします。
    • ファイルに次の内容を追加します。
[defaults]
inventory = ./inventory
host_key_checking = False
  1. 簡単な Ansible コマンドを実行して、セットアップを確認しましょう。
cd ~/project/ansible-files
ansible local -m ping

次のような出力が表示されるはずです。

localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

これにより、Ansible が正しくインストールされ、ローカルマシンでコマンドを実行するように設定されていることが確認されます。

Ansible Playbook を使用したコンテンツ付きファイルの作成

Ansible のセットアップが完了したので、コンテンツ付きファイルの作成方法を学びましょう。Ansible は、ファイルを管理するためのいくつかのモジュールを提供しており、このステップでは copy モジュールに焦点を当てます。

Ansible Playbook の理解

Ansible Playbook は、ターゲットホストで実行される一連のタスクを記述する YAML ファイルです。各タスクは、特定のアクションを実行するために、特定の Ansible モジュールを利用します。

コンテンツ付きのファイルを作成するための最初の Playbook を作成しましょう。

  1. WebIDE で、~/project/ansible-files ディレクトリに新しいファイルを作成します。
    • ディレクトリを右クリックして「新しいファイル」を選択します。
    • ファイル名を create_file.yml とします。
    • 次の内容を追加します。
---
- name: Create a file with content
  hosts: local
  tasks:
    - name: Create a simple text file
      copy:
        dest: "~/project/hello.txt"
        content: |
          Hello from Ansible!
          This file was created using the Ansible copy module.
          Current date: {{ ansible_date_time.date }}

この Playbook が何をするのかを理解しましょう。

  • hosts: local 行は、この Playbook がインベントリの local グループ内のホストで実行されることを指定します。
  • tasks セクションには、実行するタスクのリストが含まれています。
  • copy モジュールは、コンテンツ付きのファイルを作成するために使用されます。
  • dest パラメータは、ファイルの宛先パスを指定します。
  • content パラメータには、ファイルに書き込まれるテキストコンテンツが含まれています。
  • {{ ansible_date_time.date }} は、Playbook の実行時に現在の日付に置き換えられる変数です。
  1. 次に、Playbook を実行しましょう。
cd ~/project/ansible-files
ansible-playbook create_file.yml

次のような出力が表示されるはずです。

PLAY [Create a file with content] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple text file] ***********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. ファイルが作成され、期待されるコンテンツが含まれていることを確認しましょう。
cat ~/project/hello.txt

次のような出力が表示されるはずです。

Hello from Ansible!
This file was created using the Ansible copy module.
Current date: 2023-08-15

日付は、Playbook を実行した現在の日付を反映します。

Ansible における冪等性(Idempotence)

冪等性(Idempotence)は Ansible の重要な機能です。同じ Playbook を複数回実行しても、同じ結果が得られるはずです。Playbook をもう一度実行して、冪等性がどのように機能するかを見てみましょう。

ansible-playbook create_file.yml

今回は、「changed」カウントが 0 になるはずです。

PLAY [Create a file with content] ***********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a simple text file] ***********************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

これは、Ansible がファイルが既に正しいコンテンツで存在すること認識し、再度変更しないことを示しています。

Ansible での変数とテンプレートの使用

このステップでは、変数とテンプレートを使用して、Ansible でより動的なファイルを作成する方法を説明します。

変数の使用

変数は、Playbook をより柔軟で再利用可能にします。変数を使用して設定ファイルを作成する Playbook を作成しましょう。

  1. WebIDE で、~/project/ansible-files ディレクトリに新しいファイルを作成します。
    • ディレクトリを右クリックして「新しいファイル」を選択します。
    • ファイル名を variables_demo.yml とします。
    • 次の内容を追加します。
---
- name: Create files using variables
  hosts: local
  vars:
    app_name: "MyApplication"
    app_version: "1.0.0"
    port_number: 8080
    log_level: "INFO"
  tasks:
    - name: Create config file with variables
      copy:
        dest: "~/project/app_config.ini"
        content: |
          ## Configuration for {{ app_name }}
          ## Generated by Ansible

          [application]
          name = {{ app_name }}
          version = {{ app_version }}

          [server]
          port = {{ port_number }}
          log_level = {{ log_level }}

この Playbook では、

  • vars セクションは、Playbook 全体で使用できる変数を定義します。
  • 変数は、{{ variable_name }} 構文を使用して参照されます。
  • copy モジュールは、これらの変数を含むコンテンツでファイルを作成するために使用されます。
  1. 次に、Playbook を実行しましょう。
cd ~/project/ansible-files
ansible-playbook variables_demo.yml

次のような出力が表示されるはずです。

PLAY [Create files using variables] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create config file with variables] ***************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. 生成されたファイルの内容を調べてみましょう。
cat ~/project/app_config.ini

次のような出力が表示されるはずです。

## Configuration for MyApplication
## Generated by Ansible

[application]
name = MyApplication
version = 1.0.0

[server]
port = 8080
log_level = INFO

Jinja2 テンプレートの使用

より複雑なファイルコンテンツの場合、Ansible は Jinja2 テンプレートをサポートしています。テンプレートファイルを作成し、Playbook で使用してみましょう。

  1. テンプレートディレクトリを作成します。
mkdir -p ~/project/ansible-files/templates
  1. WebIDE でテンプレートファイルを作成します。
    • ~/project/ansible-files/templates ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を web_config.j2 とします。
    • 次の内容を追加します。
## Web Server Configuration
## Generated by Ansible on {{ ansible_date_time.date }}

server {
    listen {{ web_port }};
    server_name {{ server_name }};

    location / {
        root {{ doc_root }};
        index index.html;
    }

    {% if enable_ssl %}
    ## SSL Configuration
    ssl_certificate {{ ssl_cert }};
    ssl_certificate_key {{ ssl_key }};
    {% endif %}
}
  1. 次に、このテンプレートを使用する Playbook を作成します。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を template_demo.yml とします。
    • 次の内容を追加します。
---
- name: Create files using templates
  hosts: local
  vars:
    web_port: 80
    server_name: "example.com"
    doc_root: "/var/www/html"
    enable_ssl: true
    ssl_cert: "/etc/ssl/certs/example.com.crt"
    ssl_key: "/etc/ssl/private/example.com.key"
  tasks:
    - name: Create web server config from template
      template:
        src: templates/web_config.j2
        dest: ~/project/web_server.conf

この Playbook では、

  • template モジュールが copy の代わりに使用されます。
  • src パラメータは、テンプレートファイルを指します。
  • dest パラメータは、出力ファイルの作成場所を指定します。
  • vars セクションで定義された変数は、テンプレートで使用されます。
  1. Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook template_demo.yml

次のような出力が表示されるはずです。

PLAY [Create files using templates] ********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create web server config from template] **********************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. 生成された設定ファイルを調べてみましょう。
cat ~/project/web_server.conf

次のような出力が表示されるはずです。

## Web Server Configuration
## Generated by Ansible on 2023-08-15

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        index index.html;
    }

    ## SSL Configuration
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
}

Jinja2 テンプレートが変数でレンダリングされ、enable_ssltrue に設定されているため、SSL の条件付きセクションが含まれていることに注意してください。

Ansible を使用した高度なファイル管理

この最終ステップでは、ファイルパーミッション、条件付きファイル作成、および複数のファイル関連モジュールの使用など、Ansible を使用した高度なファイル管理テクニックを探求します。

ファイルパーミッションと所有権の設定

ファイルを作成する際には、多くの場合、特定のパーミッションと所有権を設定する必要があります。これを示す Playbook を作成しましょう。

  1. WebIDE で新しいファイルを作成します。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を file_permissions.yml とします。
    • 次の内容を追加します。
---
- name: Manage file permissions and ownership
  hosts: local
  tasks:
    - name: Create a script file with execute permissions
      copy:
        dest: ~/project/script.sh
        content: |
          #!/bin/bash
          echo "This script was created by Ansible"
          echo "Current user: $(whoami)"
          echo "Current directory: $(pwd)"
        mode: "0755"

    - name: Create a read-only configuration file
      copy:
        dest: ~/project/readonly.conf
        content: |
          ## This is a read-only configuration file
          setting1 = value1
          setting2 = value2
        mode: "0444"

この Playbook では、

  • mode パラメータは、ファイルパーミッションを設定するために使用されます。
  • 0755 は、所有者に対して読み取り、書き込み、実行を許可し、グループとその他に対して読み取りと実行を許可します。
  • 0444 は、すべての人に対して読み取り専用を意味します。
  1. Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook file_permissions.yml

次のような出力が表示されるはずです。

PLAY [Manage file permissions and ownership] **********************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a script file with execute permissions] **************************
changed: [localhost]

TASK [Create a read-only configuration file] **********************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. 作成されたファイルのパーミッションを確認しましょう。
ls -l ~/project/script.sh ~/project/readonly.conf

次のような出力が表示されるはずです。

-rwxr-xr-x 1 labex labex 118 Aug 15 12:34 /home/labex/project/script.sh
-r--r--r-- 1 labex labex  73 Aug 15 12:34 /home/labex/project/readonly.conf
  1. スクリプトが実行可能であることを確認しましょう。
~/project/script.sh

次のような出力が表示されるはずです。

This script was created by Ansible
Current user: labex
Current directory: /home/labex/project/ansible-files

条件付きファイル作成

特定の条件が満たされた場合にのみファイルを作成する必要がある場合があります。条件付きファイル作成を示す Playbook を作成しましょう。

  1. WebIDE で新しいファイルを作成します。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を conditional_file.yml とします。
    • 次の内容を追加します。
---
- name: Conditional file creation
  hosts: local
  vars:
    environment: "development"
    create_debug_file: true
    create_backup: false
  tasks:
    - name: Create environment-specific configuration
      copy:
        dest: "~/project/{{ environment }}_config.yml"
        content: |
          ## Configuration for {{ environment }} environment
          debug: {{ 'enabled' if environment == 'development' else 'disabled' }}
          log_level: {{ 'DEBUG' if environment == 'development' else 'INFO' }}

    - name: Create debug log file
      copy:
        dest: ~/project/debug.log
        content: |
          ## Debug log file
          ## Created: {{ ansible_date_time.iso8601 }}
        mode: "0644"
      when: create_debug_file

    - name: Create backup directory
      file:
        path: ~/project/backup
        state: directory
        mode: "0755"
      when: create_backup

この Playbook では、

  • when ディレクティブは、タスクの条件付き実行に使用されます。
  • Jinja2 の条件文は、変数を基に値を変更するためにファイルコンテンツで使用されます。
  • file モジュールは、ディレクトリを作成するために使用されます。
  1. Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook conditional_file.yml

次のような出力が表示されるはずです。

PLAY [Conditional file creation] **********************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create environment-specific configuration] ******************************
changed: [localhost]

TASK [Create debug log file] **************************************************
changed: [localhost]

TASK [Create backup directory] ************************************************
skipped: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

create_backupfalse に設定されているため、「Create backup directory」タスクがスキップされたことに注意してください。

  1. 作成されたファイルを調べてみましょう。
cat ~/project/development_config.yml
cat ~/project/debug.log
ls -la ~/project/ | grep backup

作成された 2 つのファイルの内容が表示され、バックアップディレクトリが作成されていないことを確認できます。

複数のファイル関連モジュールの使用

Ansible は、ファイル管理のためのいくつかのモジュールを提供しています。複数のファイル関連モジュールを使用する Playbook を作成しましょう。

  1. WebIDE で新しいファイルを作成します。
    • ~/project/ansible-files ディレクトリに移動します。
    • 右クリックして「新しいファイル」を選択します。
    • ファイル名を file_modules.yml とします。
    • 次の内容を追加します。
---
- name: Demonstrate file-related modules
  hosts: local
  tasks:
    - name: Create a directory
      file:
        path: ~/project/ansible_demo
        state: directory
        mode: "0755"

    - name: Create a file using the copy module
      copy:
        dest: ~/project/ansible_demo/copied.txt
        content: "This file was created using the copy module.\n"

    - name: Create a symbolic link
      file:
        src: ~/project/ansible_demo/copied.txt
        dest: ~/project/ansible_demo/link_to_copied.txt
        state: link

    - name: Create a file with blockinfile module
      blockinfile:
        path: ~/project/ansible_demo/block.txt
        create: true
        block: |
          This is a block of text
          that will be inserted
          as a single unit.
        marker: "## {mark} ANSIBLE MANAGED BLOCK"

この Playbook では、

  • file モジュールは、state: directory と共に使用され、ディレクトリを作成します。
  • file モジュールは、state: link と共に使用され、シンボリックリンクを作成します。
  • blockinfile モジュールは、マーカーコメントで囲まれたテキストブロックを含むファイルを作成するために使用されます。
  1. Playbook を実行します。
cd ~/project/ansible-files
ansible-playbook file_modules.yml

次のような出力が表示されるはずです。

PLAY [Demonstrate file-related modules] ***************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Create a directory] *****************************************************
changed: [localhost]

TASK [Create a file using the copy module] ************************************
changed: [localhost]

TASK [Create a symbolic link] *************************************************
changed: [localhost]

TASK [Create a file with blockinfile module] **********************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=4    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
  1. 結果を確認しましょう。
ls -la ~/project/ansible_demo/
cat ~/project/ansible_demo/copied.txt
cat ~/project/ansible_demo/link_to_copied.txt
cat ~/project/ansible_demo/block.txt

以下が表示されるはずです。

  • ansible_demo という名前のディレクトリ
  • 指定されたコンテンツを持つ copied.txt という名前のファイル
  • copied.txt を指す link_to_copied.txt という名前のシンボリックリンク
  • マーカーコメントで囲まれたテキストブロックを含む block.txt という名前のファイル

最後のコマンドの出力は次のようになるはずです。

## BEGIN ANSIBLE MANAGED BLOCK
This is a block of text
that will be inserted
as a single unit.
## END ANSIBLE MANAGED BLOCK

これは、Ansible のファイル管理機能の多様性を示しています。

まとめ

この Ansible ファイル管理実験を完了したことをおめでとうございます。いくつかの重要な概念とテクニックを学びました。

  1. 基本的な自動化タスクのために Ansible をインストールおよび設定する方法
  2. copy モジュールを使用して、特定のコンテンツを持つファイルを作成する
  3. 変数を使用して、ファイルコンテンツを動的にする
  4. より複雑なファイル生成のために Jinja2 テンプレートを使用する
  5. ファイルのパーミッションと所有権を設定する
  6. 変数に基づいて条件付きファイル作成を実装する
  7. さまざまなファイル管理タスクにさまざまな Ansible モジュールを使用する

これらのスキルは、インフラストラクチャにおけるファイル管理タスクを自動化するための強固な基盤を形成します。Ansible を使用すると、複数のサーバー間で一貫したファイルコンテンツを確保し、制御された方法で変更を適用し、構成の監査可能な記録を維持できます。

Ansible の学習を続けるには、ロール、Playbook の構成、Ansible と他の DevOps ツールとの統合などのより高度なトピックを検討してください。