Rocky Linux 9の初期サーバーセットアップを自動化するためのAnsibleの使い方を教えてください。

はじめに

現代のアプリケーション環境の使い捨て性により、サーバーの自動化はシステム管理において重要な役割を果たしています。Ansibleなどの設定管理ツールを使用して、新しいサーバーの標準手順を確立することで、サーバーのセットアップを自動化するプロセスを効率化し、手動セットアップによる人為的なエラーを減らすことが一般的です。

Ansibleは、ノードに特別なソフトウェアのインストールを必要としないシンプルなアーキテクチャを提供します。また、自動化スクリプトの作成を容易にする頼もしい機能と組み込みモジュールのセットも備えています。

このガイドは、Ansibleを使用して、Rocky Linux 9サーバーの初期サーバーセットアップガイドに含まれる手順を自動化する方法を説明しています。

前提条件

このチュートリアルに従うためには、以下のものが必要です。

  • One Ansible control node: a Rocky Linux 9 machine with Ansible installed and configured to connect to your Ansible hosts using SSH keys. Make sure the control node has a regular user with sudo permissions and a firewall enabled, as explained in our Initial Server Setup guide. To set up Ansible, see Step 1 of our guide on How to Install and Configure Ansible on Rocky Linux 9. You don’t normally need to install from the exact same Linux version onto the same target version (for example, from Rocky Linux 9 to Rocky Linux 9 in this case), but it keeps everything consistent for demonstration purposes.
  • One remote server with a clean install of Rocky Linux 9: no prior setup is required on this server, but you must have SSH access to this server from the Ansible control node mentioned above. If you do not already have SSH access to the remote server from the Ansible control node, refer to our tutorial on How to Set Up SSH Keys. This server will become an Ansible host remote server, which is targeted for automated provisioning by the Ansible control node.

このプレイブックは何をするのですか? (Kono pureibukku wa nani wo suru no desu ka?)

このAnsibleのプレイブックは、Rocky Linux 9の初期サーバーセットアップガイドとRocky Linux 9のSSHキーのセットアップガイドで手順を手動で行う代わりの方法を提供します。サーバーを起動するたびに、手動で設定する代わりに、プレイブックを一度設定し、それを毎回のサーバーに使用できます。

このプレイブックを実行すると、Ansibleホスト上で以下のアクションが実行されます。

    1. 新しいsudoユーザーを作成し、パスワードなしでsudoをセットアップします。

 

    1. ローカルのSSH公開鍵をコピーし、リモートホストの新しい管理ユーザーのauthorized_keysファイルに含めます(以前はSSHのパスワードを使用していた場合)。

 

    1. ルートユーザーのパスワード認証を無効にします。

 

    システムパッケージをインストールします。

プレイブックの実行が完了すると、サーバーにログインするために使用できる新しいユーザーが作成されます。

最初に、Ansibleコントロールノードサーバーでsudo機能が有効化されたユーザーにログインしてください。

ステップ1:Ansible制御ノードの準備

あなたのAnsibleコントロールノードサーバーに、AnsibleホストリモートサーバーのIPをAnsibleインベントリファイルに追加してください。viまたはお好みのテキストエディタを使用して、Ansibleインベントリファイルを開いてください。

  1. sudo vi /etc/ansible/hosts

 

これによって、Ansibleのインベントリファイルが開かれます。AnsibleホストリモートサーバーのIPを[servers]ブロックに追加してください。

/etc/ansible/hostsを日本語で言い換えると、
「/etc/ansible/hostsファイル」となります。
[servers]
server1 ansible_host=your_remote_server_ip

. . .

ファイルを保存して閉じる。

今、Ansibleの制御ノードとAnsibleホストリモートサーバーの間のSSH接続をテストして認証します。

  1. ssh root@your_remote_server_ip

 

認証要求を受け入れ、プロンプトが表示されたらパスワードを入力してください。SSH接続が確認されたら、CTRL+Dキーを押して接続を閉じ、制御ノードに戻ります。

ステップ2 - プレイブックの準備

playbook.ymlファイルは、すべてのタスクが定義されている場所です。タスクは、Ansibleプレイブックを使用して自動化できる最小のアクション単位です。お好みのテキストエディタ(viなど)を使用して、プレイブックファイルを作成してください。

  1. vi playbook.yml

 

これで空のYAMLファイルが開かれます。プレイブックにタスクを追加する前に、以下を追加することから始めてください。

プレイブック.yml
---
- hosts: all
  become: true
  vars:
    created_username: sammy

ユーザーネームはお好きなものに変えても構いませんので、どうぞご自由にお選びください。

ほとんどのプレイブックでは、このような宣言から始まります。hostsは、このプレイブックでAnsible制御ノードが対象とするサーバーを宣言します。becomeは、全てのコマンドがエスカレートされたroot特権で実行されるかどうかを示します。

変数を使えばデータを保存することができます。将来において、このユーザー名を変更する決断を下す場合、ファイル内のこの一行を編集するだけで済みます。

Note

注意:もしプレイブックファイルを最終的な完成形で見たい場合は、ステップ6に進んでください。YAMLファイルはインデント構造に特定の要求があるため、全てのタスクを追加した後にプレイブックを再確認することをお勧めします。

第3ステップ – PlaybookにSudoユーザーのセットアップタスクを追加する

デフォルトでは、Ansibleはタスクをトップからボトムの順に同期的に実行します。つまり、タスクの順序は重要であり、次のタスクが開始する前に1つのタスクが実行を終えることが安全に保証されます。

このプレイブックのすべてのタスクは単独で使用でき、他のプレイブックでも再利用できます。

rootユーザーの広範な使用は避けるべきです。sudo特権を持つユーザーの作成を自動化するために、次のように追加することができます。

以下の「playbook.yml」を日本語で言い換えてください(1つのオプションのみ必要です):
プレイブック.yml
  tasks:
    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s' 

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: wheel
        append: true
        create_home: true

sudoersファイル内の特定の行をターゲットとして置換するために、lineinfile Ansibleモジュールを使用しています。この場合、sudoersファイル内の特定の行を正規表現でターゲットにし、それを変更してsudoのパスワードなしで使用できるようにしています。また、変更内容を検証し、何も壊れないようにするためにvisudoも使用しています。

これを活用するために、ユーザーモジュールを使用して新たなユーザーを追加します。Ansibleは、もしユーザーが存在しなければ作成し、ユーザーをwheel(admin)グループに所属させ、他のグループから削除しないようにします。また、ホームディレクトリも作成されます。

Note

注意:変数を示す波括弧「{}」の周りに引用符を含めることを確認してください。これらの引用符の省略は、Ansibleの構文エラーに非常によく見られます。

ステップ4 — 自分のプレイブックにSSHキーのセットアップとルートパスワードの無効化のタスクを追加します。

Ansibleは、あなたがSSHキーを使用しているという前提の下で動作します。SSHキーの使用とルートパスワードの認証を無効にすることを強くお勧めし、一般的には良い慣例です。これを自動化するには、以下を追加してください。

プレイブック.yml
    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

「authorized_key」モジュールは、ユーザー名とキーの場所を指定することで使用することができます。ここでは、キーへのパスはAnsibleのルックアップ関数を使用して構築されます。

sshd_config内の行を検索し、置き換えるためにlineinfileモジュールが使用されます。これにより、ルートユーザーのパスワード認証が無効化され、その権限へのアクセスが制限され、セキュリティが向上します。

ステップ5- プレイブックにパッケージインストールタスクを追加する

Ansibleは、サーバー上で必ずインストールされている特定のパッケージを確保することができます。各個別のパッケージに対してdnf installを呼び出すか、複数のタスクに分割する代わりに、すべての希望するパッケージをリストアップすることができます。

プレイブック.yml
    - name: Update and install required system packages
      dnf:
        pkg:
          - curl
          - vim
          - git
          - firewalld
        state: latest
        update_cache: true

ご自身の好みに合わせて、パッケージを追加または削除できます。これにより、全てのパッケージが最新バージョンであり、dnfのアップデート後に実行されることが保証されます。

ステップ6 – 完成したプレイブックのレビューを行います。

あなたのプレイブックは、カスタマイズによってわずかな違いがあるかもしれませんが、おおよそ以下のようになるべきです。

プレイブック.yml
---
- hosts: all
  become: true
  vars:
    created_username: sammy

  tasks:
    - name: Setup passwordless sudo
      lineinfile:
        path: /etc/sudoers
        state: present
        regexp: '^%sudo'
        line: '%sudo ALL=(ALL) NOPASSWD: ALL'
        validate: '/usr/sbin/visudo -cf %s'

    - name: Create a new regular user with sudo privileges
      user:
        name: "{{ created_username }}"
        state: present
        groups: wheel
        append: true
        create_home: true

    - name: Set authorized key for remote user
      ansible.posix.authorized_key:
        user: "{{ created_username }}"
        state: present
        key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

    - name: Disable password authentication for root
      lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'

    - name: Update and install required system packages
      dnf:
        pkg:
          - curl
          - vim
          - git
          - firewalld
        state: latest
        update_cache: true

Note

注意:正しくインデントを注意してくださいという優しいリマインダーです。エラーが発生した場合、おそらくそれが原因です。YAMLでは、この例のように2つのスペースをインデントに使用することが推奨されています。

プレイブックに満足したら、テキストエディタを終了して保存することができます。

ステップ7- 初めてプレイブックを実行する

このプレイブックを1つ以上のサーバーで実行する準備が整いました。ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように設定されていますが、今回は特定のサーバーを指定します。

サーバー1に接続し、ルートユーザーとしてプレイブックを実行する場合、以下のコマンドを使用できます。

  1. ansible-playbook playbook.yml -l server1 -u root -k

 

-lオプションはサーバーを指定します。-uオプションはリモートサーバーにログインするユーザーを指定します。リモートサーバーを設定していないため、rootが唯一の選択肢です。-kオプションはパスワードレスのSSHを使用していない場合に必要であり、SSHパスワードの入力を求めます。

このような出力が得られます。

Output

. . . PLAY RECAP *************************************************************************************************************************************************************************************************************************************************** server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

これは、サーバのセットアップが完了したことを示しています!あなたの出力がまったく同じである必要はありませんが、ゼロの失敗が重要です。

最初のセットアップが完了したので、以降のansible呼び出しはすべてユーザーsammmyで行うことができます(最初にパスワードを使用した場合は、-kフラグを使用しなくても構いません)。

  1. ansible-playbook playbook.yml -l server1 -u sammy

 

以下のように日本語で要約されます(1つのオプションのみ):
また、次の情報を使用してサーバーにログインすることもできます。

  1. ssh sammy@your_remote_server_ip

 

作成されたユーザー名の変数で定義されたユーザーでsammyを置換することを忘れないでください。また、server_host_or_IPをサーバーのホスト名またはIPアドレスで置き換えてください。

結論

初期サーバーのセットアップの自動化は、時間を節約するだけでなく、サーバーが改善され、カスタマイズされた標準設定に従うことを確実にします。現代のアプリケーションの分散性と、異なるステージング環境間の一貫性の必要性から、このような自動化は必要不可欠となります。

このガイドでは、新しいサーバーで実行すべき初期タスクを自動化するためにAnsibleの使用方法を示しました。例えば、sudoアクセスを持つ非ルートユーザーの作成、パッケージのインストール、リモートパスワードベースのルートログインの無効化などです。

Ansibleプレイブックの実行方法に関する詳細情報は、弊社のAnsibleチートシートガイドをご覧ください。

このプレイブックの初期サーバーセットアップをさらにカスタマイズするために新しいタスクを追加したい場合は、私たちのイントロダクションガイド「Configuration Management 101: Writing Ansible Playbooks」を参照してください。また、インフラ環境を抽象化するためにAnsibleロールを使用する方法についてのガイドもご覧いただけます。

コメントを残す 0

Your email address will not be published. Required fields are marked *


广告
広告は10秒後に閉じます。
bannerAds