前書き

新しいUbuntu 18.04サーバーを初めて作成するとき、基本的なセットアップの一部として早期に実行する必要があるいくつかの構成手順があります。 これにより、サーバーのセキュリティと使いやすさが向上し、その後のアクションの強固な基盤として機能します。

これらの手順を手動で完了できますが、プロセスを自動化することで時間を節約し、人的エラーを減らすことができます。 コンテナ化されたアプリケーションとマイクロサービスの普及により、サーバー自動化はシステム管理において重要な役割を果たしています。 また、新しいサーバーの標準手順を確立する方法でもあります。

このガイドでは、https://ansible.com [Ansible]を使用して、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04に含まれる手順を自動化する方法について説明します。 [初期サーバー設定ガイド]。 Ansibleは、リモートシステムのプロビジョニングと構成を自動化するために使用できる最新の構成管理ツールです。

飛行前チェック

このガイドで説明しているプレイブックで提供される自動セットアップを実行するには、次のものが必要です。

  • Ansibleは、_Ansible Control Node_として設定したローカルマシンまたはリモートサーバーにインストールされます。 チュートリアルhttps://www.digitalocean.com/community/tutorials/how-to-install-and-configure-ansible-on-ubuntu-18-04のステップ1に従うことができます[UbuntuでAnsibleをインストールおよび構成する方法18.04]この設定を取得します。

  • Ansibleによって管理される1つ以上のUbuntu 18.04サーバーへのルートアクセス。

プレイブックを実行する前に、AnsibleがSSHを介してサーバーに接続できることを確認し、Pythonを使用してhttps://docs.ansible.com/ansible/latest/user_guide/modules.html[Ansible modules]を実行することが重要です。 次の2つのセクションでは、Ansibleインベントリを設定してサーバーを含める方法と、アドホックAnsibleコマンドを実行して接続と有効な資格情報をテストする方法について説明します。

インベントリファイル

_inventoryファイル_には、Ansibleで管理するホストに関する情報が含まれています。 インベントリファイルには1〜数百のサーバーを含めることができ、ホストはグループとサブグループに編成できます。 インベントリファイルは、プレイブックおよびテンプレート内で使用するために、特定のホストおよびグループにのみ有効な変数を設定するためにもよく使用されます。 すぐに表示される `+ ansible_python_interpreter +`変数のように、いくつかの変数もプレイブックの実行方法に影響を与える可能性があります。

デフォルトのAnsibleインベントリの内容を調べるには、ローカルマシンまたはAnsible Control Nodeで、選択したコマンドラインエディターを使用して `+ / etc / ansible / hosts +`ファイルを開きます。

sudo nano /etc/ansible/hosts

Ansibleインストールで提供されるデフォルトのインベントリファイルには、インベントリをセットアップするためのリファレンスとして使用できるいくつかの例が含まれています。 次の例では、* servers という名前のグループに3つの異なるサーバーを定義します。各サーバーは、カスタムエイリアス server1 server2 、および server3 *で識別されます。

/ etc / ansible / hosts

[servers]
server1 ansible_host=
server2 ansible_host=
server3 ansible_host=

[servers:vars]
ansible_python_interpreter=/usr/bin/python3

+ server:vars +`サブグループは、 `+ servers +`グループに含まれるすべてのホストに有効な `+ ansible_python_interpreter +`ホストパラメーターを設定します。 このパラメーターは、リモートサーバーが、最近のUbuntuバージョンには存在しない `+ / usr / bin / python +(Python 2.7)の代わりに、 + / usr / bin / python3 + Python 3実行可能ファイルを使用するようにします。

インベントリファイルのセットアップを完了するには、強調表示されたIPをサーバーのIPアドレスに置き換えます。 完了したら、「+ CTRL + X 」、次に「 y 」を押して変更を確認し、「 ENTER +」を押してファイルを保存して閉じます。

インベントリファイルの準備ができたので、ノードへの接続をテストします

接続性のテスト

インベントリファイルを設定してサーバーを含めたら、Ansibleがこれらのサーバーに接続してSSH経由でコマンドを実行できるかどうかを確認します。 このガイドでは、Ubuntu * root *アカウントを使用します。これは、通常、新しく作成されたサーバーでデフォルトで使用可能な唯一のアカウントであるためです。 このプレイブックは、 `+ sudo +`権限を持つ新しい非ルートユーザーを作成します。これは、リモートサーバーとの以降の対話で使用する必要があります。

ローカルマシンまたはAnsible Control Nodeから、次を実行します。

ansible -m ping all -u root

このコマンドは、組み込みの + ping + Ansible moduleを使用して、デフォルトインベントリのすべてのノードで接続テストを実行し、 ルート。 `+ ping +`モジュールは以下をテストします:+ホストにアクセスできる場合; +有効なSSH認証情報がある場合; +ホストがPythonを使用してAnsibleモジュールを実行できる場合。

キーベースの認証の代わりに_パスワードベースの認証_を使用してリモートサーバーに接続している場合、Ansibleコマンドに追加のパラメーター「+ -k +」を指定して、接続ユーザーのパスワードの入力を求めます。

ansible -m ping all -u root -k

次のような出力が得られるはずです。

Outputserver1 | SUCCESS => {
   "changed": false,
   "ping": "pong"
}
server2 | SUCCESS => {
   "changed": false,
   "ping": "pong"
}
server3 | SUCCESS => {
   "changed": false,
   "ping": "pong"
}

SSH経由でこれらのサーバーに初めて接続する場合は、Ansible経由で接続しているホストの信頼性を確認するよう求められます。 プロンプトが表示されたら、「+ yes」と入力し、「+ Enter」を押して確認します。

ホストから「ピンポン」応答が返ってきたら、そのサーバーでAnsibleコマンドとプレイブックを実行する準備ができていることを意味します。

このPlaybookの機能

このAnsibleプレイブックは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04初期サーバーセットアップガイド]で概説されている手順を手動で実行する代わりに使用できます。およびhttps://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-1804[Ubuntu 18.04でのSSHキーのセットアップ]のガイド。

このプレイブックを実行すると、次のアクションが実行されます。

  1. 管理グループ* wheels *が作成され、_passwordless sudo_用に構成されます。

  2. `+ create_user +`変数で指定された名前を使用して、そのグループ内に新しい管理ユーザーが作成されます。

  3. SSH公開鍵は、変数 `+ copy_local_key `で定義された場所からコピーされ、前の手順で作成されたユーザーの ` authorized_keys +`ファイルに追加されます。

  4. * root *ユーザーのパスワードベースの認証は無効になっています。

  5. ローカルの `+ apt `パッケージインデックスが更新され、変数 ` sys_packages +`で定義された基本パッケージがインストールされます。

  6. UFWファイアウォールは、SSH接続のみを許可し、他の要求を拒否するように構成されています。

このプレイブックに含まれる各ステップの詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04 [Ubuntu 18.04サーバーの初期セットアップを参照してください。ガイド]。

プレイブックの実行が完了すると、新しく作成された「+ sudo +」アカウントを使用してサーバーにログインできるようになります。

このプレイブックの使用方法

まず、https://github.com/do-community/ansible-playbooks/blob/master/initial_server_setup/ubuntu1804.yml [playbook]のコンテンツをAnsible Control Nodeにダウンロードします。 これは、ローカルマシン、またはAnsibleをインストールしてインベントリをセットアップしたリモートサーバーのいずれかです。

コマンドラインからこのプレイブックをダウンロードするには、 `+ curl +`を使用できます:

curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/initial_server_setup/ubuntu1804.yml -o initial_server_setup.yml

これにより、プレイブックのコンテンツが現在のローカルパス上の `+ initial_server_setup.yml +`という名前のファイルにダウンロードされます。 選択したコマンドラインエディタでファイルを開くと、プレイブックの内容を調べることができます。

nano initial_server_setup.yml

プレイブックファイルを開くと、注意が必要な3つの異なる変数を持つ* vars *という名前のセクションが表示されます。

  • * create_user :sudo特権を作成して付与する非rootユーザーアカウントの名前。 この例では*を使用していますが、任意のユーザー名を使用できます。

  • * copy_local_key *:新しい非ルート `+ sudo `アカウントの認証キーとして設定する有効なSSH公開キーへのローカルパス。 デフォルト値は、 `〜/ .ssh / id_rsa.pub +`にある現在のローカルユーザーの公開キーを指します。

  • * sys_packages *:パッケージマネージャーツール `+ apt +`を使用してインストールされる基本的なシステムパッケージのリスト。

`+ initial_server_setup.yml +`内の変数の更新が完了したら、ファイルを保存して閉じます。

これで、1つ以上のサーバーでこのプレイブックを実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリから「+ all 」サーバーで実行されるように設定されています。 ` -l `フラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 「 server1 +」でのみプレイブックを実行するには、次のコマンドを使用できます。

ansible-playbook initial_server_setup.yml

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

Output
PLAY [all] ***************************************************************************************************************************************

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=9    changed=8    unreachable=0    failed=0

プレイブックの実行が終了すると、次の方法でサーバーにログインできるようになります。

ssh @

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

`+ copy_local_key +`変数でカスタム公開キーを設定した場合、対応する秘密キーの場所を指定する追加のパラメーターを提供する必要があります。

ssh @ -i

サーバーにログインした後、UFWファイアウォールのアクティブなルールをチェックして、適切に構成されていることを確認できます。

sudo ufw status

次のような出力が得られるはずです。

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

これは、UFWファイアウォールが正常に有効化されたことを意味します。 これがプレイブックの最後のタスクであるため、プレイブックがこのサーバーで完全に実行されたことを確認します。

プレイブックの内容

初期サーバーセットアッププレイブックは、DigitalOcean https:// githubのhttps://github.com/do-community/ansible-playbooks/blob/master/initial_server_setup/ubuntu1804.yml[ansible-playbooks repository]にあります。 com / do-community [コミュニティGitHub組織]。 スクリプトの内容を直接コピーまたはダウンロードするには、スクリプトの上部にある* Raw *ボタンをクリックするか、https://raw.githubusercontent.com/do-community/ansible-playbooks/master/initial_server_setup/ubuntu1804.yml [click生のコンテンツを直接表示するにはこちら]。

便宜上、完全な内容もここに含まれています。

initial_server_setup.yml

---
- hosts: all
 remote_user: root
 gather_facts: false
 vars:
   create_user:
   copy_local_key: ""
   sys_packages: [  ]

 tasks:
   - 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'

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

   - name: Update apt
     apt: update_cache=yes

   - name: Install required system packages
     apt: name={{ sys_packages }} state=latest

   - 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アクセスを持つ非ルートユーザーの作成、UFWの有効化、リモートルートログインの無効化など、新しいサーバーで実行する必要のある初期タスクを自動化する方法を示しました。

このプレイブックに新しいタスクを追加して、サーバーの初期セットアップをさらにカスタマイズする場合は、Ansibleの入門ガイドhttps://www.digitalocean.com/community/tutorials/configuration-management-101-writing-ansibleを参照してください-playbooks [構成管理101:Ansible Playbookの作成]。