Ansible設定 · 3 min read · Dec 20, 2025

Ubuntu 22.04にAnsibleをインストールして設定する方法

Ansibleは、大量のサーバーを制御するプロセスを簡素化するために設計された非常に人気のある構成管理ツールです。新しいサーバーのセットアップやアプリケーションのインストールを、単一のコマンドまたはファイルで自動化できます。単一のノードから、複数のサーバーを同時に制御し、プロセスを実行できます。Ansibleは、サーバーノードに特別なソフトウェアをインストールする必要がなく、SSHを介して制御できます。

このガイドでは、Ubuntu 22.04サーバーにAnsibleをインストールして設定する方法を学びます。

前提条件

  • OpenSSHサーバーがインストールされたUbuntu 22.04を実行している2台以上のサーバーシステム。
  • サーバーとノードの両方がパブリックIPアドレスを介してアクセス可能であること。
  • Ansibleサーバーにsudo権限を持つ非rootユーザーが設定されており、Ansibleクライアントにパスワードを持つrootユーザーが設定されていること。

ステップ1 - Ansibleをインストールする

Ansibleの最新バージョンをインストールするために、Ansibleの公式リポジトリを使用します。サーバーにAnsibleの公式リポジトリを追加します。

$ sudo add-apt-repository ppa:ansible/ansible

幸運なことに、UbuntuにはAnsible 2.9が付属しており、これをインストールします。次のコマンドを実行してAnsibleをインストールします。

$ sudo apt install ansible -y

次のコマンドを実行してインストールをテストします。

$ ansible --version
ansible [core 2.13.3rc1]
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/navjot/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/navjot/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible
  python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
  jinja version = 3.0.3
  libyaml = True

Ansibleのbash補完サポートを設定するために、python3-argcompleteパッケージをインストールしてアクティブにします。

$ sudo apt install python3-argcomplete
$ sudo activate-global-python-argcomplete3

これで、Tabキーを押すとbashシェルのオプションのリストが表示されます。

ステップ2 - インベントリファイルの設定

複数のホストに接続できるようにするためには、ノードの詳細を記録するファイルが必要です。このファイルはインベントリファイルと呼ばれます。

制御したいサーバーの数に応じて、Ansibleのインベントリファイルでは、サーバーをグループおよびサブグループに整理することもできます。また、選択したホストやグループに適用されるカスタム変数を設定することもでき、指示を渡す際にさらに使用できます。

Ansibleには、/etc/ansible/hostsにデフォルトのインベントリファイルが付属しています。Nanoエディタで開きます。

$ sudo nano /etc/ansible/hosts

ファイルの下部に次のコードを貼り付けます。

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113

[all:vars]
ansible_python_interpreter=/usr/bin/python3

serversセクションは、接続したいノードのリストを定義します。サーバーを複数のグループに整理するために、必要なだけ多くのグループを作成できます。

all:varsグループは、インベントリ内のすべてのホストにansible_python_interpreterパラメータを設定します。これにより、Ansibleは最近のUbuntuバージョンから削除されたPython 2ではなく、Python 3の実行可能ファイルを使用することが保証されます。

完了したら、Ctrl + Xを押してファイルを保存し、変更を確認するためにYを入力します。

注意: インベントリファイルは、任意の場所に作成することもでき、その後Ansibleコマンドを実行する際に-iパラメータを使用して渡すことができます。

次のコマンドでインベントリリストを確認できます。

$ ansible-inventory --list -y
all:
  children:
    servers:
      hosts:
        server1:
          ansible_host: 203.0.113.111
          ansible_python_interpreter: /usr/bin/python3
        server2:
          ansible_host: 203.0.113.112
          ansible_python_interpreter: /usr/bin/python3
        server3:
          ansible_host: 203.0.113.113
          ansible_python_interpreter: /usr/bin/python3
    ungrouped: {}

サーバーをグループおよびサブグループに整理する

これは、特定の機能を持つサーバーが多数ある場合に便利なヒントです。たとえば、この方法を使用して、Webサーバーとデータベースサーバーを別々にグループ化できます。ホストを複数のグループの一部にすることもできます。それを実現するために、インベントリファイルは次のようになります。

[webservers]
203.0.113.111
203.0.113.112

[dbservers]
203.0.113.113
server_hostname

[development]
203.0.113.111
203.0.113.113

[production]
203.0.113.112
server_hostname

ステップ3 - SSHキーの設定

Ansibleがサーバーに接続できるようにするためには、Ansibleサーバーとインベントリファイルに指定されたホスト間でSSHキーを設定する必要があります。これは、Ansibleクライアントにパブリックキーが有効になっておらず、パスワードを持つrootアカウントが有効になっている場合にのみ機能します。

Ansibleとそのノード用のSSHキーを作成して設定するための手順は次のとおりです。

Ansible用のキーを作成します。

$ ssh-keygen -t rsa -b 4096 -C "Ansible key"

リモートサーバーのアカウントに公開鍵をコピーします。これには、ssh-copy-idコマンドを使用します。

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]
$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email protected]

これで完了です。Ansibleはサーバーと通信できるようになります。

既存の公開鍵を持つノードでのSSHキーの設定

クライアントにすでに公開鍵が有効になっている場合、いくつかの追加手順を実行する必要があります。そのためには、各ノードサーバーにAnsibleからのみアクセスできる新しいユーザーを作成する必要があります。そのユーザーは、パスワードなしでアクセスできるsudo権限を持ち、Ansibleサーバーからのみアクセス可能です。

ansibleユーザーを作成するには、次のコマンドを実行します。

$ sudo adduser ansible

強力なパスワードを選択し、他のすべてのフィールドは空のままにします。

次に、次のコマンドを使用して、このユーザーにパスワードなしのsudoアクセスを設定します。

$ echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible

新しいユーザーが追加され、設定されたので、次のコマンドを使用してAnsibleサーバーからノードサーバーにSSHキーをコピーできます。

$ ssh-copy-id [email protected]

ansibleユーザーのパスワードを求められます。入力すると、SSHキーがコピーされます。

次に、ノードサーバーのansibleユーザーのパスワードベースのログインを無効にします。

$ sudo usermod -L ansible

これで、ノードサーバーはAnsibleサーバーからのみアクセス可能です。なぜなら、そのサーバーだけが公開鍵を持っており、パスワードログインが無効になっているため、ノードサーバーでsudo権限を使用することはできません。

これらの手順を各ノードサーバーに対して繰り返す必要があります。また、このチュートリアルではrootユーザーをansibleユーザーに置き換えてください。

ステップ4 - 接続のテスト

インベントリファイルとSSHキーを設定した後、Ansibleがサーバーに接続できるかどうかを確認します。

次のコマンドを入力して接続を確認します。このコマンドは、インベントリファイルからすべてのサーバーへの接続をテストします。

$ ansible all -m ping -u root

このコマンドは、Ansibleのpingモジュールを使用して、すべてのサーバーで接続テストを実行します。次のような出力が得られるはずです。

server1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

これが初めてAnsibleを使用する場合、すべてのサーバーの信頼性を確認するよう求められます。プロンプトが表示されたら、yesと入力してENTERを押して確認します。

ステップ5 - 基本的なコマンドを実行する

Ansibleを使用してサーバーで基本的なコマンドを実行してみましょう。サーバーでコマンドを実行するには、次の形式を使用します。

$ ansible all -a "command" -u 

ディスク使用量の確認

まず、すべてのサーバーでディスク使用量を確認しましょう。

$ ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           198M  972K  197M   1% /run
/dev/sda2        50G  3.9G   44G   9% /
tmpfs           989M     0  989M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           198M  4.0K  198M   1% /run/user/1000

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           198M  922K  197M   1% /run
/dev/sda2        50G  4.9G   43G  10% /
tmpfs           989M     0  989M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           198M  4.0K  198M   1% /run/user/1000

個別ホストとグループをターゲットにする

これまで、すべてのリモートサーバーでコマンドを一度に実行していました。しかし、常にそうであるとは限りません。特定のサーバーでコマンドを実行するには、次の形式を使用します。

$ ansible server1 -a "uptime" -u root
server1 | CHANGED | rc=0 >>
 21:38:26 up 11 min,  2 users,  load average: 0.00, 0.20, 0.19

上記のコマンドは、インベントリグループからserver1の稼働時間を確認します。

次の形式を使用して複数のサーバーをターゲットにすることもできます。

$ ansible server1:server2 -m ping -u root

インベントリファイルからグループやサブグループを直接ターゲットにすることもできます。

$ ansible groupname -m ping -u 

すべてのサーバーを更新する

このチュートリアルでは、すべてのリモートサーバーがDebianまたはUbuntu OSを実行していると仮定しています。

次のコマンドを実行して、すべてのサーバーのソフトウェアを更新します。

$ ansible all -m apt -a "update_cache=yes upgrade=yes" -u root

-mパラメータは、Ansibleが実行するモジュールを定義します。-aパラメータは、関連するモジュールの引数またはコマンドを指します。ここでは、前の例でpingモジュールを使用したように、サーバーを更新するためにAnsibleのaptモジュールを使用しています。update_cacheはサーバーのAPTキャッシュを更新し、upgrade=yesはAnsibleにapt upgradeコマンドを実行するよう指示します。

上記の手順でansibleユーザーを使用している場合、ansibleコマンドを昇格したsudo権限で実行するように修正する必要があります。

$ ansible server2 -m apt -a "update_cache=yes upgrade=yes" -K -b -u ansible

ここで、-Kは特権昇格パスワードを要求します。-bは、別のユーザーとして操作を実行できるようにするbecomeでAnsible操作を実行します。これらの変数を組み合わせることで、Ansibleは昇格したsudo権限で実行されます。sudo権限が必要なすべてのコマンドにこれを使用する必要があります。

時には、これらの更新コマンドのいくつかが再起動を要求する場合があるため、次のコマンドを実行してすべてのサーバーを再起動します。

$ ansible all -a "reboot" -u root

これらは、Ansibleを使用して実行できる基本的なコマンドの一部に過ぎません。

ステップ6 - プレイブックの紹介

上記のコマンドは、一度限りのタスクを実行することを可能にしますが、複数のサーバーを設定したり、複数のサーバーで同じコマンドのシーケンスを実行したりする場合は、プレイブックを設定する必要があります。プレイブックはYAMLで書かれたファイルで、アプリケーションやサービスのセットアップのためのタスクのシーケンスを自動化する指示を含みます。

これから、Nginxをインストールし、AnsibleノードにHTMLページを設定するためのプレイブックを作成します。ホームディレクトリにAnsible用のディレクトリを作成します。

$ mkdir ~/ansible

プレイブックファイルを作成して編集のために開きます。

$ cd ~/ansible
$ nano testplaybook.yml

プレイブックは、1つ以上のプレイを定義するためにYAML形式を使用します。プレイは、プロセスを自動化するために順序付けられたタスクのセットです。プレイはYAMLリストとして定義されます。

プレイを定義する最初のステップは、hosts: allディレクティブを使用してターゲットホストを決定することです。becomeディレクティブは、次のタスクがスーパーユーザーによって実行される必要があることを示すために使用されます。

3つのタスクを定義します。1つはユーザーを追加するため、1つはすべてのパッケージをアップグレードするため、最後の1つはNginxサーバーをインストールするためです。プレイブックのvarsセクションは、カスタム変数を定義するために使用されます。追加する必要があるユーザーのための変数と、インストールする必要があるパッケージの状態を定義するための2つの変数を定義します。変数を使用するには、変数名を二重波括弧で囲む必要があります。

ansible.builtin.userモジュールは、sudo権限を持つ新しいユーザーを追加するために使用されます。ユーザーを追加するために、namepassword、およびgroup変数を使用します。group変数は、ユーザーにスーパーユーザー権限を付与するためにsudoに設定されます。プレイブックファイルに平文のパスワードを記述することはできないため、SHAハッシュ化された秘密を追加します。それを生成するために、次のコマンドを実行してwhoisパッケージをインストールします。

$ sudo apt install whois

ハッシュ化されたパスワードを生成します。通常のパスワードを求められ、ハッシュ化された文字列が得られます。プレイブックファイルで使用するために、ハッシュキーをメモしておきます。

$ mkpasswd --method=sha-512
Password:
$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1

update_cacheディレクティブは、apt updateコマンドと同様にシステムのリポジトリリストを更新し、upgrade: distディレクティブはAnsibleにシステムのアップグレードを実行するよう指示します。3番目のタスクは、最新のNginxサーバーをインストールするもので、説明は不要です。

私たちが議論した情報に基づいて、次のコードをファイルに貼り付けます。password変数の値として、取得したハッシュキーを貼り付けます。

---
- name: Test playbook
  hosts: all
  become: true
  vars:
      state: latest
      user: navjot
  tasks:
  - name: Add the user {{ user }}
    ansible.builtin.user:
      name: "{{ user }}"
      password: '$6$dGbprm2oVqClDDDh$Epk6r5eXYkYBaQpQpP.H7VCdz0g9Aj0aO8hjy/WXq4WmfQ7GvQP2/cl/cNhd7.LRFuCKix9uCF2t8X5/Pv0Lk1'
      group: sudo
  - name: Upgrade all apt packages
    apt:
      update_cache: yes
      upgrade: dist
  - name: Install the {{ state }} of package "nginx"
    apt:
      name: "nginx"
      state: "{{ state }}"

Ctrl + Xを押してファイルを保存し、変更を確認するためにYを入力します。

プレイブックを実行するには、次のコマンドを実行します。--ask-become-passフラグは、昇格された操作を実行するためにrootパスワードを要求します。

$ ansible-playbook testplaybook.yml --ask-become-pass

次の出力が得られます。

BECOME password:

PLAY [Test playbook] *************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************
ok: [server1]
ok: [server2]
ok: [server3]

TASK [Add the user casablanca] *************************************************************************************
changed: [server3]
changed: [server2]
changed: [server1]

TASK [Upgrade all apt packages] ************************************************************************************
changed: [server1]
changed: [server2]
changed: [server3]

TASK [Install the latest of package "nginx"] ***********************************************************************
changed: [server3]
changed: [server2]
changed: [server1]

PLAY RECAP ***********************************************************************************************************
server1                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
server2                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
server3                    : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

これにより、プレイブックが正常に実行されたことが確認されます。

カスタムインベントリファイルを使用している場合は、次のようにコマンドにファイルの場所を含める必要があります。

$ ansible-playbook -i /etc/ansible/custominventory testplaybook.yml --ask-become-pass 

結論

これで、Ubuntu 22.04サーバーにAnsibleをインストールして設定する方法に関するチュートリアルは終了です。質問がある場合は、下のコメントに投稿してください。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。