Ubuntu20.04でAnsibleを使用してサーバーの初期設定を自動化する方法
序章
最新のアプリケーション環境は使い捨てであるため、サーバーの自動化はシステム管理において重要な役割を果たしています。 構成管理ツール( Ansible など)は通常、新しいサーバーの標準手順を確立することでサーバーセットアップを自動化するプロセスを合理化すると同時に、手動セットアップに関連する人的エラーを削減するために使用されます。
Ansibleは、ノードに特別なソフトウェアをインストールする必要のないシンプルなアーキテクチャを提供します。 また、自動化スクリプトの作成を容易にする堅牢な機能セットと組み込みモジュールも提供します。
このガイドでは、Ansibleを使用して、Ubuntu20.04サーバー用の初期サーバーセットアップガイドに含まれる手順を自動化する方法について説明します。
前提条件
このガイドのプレイブックで提供されている自動セットアップを実行するには、次のものが必要です。
- 1つのAnsibleコントロールノード:SSHキーを使用してAnsibleホストに接続するようにAnsibleがインストールおよび構成されたUbuntu20.04マシン。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu20.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
- Ubuntu 20.04のクリーンインストールを備えた1つのリモートサーバー:このサーバーでは事前のセットアップは必要ありませんが、上記のAnsibleコントロールノードからこのサーバーへのSSHアクセスが必要です。 このサーバーはAnsibleホストリモートサーバーになり、Ansibleコントロールノードによる自動プロビジョニングの対象になります。
このハンドブックは何をしますか?
このAnsibleプレイブックは、Ubuntu20.04初期サーバーセットアップガイドおよびUbuntu20.04でのSSHキーのセットアップに関するガイドで概説されている手順を手動で実行する代わりの方法を提供します。サーバ。 プレイブックを一度設定すると、その後はすべてのサーバーで使用できます。
このプレイブックを実行すると、Ansibleホストで次のアクションが実行されます。
-
インストール
aptitude
、Ansibleが代替として好むapt
パッケージマネージャー。 -
新しいsudoユーザーを作成し、パスワードなしで設定します
sudo
. -
ローカルSSH公開鍵をコピーして、
authorized_keys
リモートホスト上の新しい管理ユーザーのファイル。 -
rootユーザーのパスワードベースの認証を無効にします。
-
システムパッケージをインストールします。
-
SSH接続のみを許可し、他の要求を拒否するようにUFWファイアウォールを構成します。
プレイブックの実行が終了すると、サーバーへのログインに使用できる新しいユーザーが作成されます。
開始するには、ログインします sudo
Ansibleコントロールノードサーバーで有効になっているユーザー。
ステップ1—Ansibleコントロールノードを準備する
Ansibleコントロールノードサーバーで、AnsibleホストリモートサーバーのIPをAnsibleインベントリファイルに追加します。 お好みのテキストエディタを使用する:
- sudo nano /etc/ansible/hosts
これにより、Ansibleインベントリファイルが開きます。 AnsibleホストのリモートサーバーのIPをに追加します [servers]
ブロック:
[servers]
server1 ansible_host=your_remote_server_ip
. . .
次に、このAnsibleコントロールノードとAnsibleホストリモートサーバー間のSSH接続をテストして認証します。
- ssh root@your_remote_server_ip
認証要求を受け入れ、プロンプトが表示されたらパスワードを入力します。 SSH接続を確認したら、 CTRL+D
接続を閉じて、制御ノードに戻ります。
ステップ2—プレイブックの準備
The playbook.yml
ファイルは、すべてのタスクが定義されている場所です。 タスクは、Ansibleプレイブックを使用して自動化できるアクションの最小単位です。 ただし、最初に、好みのテキストエディタを使用してプレイブックファイルを作成します。
- nano playbook.yml
これにより、空のYAMLファイルが開きます。 プレイブックにタスクを追加する前に、以下を追加することから始めます。
---
- hosts: all
become: true
vars:
created_username: sammy
ユーザー名を任意のユーザー名に自由に置き換えてください。
あなたが出くわすほとんどすべてのプレイブックは、これに似た宣言で始まります。 hosts
Ansibleコントロールノードがこのプレイブックでターゲットとするサーバーを宣言します。 become
すべてのコマンドがエスカレートされたroot特権で実行されるかどうかを示します。
vars
データを変数に格納できます。 将来このユーザー名を変更する場合は、ファイル内のこの1行を編集するだけで済みます。
注:プレイブックファイルを最終的な完成状態で表示する場合は、ステップ8にジャンプします。 YAMLファイルはインデント構造に特化している可能性があるため、すべてのタスクを追加したら、プレイブックを再確認することをお勧めします。
ステップ3—PlaybookにAptitudeインストールタスクを追加する
デフォルトでは、タスクはプレイブックの上から下に順番にAnsibleによって同期的に実行されます。 これは、タスクの順序が重要であることを意味し、次のタスクが開始する前に1つのタスクの実行が終了すると安全に想定できます。
このプレイブックのすべてのタスクはスタンドアロンで、他のプレイブックで再利用できます。
インストールの最初のタスクを追加します aptitude
、Linuxパッケージマネージャーとインターフェイスするためのツール:
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
ここでは、 apt
Ansibleにインストールするように指示するAnsible組み込みモジュール aptitude
. Ansibleのモジュールは、生のbashコマンドとして実行する必要がある操作を実行するためのショートカットです。 Ansibleは安全にフォールバックします apt
パッケージをインストールする場合 aptitude
利用できません。 したがって、このステップは技術的にはオプションですが、Ansibleは歴史的に好まれてきました aptitude
.
ステップ4—PlaybookにSudoユーザーセットアップタスクを追加する
rootユーザーの広範な使用を避けることをお勧めします。 付与されたユーザーの作成を自動化できます sudo
追加による特権:
- 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: sudo
append: true
create_home: true
使用している lineinfile
ファイル内の特定の行をターゲットにして置き換えるためのAnsibleモジュール。 この場合、正規表現を使用して、 sudoers
ファイルを変更して、パスワードなしで使用できるようにします sudo
. あなたも使用します visudo
変更を検証して、何かが壊れないようにします。
これを利用するために、あなたは新しいユーザーを追加しています user
モジュール。 Ansibleは、このユーザーがまだ存在していない場合は作成され、ユーザーがに属していることを確認します sudo
グループは他のグループから削除されていない状態で、ホームディレクトリが作成されます。
注:変数を示す中括弧の前後に引用符を含めるようにしてください。 これらの引用符の省略は、非常に一般的なAnsible構文エラーです。
ステップ5—SSHキーセットアップの追加とルートパスワードタスクの無効化をPlaybookに追加する
Ansibleは、SSHキーを使用していることを前提に動作します。 SSHキーの使用とrootパスワード認証の無効化を組み合わせることが強く推奨されます。 これを自動化するには、次を追加します。
- 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'
The authorized_key
ユーザー名とキーの場所を指定すると、モジュールを使用できます。 ここでは、キーへのパスはAnsibleを使用して構築されています lookup
関数。
The lineinfile
モジュールは、の行を検索して置換するために使用されます sshd_config
root のパスワード認証を無効にするために、セキュリティを強化するためにその特権へのアクセスを制限します。
ステップ6—Playbookへのパッケージインストールタスクの追加
Ansibleは、特定のパッケージが常にサーバーにインストールされていることを確認できます。 電話するのではなく apt install
個々のパッケージごとに、または複数のタスクに分割して、必要なすべてのパッケージを一覧表示できます。
- name: Update apt and install required system packages
apt:
pkg:
- curl
- vim
- git
- ufw
state: latest
update_cache: true
好みに応じてパッケージを追加または削除できます。 これにより、すべてのパッケージが存在するだけでなく、最新バージョンであり、更新後に実行されます。 apt
と呼ばれます。
ステップ7—ファイアウォールセットアップタスクをプレイブックに追加する
インターネットに面しているサーバーにはファイアウォールが不可欠です。 次を追加することで、AnsibleにUFW(Uncomplicated Firewall)が適切に構成されていることを確認できます。
- name: UFW - Allow SSH connections
community.general.ufw:
rule: allow
name: OpenSSH
- name: UFW - Enable and deny by default
community.general.ufw:
state: enabled
default: deny
The ufw
モジュールは最初にSSHアクセスが許可されていることを確認します。 次に、このモジュールは、サーバーへの他のすべてのトラフィックをデフォルトで拒否しながら、ファイアウォールを有効にします。
ステップ8—完全なプレイブックを確認する
プレイブックはおおよそ次のようになりますが、カスタマイズによって若干の違いがあります。
---
- hosts: all
become: true
vars:
created_username: sammy
tasks:
- name: Install aptitude
apt:
name: aptitude
state: latest
update_cache: true
- 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: sudo
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 apt and install required system packages
apt:
pkg:
- curl
- vim
- git
- ufw
state: latest
update_cache: true
- name: UFW - Allow SSH connections
community.general.ufw:
rule: allow
name: OpenSSH
- name: UFW - Enable and deny by default
community.general.ufw:
state: enabled
default: deny
注:これは、くぼみに注意するための穏やかなリマインダーです。 エラーが発生した場合は、これが原因である可能性が非常に高くなります。 YAMLは、この例で行われたように、インデントとして2つのスペースを使用することを提案します。
プレイブックに満足したら、テキストエディタを終了して保存できます。
ステップ9—Playbookを初めて実行する
これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されていますが、今回はサーバーを指定します。
プレイブックを実行するには server1
、として接続 root
、次のコマンドを使用できます。
- ansible-playbook playbook.yml -l server1 -u root -k
The -l
フラグはサーバーと -u
flagは、リモートサーバーにログインするユーザーを指定します。 リモートサーバーをまだセットアップしていないため、rootが唯一のオプションです。 The -k
フラグを使用するとSSHパスワードを入力できるため、最初のプレイブックの実行時にフラグが非常に重要になります。
次のような出力が得られます。
Output
. . .
TASK [UFW - Allow SSH connections] ***************************************************************************************************************************************************************************************************************************
changed: [server1]
TASK [UFW - Enable and deny by default] **********************************************************************************************************************************************************************************************************************
changed: [server1]
PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
server1 : ok=9 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
これは、サーバーのセットアップが完了したことを示しています。 出力は完全に同じである必要はありませんが、障害がゼロであることが重要です。
プレイブックの最初のセットアップが完了したので、その後のすべてのansible呼び出しはユーザーで行うことができます sammy
となしで -k
国旗:
- ansible-playbook playbook.yml -l server1 -u sammy
次の方法でサーバーにログインすることもできます。
- ssh sammy@your_remote_server_ip
sammyをによって定義されたユーザーに置き換えることを忘れないでください created_username
変数、およびserver_host_or_IPとサーバーのホスト名またはIPアドレス。
サーバーにログインした後、UFWファイアウォールのアクティブなルールをチェックして、正しく構成されていることを確認できます。
- sudo ufw status
次のような出力が得られるはずです。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
これは、UFWファイアウォールが正常に有効になったことを意味します。 これがプレイブックの最後のタスクであったため、このサーバーでプレイブックが完全に実行されたことを確認します。
結論
サーバーの初期設定を自動化すると、時間を節約できると同時に、サーバーがニーズに合わせて改善およびカスタマイズできる標準構成に従うようになります。 最新のアプリケーションは分散しているため、さまざまなステージング環境間で一貫性を保つ必要があるため、このような自動化が必要になります。
このガイドでは、Ansibleを使用して、 root 以外のユーザーを作成するなど、新しいサーバーで実行する必要のある初期タスクを自動化する方法を示しました。 sudo
アクセス、UFWの有効化、リモートパスワードベースのrootログインの無効化。
Ansibleプレイブックの実行方法の詳細については、Ansibleチートシートガイドをご覧ください。
このプレイブックに新しいタスクを含めて、サーバーの初期設定をさらにカスタマイズする場合は、Ansibleの紹介ガイド構成管理101:Ansibleプレイブックの作成を参照してください。 Ansibleロールを使用してインフラストラクチャ環境を抽象化する方法に関するガイドも確認できます。