ウェブサイト検索

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


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

このチュートリアルはこれらのOSバージョンのために存在します

  • Ubuntu 22.04 (ジャミー・ジェリーフィッシュ)
  • Ubuntu 20.04 (フォーカルフォッサ)
  • Ubuntu 18.04 (ビオニックビーバー)

このページで

  1. 前提条件
  2. Ansibleをインストールする
  3. 在庫ファイルの設定

    1. サーバーをグループおよびサブグループに整理する
  4. SSHキーを設定する

    1. 既存の公開鍵を使用してノードにSSHキーを設定する
  5. 接続テスト
  6. いくつかの基本的なコマンドを実行する

    1. ディスク使用状況を確認する
    2. 対象の個別ホストとグループ
    3. すべてのサーバーを更新する
  7. 結論

Ansibleは、多数のサーバーを管理するプロセスを簡素化するために設計された非常に人気のある構成管理ツールです。単一のノードから、任意の数のサーバーを制御し、それらで同時にプロセスを実行できます。

Ansibleはサーバーノードに特別なソフトウェアをインストールする必要がなく、SSHを介してそれらを制御できます。

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

前提条件

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

Ansibleをインストールする

このチュートリアルを書く時点で、Ansibleの公式リポジトリはUbuntu 20.04をサポートしていません。これは、UbuntuのPythonライブラリのバグによるものです。

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

sudo apt install ansible -y

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

ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/username/.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.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

在庫ファイルの設定

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

制御したいサーバーの数に応じて、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 と ENTER を押して変更を確認します。

注意:お好みの場所に自分自身のインベントリファイルを作成することもでき、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

SSHキーを設定する

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

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 
ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email 
ssh-copy-id -i $HOME/.ssh/id_rsa.pub [email 

それだけです。これで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 

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

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

sudo usermod -L ansible

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

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

接続テスト

在庫ファイルと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を押して確認してください。

いくつかの基本的なコマンドを実行する

Ansibleを使用してサーバー上で基本的なコマンドを実行しましょう。サーバー上でコマンドを実行するには、次のフォーマットを使用します。

ansible all -a "command" -u <username>

ディスク使用状況を確認する

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

ansible all -a "df -h" -u root
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           798M  624K  798M   1% /run
/dev/vda1       155G  2.3G  153G   2% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           798M     0  798M   0% /run/user/0

server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           395M  608K  394M   1% /run
/dev/vda1        78G  2.2G   76G   3% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/vda15      105M  3.6M  101M   4% /boot/efi
tmpfs           395M     0  395M   0% /run/user/0

対象の個別ホストとグループ

これまで、すべてのリモートサーバーで同時にコマンドを実行していました。しかし、必ずしもそうではありません。特定のサーバーでのみコマンドを実行するには、次の形式を使用する必要があります。

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 <username>

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

このチュートリアルでは、すべてのリモートサーバーが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 コマンドを実行するよう指示します。

CentOSサーバーを更新するには、aptをyumに置き換えることで同じコマンドを使用できます。また、Fedoraサーバーの場合は、aptをdnfに置き換えることができます。

上記に記載されているように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を使用して実行できる基本的なコマンドの一部です。

結論

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

関連記事: