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ホスト上で以下のアクションが実行されます。
-
- 新しいsudoユーザーを作成し、パスワードなしでsudoをセットアップします。
-
- ローカルのSSH公開鍵をコピーし、リモートホストの新しい管理ユーザーのauthorized_keysファイルに含めます(以前はSSHのパスワードを使用していた場合)。
-
- ルートユーザーのパスワード認証を無効にします。
- システムパッケージをインストールします。
プレイブックの実行が完了すると、サーバーにログインするために使用できる新しいユーザーが作成されます。
最初に、Ansibleコントロールノードサーバーでsudo機能が有効化されたユーザーにログインしてください。
ステップ1:Ansible制御ノードの準備
あなたのAnsibleコントロールノードサーバーに、AnsibleホストリモートサーバーのIPをAnsibleインベントリファイルに追加してください。viまたはお好みのテキストエディタを使用して、Ansibleインベントリファイルを開いてください。
- sudo vi /etc/ansible/hosts
これによって、Ansibleのインベントリファイルが開かれます。AnsibleホストリモートサーバーのIPを[servers]ブロックに追加してください。
「/etc/ansible/hostsファイル」となります。
[servers]
server1 ansible_host=your_remote_server_ip
. . .
ファイルを保存して閉じる。
今、Ansibleの制御ノードとAnsibleホストリモートサーバーの間のSSH接続をテストして認証します。
- ssh root@your_remote_server_ip
認証要求を受け入れ、プロンプトが表示されたらパスワードを入力してください。SSH接続が確認されたら、CTRL+Dキーを押して接続を閉じ、制御ノードに戻ります。
ステップ2 - プレイブックの準備
playbook.ymlファイルは、すべてのタスクが定義されている場所です。タスクは、Ansibleプレイブックを使用して自動化できる最小のアクション単位です。お好みのテキストエディタ(viなど)を使用して、プレイブックファイルを作成してください。
- vi playbook.yml
これで空のYAMLファイルが開かれます。プレイブックにタスクを追加する前に、以下を追加することから始めてください。
---
- hosts: all
become: true
vars:
created_username: sammy
ユーザーネームはお好きなものに変えても構いませんので、どうぞご自由にお選びください。
ほとんどのプレイブックでは、このような宣言から始まります。hostsは、このプレイブックでAnsible制御ノードが対象とするサーバーを宣言します。becomeは、全てのコマンドがエスカレートされたroot特権で実行されるかどうかを示します。
変数を使えばデータを保存することができます。将来において、このユーザー名を変更する決断を下す場合、ファイル内のこの一行を編集するだけで済みます。
Note
第3ステップ – PlaybookにSudoユーザーのセットアップタスクを追加する
デフォルトでは、Ansibleはタスクをトップからボトムの順に同期的に実行します。つまり、タスクの順序は重要であり、次のタスクが開始する前に1つのタスクが実行を終えることが安全に保証されます。
このプレイブックのすべてのタスクは単独で使用でき、他のプレイブックでも再利用できます。
rootユーザーの広範な使用は避けるべきです。sudo特権を持つユーザーの作成を自動化するために、次のように追加することができます。
プレイブック.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
ステップ4 — 自分のプレイブックにSSHキーのセットアップとルートパスワードの無効化のタスクを追加します。
Ansibleは、あなたがSSHキーを使用しているという前提の下で動作します。SSHキーの使用とルートパスワードの認証を無効にすることを強くお勧めし、一般的には良い慣例です。これを自動化するには、以下を追加してください。
- 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を呼び出すか、複数のタスクに分割する代わりに、すべての希望するパッケージをリストアップすることができます。
- name: Update and install required system packages
dnf:
pkg:
- curl
- vim
- git
- firewalld
state: latest
update_cache: true
ご自身の好みに合わせて、パッケージを追加または削除できます。これにより、全てのパッケージが最新バージョンであり、dnfのアップデート後に実行されることが保証されます。
ステップ6 – 完成したプレイブックのレビューを行います。
あなたのプレイブックは、カスタマイズによってわずかな違いがあるかもしれませんが、おおよそ以下のようになるべきです。
---
- 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
プレイブックに満足したら、テキストエディタを終了して保存することができます。
ステップ7- 初めてプレイブックを実行する
このプレイブックを1つ以上のサーバーで実行する準備が整いました。ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように設定されていますが、今回は特定のサーバーを指定します。
サーバー1に接続し、ルートユーザーとしてプレイブックを実行する場合、以下のコマンドを使用できます。
- ansible-playbook playbook.yml -l server1 -u root -k
-lオプションはサーバーを指定します。-uオプションはリモートサーバーにログインするユーザーを指定します。リモートサーバーを設定していないため、rootが唯一の選択肢です。-kオプションはパスワードレスのSSHを使用していない場合に必要であり、SSHパスワードの入力を求めます。
このような出力が得られます。
. . . PLAY RECAP *************************************************************************************************************************************************************************************************************************************************** server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
これは、サーバのセットアップが完了したことを示しています!あなたの出力がまったく同じである必要はありませんが、ゼロの失敗が重要です。
最初のセットアップが完了したので、以降のansible呼び出しはすべてユーザーsammmyで行うことができます(最初にパスワードを使用した場合は、-kフラグを使用しなくても構いません)。
- ansible-playbook playbook.yml -l server1 -u sammy
以下のように日本語で要約されます(1つのオプションのみ):
また、次の情報を使用してサーバーにログインすることもできます。
- ssh sammy@your_remote_server_ip
作成されたユーザー名の変数で定義されたユーザーでsammyを置換することを忘れないでください。また、server_host_or_IPをサーバーのホスト名またはIPアドレスで置き換えてください。
結論
初期サーバーのセットアップの自動化は、時間を節約するだけでなく、サーバーが改善され、カスタマイズされた標準設定に従うことを確実にします。現代のアプリケーションの分散性と、異なるステージング環境間の一貫性の必要性から、このような自動化は必要不可欠となります。
このガイドでは、新しいサーバーで実行すべき初期タスクを自動化するためにAnsibleの使用方法を示しました。例えば、sudoアクセスを持つ非ルートユーザーの作成、パッケージのインストール、リモートパスワードベースのルートログインの無効化などです。
Ansibleプレイブックの実行方法に関する詳細情報は、弊社のAnsibleチートシートガイドをご覧ください。
このプレイブックの初期サーバーセットアップをさらにカスタマイズするために新しいタスクを追加したい場合は、私たちのイントロダクションガイド「Configuration Management 101: Writing Ansible Playbooks」を参照してください。また、インフラ環境を抽象化するためにAnsibleロールを使用する方法についてのガイドもご覧いただけます。