Ansible get_url モジュールで特定の URL からファイルをダウンロードする方法

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

はじめに

Ansible は、IT インフラストラクチャの管理を簡素化する強力なオープンソースの自動化ツールです。このチュートリアルでは、特定の URL からファイルをダウンロードできる Ansible の get_url モジュールについて解説します。このモジュールは、ソフトウェアのインストール、構成管理、コンテンツのデプロイなど、自動化タスクに不可欠です。

このチュートリアルを通して、Ansible のセットアップ方法、get_url モジュールの基本および高度なオプションの使用方法、そしてファイルダウンロードを自動化するための実践的な例を学びます。このガイドの終わりには、このモジュールを活用してファイル管理プロセスを効率化する方法をしっかりと理解できるようになります。

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

get_url モジュールを使用する前に、Ansible がシステムに正しくインストールされ、設定されていることを確認する必要があります。

Ansible のインストール

まず、LabEx 環境に Ansible をインストールすることから始めましょう。

sudo apt update
sudo apt install -y ansible

これらのコマンドを実行した後、Ansible のバージョンを確認して、正しくインストールされていることを確認します。

ansible --version

Ansible のバージョンと設定の詳細を示す、次のような出力が表示されるはずです。

ansible [core 2.12.x]
  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
  executable location = /usr/bin/ansible
  python version = 3.10.x (default, ...) [GCC 11.x]

作業ディレクトリの作成

次に、Ansible プロジェクト専用のディレクトリを作成しましょう。

mkdir -p ~/project/ansible-get-url
cd ~/project/ansible-get-url

簡単なインベントリの設定

Ansible は、どのホストを管理するかを知る必要があります。このチュートリアルでは、ローカルマシンをターゲットとする簡単なインベントリファイルを作成します。

echo "localhost ansible_connection=local" > inventory.ini

このインベントリファイルは、ローカル接続を使用して Ansible を localhost に対して実行することを指定しています。

Ansible 設定ファイルの作成

Ansible の動作をカスタマイズするために、簡単な設定ファイルを作成しましょう。

cat > ansible.cfg << EOF
[defaults]
inventory = inventory.ini
host_key_checking = False
EOF

この設定ファイルは、Ansible にインベントリファイルを使用するように指示し、テスト環境での接続を簡素化するためにホストキーチェックを無効にします。

Ansible セットアップのテスト

簡単な ping コマンドを実行して、Ansible の設定が正しく機能していることを確認しましょう。

ansible localhost -m ping

次のような成功した応答が表示されるはずです。

localhost | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

この出力は、Ansible が正しくインストールされ、localhost と通信できることを確認しています。これで、次のステップで get_url モジュールを使用する準備ができました。

get_url モジュールを使用した基本的な Playbook の作成

Ansible がセットアップされたので、get_url モジュールを使用して URL からファイルをダウンロードするシンプルな Playbook を作成しましょう。

Ansible Playbook の理解

Ansible Playbook は、管理対象ホストで実行される一連のタスクを定義する YAML ファイルです。Playbook は一連のプレイとして構成され、各プレイは以下で構成されます。

  • ターゲットとするホストのセット
  • 実行するタスクのセット

最初の Playbook の作成

get_url モジュールを使用する基本的な Playbook を作成しましょう。プロジェクトディレクトリに download-file.yml という名前のファイルを作成します。

cd ~/project/ansible-get-url

ファイルエディタを開き、次の内容でファイルを作成します。

---
- name: Download a file from URL
  hosts: localhost
  become: no
  tasks:
    - name: Create downloads directory
      file:
        path: ~/project/ansible-get-url/downloads
        state: directory
        mode: "0755"

    - name: Download a sample text file
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/README.md
        dest: ~/project/ansible-get-url/downloads/ansible-readme.md
        mode: "0644"

この Playbook は、次のことを行います。

  1. ダウンロードしたファイルを保存するための downloads ディレクトリを作成します。
  2. get_url モジュールを使用して、GitHub から Ansible README.md ファイルをダウンロードします。

get_url モジュールパラメータの理解

get_url タスクの主要なパラメータを分解してみましょう。

  • url: ファイルのダウンロード元となる URL を指定します。
  • dest: ファイルが保存される宛先パスを定義します。
  • mode: ファイルのパーミッションを設定します (0644 は所有者に対して読み取りと書き込み、グループとその他に対して読み取りを意味します)。

Playbook の実行

Playbook を作成したので、ansible-playbook コマンドを使用して実行しましょう。

ansible-playbook download-file.yml

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

PLAY [Download a file from URL] ***********************************************

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

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

TASK [Download a sample text file] ********************************************
changed: [localhost]

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

ダウンロードしたファイルの検証

ファイルが正しくダウンロードされたことを確認しましょう。

ls -l ~/project/ansible-get-url/downloads/

ダウンロードしたファイルが表示されるはずです。

-rw-r--r-- 1 labex labex 3154 Mar 15 12:34 ansible-readme.md

ダウンロードしたファイルの内容を表示することもできます。

head -n 10 ~/project/ansible-get-url/downloads/ansible-readme.md

これにより、Ansible README.md ファイルの最初の 10 行が表示され、正常にダウンロードされたことが確認されます。

おめでとうございます!get_url モジュールを使用して URL からファイルをダウンロードする最初の Ansible Playbook を正常に作成し、実行しました。

高度な get_url オプションの使用

基本をカバーしたので、実際のシナリオで役立つ get_url モジュールの高度なオプションをいくつか見ていきましょう。

高度な Playbook の作成

さまざまな高度なオプションを示す、advanced-download.yml という名前の新しい Playbook を作成しましょう。

cd ~/project/ansible-get-url

ファイルエディタを開き、次の内容でファイルを作成します。

---
- name: Advanced get_url Module Options
  hosts: localhost
  become: no
  tasks:
    - name: Create advanced downloads directory
      file:
        path: ~/project/ansible-get-url/advanced-downloads
        state: directory
        mode: "0755"

    - name: Download with checksum validation
      get_url:
        url: https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
        dest: ~/project/ansible-get-url/advanced-downloads/jq
        mode: "0755"
        checksum: sha256:af986793a515d500ab2d35f8d2aecd656e764504b789b66d7e1a0b727a124c44

    - name: Download with timeout and retries
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible-examples/master/README.md
        dest: ~/project/ansible-get-url/advanced-downloads/examples-readme.md
        timeout: 30
        retries: 3
        delay: 5
        force: yes

    - name: Download only if file doesn't exist
      get_url:
        url: https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
        dest: ~/project/ansible-get-url/advanced-downloads/ansible-example.cfg
        force: no

高度なパラメータの理解

この Playbook で使用されている高度なパラメータを見てみましょう。

  1. チェックサム検証 (Checksum Validation):

    • checksum: ダウンロードしたファイルの期待されるチェックサムを指定します (形式:アルゴリズム:チェックサム)
    • これにより、ダウンロードしたファイルの整合性が確保され、正しいチェックサムでファイルが既に存在する場合はダウンロードが防止されます。
  2. タイムアウトと再試行 (Timeout and Retries):

    • timeout: HTTP リクエストが完了するまでの最大時間 (秒単位)
    • retries: ダウンロードが失敗した場合の再試行回数
    • delay: 再試行間の遅延 (秒単位)
    • force: ファイルが既に存在する場合でもファイルをダウンロードするかどうか
  3. 条件付きダウンロード (Conditional Download):

    • force: no: 宛先にファイルが存在しない場合にのみファイルがダウンロードされます。

高度な Playbook の実行

高度な Playbook を実行しましょう。

ansible-playbook advanced-download.yml

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

PLAY [Advanced get_url Module Options] ****************************************

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

TASK [Create advanced downloads directory] ************************************
changed: [localhost]

TASK [Download with checksum validation] **************************************
changed: [localhost]

TASK [Download with timeout and retries] **************************************
changed: [localhost]

TASK [Download only if file doesn't exist] ************************************
changed: [localhost]

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

高度なダウンロードの検証

高度なオプションでダウンロードしたファイルを確認しましょう。

ls -l ~/project/ansible-get-url/advanced-downloads/

ダウンロードしたすべてのファイルが表示されるはずです。

-rwxr-xr-x 1 labex labex 3773448 Mar 15 12:45 jq
-rw-r--r-- 1 labex labex     426 Mar 15 12:45 examples-readme.md
-rw-r--r-- 1 labex labex    1690 Mar 15 12:45 ansible-example.cfg

ダウンロードした jq バイナリが動作するかテストしてみましょう。

~/project/ansible-get-url/advanced-downloads/jq --version

jq のバージョン (例:jq-1.6) を示す出力が表示され、実行可能ファイルが正しいチェックサムで正しくダウンロードされたことが確認されます。

これで、さまざまな要件と制約を持つファイルをダウンロードするために、get_url モジュールのさまざまな高度なオプションを正常に使用しました。

実用的な Web アプリケーションのデプロイの実装

これまでに学んだことを、より実用的なシナリオに適用してみましょう。Ansible の get_url モジュールを使用して、シンプルな Web アプリケーションをデプロイします。

Web アプリケーションプロジェクトのセットアップ

まず、Web アプリケーションのディレクトリ構造を作成しましょう。

mkdir -p ~/project/ansible-get-url/webapp/public
cd ~/project/ansible-get-url

Web アプリケーションデプロイ Playbook の作成

次に、Web アプリケーションに必要なファイルをダウンロードする deploy-webapp.yml という名前の Playbook を作成します。

---
- name: Deploy Web Application Files
  hosts: localhost
  become: no
  vars:
    webapp_dir: ~/project/ansible-get-url/webapp
    assets_base_url: https://raw.githubusercontent.com/ansible/ansible-documentation/devel/docs/docsite/rst/_static
  tasks:
    - name: Ensure webapp directories exist
      file:
        path: "{{ item }}"
        state: directory
        mode: "0755"
      loop:
        - "{{ webapp_dir }}"
        - "{{ webapp_dir }}/public"
        - "{{ webapp_dir }}/public/css"
        - "{{ webapp_dir }}/public/images"

    - name: Create index.html
      copy:
        dest: "{{ webapp_dir }}/public/index.html"
        content: |
          <!DOCTYPE html>
          <html>
          <head>
            <title>Ansible Demo App</title>
            <link rel="stylesheet" href="css/style.css">
          </head>
          <body>
            <div class="container">
              <h1>Welcome to Ansible Demo</h1>
              <p>This site was deployed using Ansible's get_url module!</p>
              <img src="images/ansible-logo.png" alt="Ansible Logo">
            </div>
          </body>
          </html>

    - name: Download CSS file
      get_url:
        url: "{{ assets_base_url }}/css/ansible.css"
        dest: "{{ webapp_dir }}/public/css/style.css"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Download Ansible logo
      get_url:
        url: "{{ assets_base_url }}/images/ansible_logo.svg"
        dest: "{{ webapp_dir }}/public/images/ansible-logo.png"
        mode: "0644"
        timeout: 30
        retries: 3

    - name: Install Python HTTP server
      apt:
        name: python3-http.server
        state: present
      become: yes

    - name: Display information about running the web server
      debug:
        msg: |
          Web application has been deployed!
          To start the web server, run:
          cd {{ webapp_dir }}/public && python3 -m http.server 8080
          Then access it at: http://localhost:8080

この Playbook は、次のことを行います。

  1. Web アプリケーションに必要なディレクトリ構造を作成します。
  2. 基本的な HTML コンテンツを含む index.html ファイルを作成します。
  3. get_url モジュールを使用して、CSS ファイルと Ansible ロゴ画像をダウンロードします。
  4. Python HTTP サーバーをインストールします。
  5. Web サーバーの実行方法に関する情報を表示します。

Web アプリケーションデプロイ Playbook の実行

Playbook を実行しましょう。

ansible-playbook deploy-webapp.yml

Web アプリケーションが正常にデプロイされたことを示す出力が表示されるはずです。

Web サーバーの起動

次に、デプロイしたアプリケーションをテストするために、Web サーバーを起動しましょう。

cd ~/project/ansible-get-url/webapp/public
python3 -m http.server 8080 &

Web サーバーは、ポート 8080 でバックグラウンドで実行されるようになりました。ブラウザアクセスが可能な通常の環境であれば、http://localhost:8080 で Web アプリケーションにアクセスできます。

デプロイされたファイルの確認

必要なすべてのファイルが正しくデプロイされたことを確認しましょう。

ls -la ~/project/ansible-get-url/webapp/public/

index.html ファイルと作成したディレクトリが表示されるはずです。

ls -la ~/project/ansible-get-url/webapp/public/css/

ダウンロードした CSS ファイルが表示されるはずです。

ls -la ~/project/ansible-get-url/webapp/public/images/

ダウンロードした Ansible ロゴ画像が表示されるはずです。

HTML コンテンツの表示

index.html ファイルの内容を確認しましょう。

cat ~/project/ansible-get-url/webapp/public/index.html

Playbook で作成した HTML コンテンツが表示されるはずです。

Web サーバーの停止

テストが完了したら、Web サーバーのプロセス ID を見つけて kill することで、Web サーバーを停止できます。

pkill -f "python3 -m http.server 8080"

おめでとうございます!Ansible の get_url モジュールを使用して、必要なファイルをダウンロードすることにより、シンプルな Web アプリケーションを正常にデプロイしました。

まとめ

このチュートリアルでは、Ansible の get_url モジュールを使用して、特定の URL からファイルをダウンロードする実践的な経験を積みました。以下のことを学びました。

  • ローカル開発用に Ansible をインストールおよび設定する方法
  • get_url モジュールを使用してファイルをダウンロードする基本的な Playbook を作成する方法
  • チェックサム検証、タイムアウト、再試行、条件付きダウンロードなどの高度なオプションを利用する方法
  • get_url モジュールを使用した、実用的な Web アプリケーションデプロイのシナリオを実装する方法

これらのスキルは、ソフトウェアデプロイ、コンテンツ管理、システム構成など、さまざまな IT 運用におけるファイル管理タスクを自動化するための基本です。get_url モジュールは、より複雑な Ansible ワークフローに統合して、インフラストラクチャ管理プロセスを合理化できる多用途なツールです。

Ansible の学習を続ける中で、より包括的なファイル管理の自動化のために、get_url モジュールを補完する uriunarchivesynchronize などの関連モジュールを検討してください。