Ubuntu18.04でAnsibleを使用してサーバーの初期設定を自動化する方法
序章
最新のアプリケーション環境は使い捨てであるため、サーバーの自動化はシステム管理において重要な役割を果たしています。 構成管理ツール( Ansible など)は通常、新しいサーバーの標準手順を確立することでサーバーセットアップを自動化するプロセスを合理化すると同時に、手動セットアップに関連する人的エラーを減らします。
Ansibleは、ノードに特別なソフトウェアをインストールする必要のないシンプルなアーキテクチャを提供します。 また、自動化スクリプトの作成を容易にする堅牢な機能セットと組み込みモジュールも提供します。
このガイドでは、Ansibleを使用して、Ubuntu18.04サーバー用の初期サーバーセットアップガイドに含まれる手順を自動化する方法について説明します。
前提条件
このガイドで説明しているプレイブックが提供する自動セットアップを実行するには、次のものが必要です。
- 1つのAnsibleコントロールノード:SSHキーを使用してAnsibleホストに接続するようにAnsibleがインストールおよび構成されたUbuntu18.04マシン。 サーバーの初期設定ガイドで説明されているように、コントロールノードにsudo権限とファイアウォールが有効になっている通常のユーザーがいることを確認してください。 Ansibleをセットアップするには、 Ubuntu18.04にAnsibleをインストールして構成する方法に関するガイドに従ってください。
- 1つ以上のAnsibleホスト:1つ以上のリモートUbuntu18.04サーバー。
先に進む前に、まず、AnsibleコントロールノードがAnsibleホストに接続してコマンドを実行できることを確認する必要があります。 接続テストについては、 Ubuntu18.04にAnsibleをインストールして構成する方法のステップ3を確認してください。
このハンドブックは何をしますか?
このAnsibleプレイブックは、Ubuntu18.04初期サーバーセットアップガイドおよびUbuntu18.04でのSSHキーのセットアップに関するガイドで概説されている手順を手動で実行する代わりの方法を提供します。
このプレイブックを実行すると、Ansibleホストで次のアクションが実行されます。
aptitude
をインストールします。これは、apt
パッケージマネージャーの代わりにAnsibleで推奨されています。- 管理グループwheelsを作成し、 passwordlesssudo用に構成します。
- 新しいsudoユーザーを作成します。
- ローカルSSH公開鍵をコピーし、リモートホストの新しい管理ユーザーの
authorized_keys
ファイルに含めます。 - rootユーザーのパスワードベースの認証を無効にします。
- システムパッケージをインストールします。
- SSH接続のみを許可し、他の要求を拒否するようにUFWファイアウォールを構成します。
プレイブックの実行が終了すると、サーバーへのログインに使用できる新しいユーザーが作成されます。
このハンドブックの使い方
最初に行う必要があるのは、 do-community /ansible-playbooksリポジトリから初期サーバーセットアッププレイブックとその依存関係を取得することです。 このリポジトリをAnsibleコントロールノード内のローカルフォルダーに複製します。
do-community/ansible-playbooks
リポジトリを初めて使用する場合は、次の方法でリポジトリをコントローラノードに複製することから始める必要があります。
- cd ~
- git clone https://github.com/do-community/ansible-playbooks.git
- cd ansible-playbooks
別のガイドに従って以前にこのリポジトリのクローンを作成したことがある場合は、既存のansible-playbooks
コピーにアクセスし、git pull
コマンドを実行して、内容が更新されていることを確認してください。
- cd ~/ansible-playbooks
- git pull
関心のあるファイルは、setup_ubuntu1804
フォルダー内にあります。このフォルダーの構造は次のとおりです。
setup_ubuntu1804
├── playbook.yml
└── vars
└── default.yml
これらの各ファイルは次のとおりです。
vars/default.yml
:プレイブックの設定をカスタマイズするための可変ファイル。playbook.yml
:リモートサーバーで実行されるタスクを含むプレイブックファイル。
プレイブックの変数ファイルを編集して、その値をカスタマイズします。 setup_ubuntu1804
ディレクトリにアクセスし、選択したコマンドラインエディタを使用してvars/default.yml
ファイルを開きます。
- cd setup_ubuntu1804
- nano vars/default.yml
このファイルには、注意が必要ないくつかの変数が含まれています。
---
create_user: sammy
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
sys_packages: [ 'curl', 'vim', 'git', 'ufw']
次のリストには、これらの各変数の簡単な説明と、それらを変更する方法が含まれています。
create_user
:作成されるsudoユーザーの名前。 この例では、sammyを使用します。copy_local_key
:リモートサーバーにコピーして、新しいsudoユーザーのauthorized_key
として追加する必要があるローカルSSH公開鍵ファイルへのパス。 デフォルト値は、 lookup プラグインを使用して、Ansibleコントロールノードの現在のシステムユーザーのデフォルトの公開鍵へのフルパスを取得します。sys_packages
:サーバーの初期設定の一部としてホストにインストールするパッケージのリストを含むアレイ。 この例では、パッケージcurl
、vim
、git
、およびufw
が存在することを確認します。
vars/default.yml
内の変数の更新が完了したら、このファイルを保存して閉じます。 nano
を使用した場合は、CTRL + X
、Y
、ENTER
の順に押してください。
これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されています。 -l
フラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 -u
フラグを使用して、リモートホストでPlaybookコマンドに接続して実行するために使用しているリモートサーバー上のユーザーを指定することもできます。
server1
でのみプレイブックを実行し、root
として接続するには、次のコマンドを使用できます。
- ansible-playbook playbook.yml -l server1 -u root
次のような出力が得られます。
Output
PLAY [all] *****************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************
ok: [server1]
TASK [Install Prerequisites] ***********************************************************************************************************
changed: [server1]
TASK [Make sure we have a 'wheel' group] ***********************************************************************************************
changed: [server1]
TASK [Allow 'wheel' group to have passwordless sudo] ***********************************************************************************
changed: [server1]
TASK [Create a new regular user with sudo privileges] **********************************************************************************
changed: [server1]
TASK [Set authorized key for remote user] **********************************************************************************************
changed: [server1]
TASK [Disable password authentication for root] ****************************************************************************************
changed: [server1]
TASK [Update apt] **********************************************************************************************************************
changed: [server1]
TASK [Install required system packages] ************************************************************************************************
ok: [server1]
TASK [UFW - Allow SSH connections] *****************************************************************************************************
changed: [server1]
TASK [UFW - Deny all other incoming traffic by default] ********************************************************************************
changed: [server1]
PLAY RECAP *****************************************************************************************************************************
server1 : ok=11 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
注:Ansibleプレイブックの実行方法の詳細については、Ansibleチートシートガイドを確認してください。
プレイブックの実行が完了すると、次の方法でサーバーにログインできるようになります。
- ssh sammy@server_host_or_IP
sammyをcreate_user
変数で定義されたユーザーに置き換え、server_host_or_IPをサーバーのホスト名またはIPアドレスに置き換えることを忘れないでください。
copy_local_key
変数を変更してカスタムSSHキー(現在のシステムユーザーのキーではない)を指すようにした場合、SSH経由で接続するときに、対応する秘密キーの場所を指定する追加のパラメーターを指定する必要があります新しいユーザーとして:
- ssh sammy@server_host_or_IP -i ~/.ssh/ansible_controller_key
サーバーにログインした後、UFWファイアウォールのアクティブなルールをチェックして、正しく構成されていることを確認できます。
- sudo ufw status
次のような出力が得られるはずです。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
これは、UFWファイアウォールが正常に有効になったことを意味します。 これがプレイブックの最後のタスクであったため、このサーバーでプレイブックが完全に実行されたことを確認します。
プレイブックの内容
このチュートリアルで紹介されている初期サーバーセットアッププレイブックは、 DigitalOcean CommunityPlaybooks内のansible-playbooksリポジトリにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、各スクリプトの上部にあるRawボタンをクリックします。
プレイブックの全内容とそれに関連するファイルも、便宜上ここに含まれています。
vars / default.yml
default.yml
変数ファイルには、作成されるユーザーの名前やサーバーの初期設定の一部としてインストールする必要のあるパッケージなど、プレイブックタスク内で使用される値が含まれています。
---
create_user: sammy
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
sys_packages: [ 'curl', 'vim', 'git', 'ufw']
playbook.yml
playbook.yml
ファイルは、このセットアップのすべてのタスクが定義されている場所です。 まず、このセットアップのターゲットとなるサーバーのグループ(all
)を定義し、その後、become: true
を使用して、特権昇格(vars/default.yml
変数ファイルが含まれています。
---
- hosts: all
become: true
vars_files:
- vars/default.yml
tasks:
- name: Install Prerequisites
apt: name=aptitude update_cache=yes state=latest force_apt_get=yes
# Sudo Group Setup
- name: Make sure we have a 'wheel' group
group:
name: wheel
state: present
- name: Allow 'wheel' group to have passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
# User + Key Setup
- name: Create a new regular user with sudo privileges
user:
name: "{{ create_user }}"
state: present
groups: wheel
append: true
create_home: true
shell: /bin/bash
- name: Set authorized key for remote user
authorized_key:
user: "{{ create_user }}"
state: present
key: "{{ copy_local_key }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
# Install Packages
- name: Update apt
apt: update_cache=yes
- name: Install required system packages
apt: name={{ sys_packages }} state=latest
# UFW Setup
- name: UFW - Allow SSH connections
ufw:
rule: allow
name: OpenSSH
- name: UFW - Deny all other incoming traffic by default
ufw:
state: enabled
policy: deny
direction: incoming
このプレイブックを自由に変更するか、独自のワークフロー内の個々のニーズに最適な新しいタスクを含めてください。
結論
サーバーの初期設定を自動化することで時間を節約できると同時に、サーバーがニーズに合わせて改善およびカスタマイズできる標準構成に従うようにすることができます。 最新のアプリケーションは分散しているため、さまざまなステージング環境間で一貫性を保つ必要があるため、このような自動化が必要になります。
このガイドでは、Ansibleを使用して、sudoアクセス権を持つ非rootユーザーの作成、UFWの有効化、リモートパスワードベースのrootログインの無効化など、新しいサーバーで実行する必要のある初期タスクを自動化する方法を示しました。
このプレイブックに新しいタスクを含めて、サーバーの初期設定をさらにカスタマイズする場合は、Ansibleの紹介ガイド構成管理101:Ansibleプレイブックの作成を参照してください。 Ansibleロールを使用してインフラストラクチャ環境を抽象化する方法に関するガイドも確認できます。