ウェブサイト検索

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


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

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

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

前提条件

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

ステップ1 - 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

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

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: {}

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

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

[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 root@203.0.113.111
ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@203.0.113.112
ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@203.0.113.113

それで全部です。これで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 ansible@203.0.113.111

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

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

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

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 <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 コマンドを実行するよう指示します。

上記に記載されているように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 ディレクティブは、次のタスクがスーパーユーザーによって実行される必要があることを示すために使用されます。

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

ansible.builtin.user モジュールは、sudo 権限を持つ新しいユーザーを追加するために使用されます。ユーザーを追加するために、name、password、および group 変数を使用しています。group 変数は、ユーザーにスーパーユーザー権限を与えるために sudo に設定されています。プレイブックファイルに平文のパスワードを記載することはできないため、SHA ハッシュされた秘密を追加します。それを実現するために mkpasswd ユーティリティを使用します。インストールするには、次のコマンドを実行して 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にシステムのアップグレードを実行するよう指示します。三番目のタスクは明白で、最新の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 フラグは、特権操作を実行するためにルートパスワードを要求します。

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をインストールし設定するチュートリアルは終了です。質問がある場合は、下のコメントに投稿してください。

関連記事: