序章

最新のアプリケーション環境は使い捨てであるため、サーバーの自動化はシステム管理において重要な役割を果たしています。 構成管理ツール( 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ホストで次のアクションが実行されます。

  1. aptitudeをインストールします。これは、aptパッケージマネージャーの代わりにAnsibleで推奨されています。
  2. 管理グループwheelsを作成し、 passwordlesssudo用に構成します。
  3. 新しいsudoユーザーを作成します。
  4. ローカルSSH公開鍵をコピーし、リモートホストの新しい管理ユーザーのauthorized_keysファイルに含めます。
  5. rootユーザーのパスワードベースの認証を無効にします。
  6. システムパッケージをインストールします。
  7. SSH接続のみを許可し、他の要求を拒否するようにUFWファイアウォールを構成します。

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

このハンドブックの使い方

最初に行う必要があるのは、 do-community /ansible-playbooksリポジトリから初期サーバーセットアッププレイブックとその依存関係を取得することです。 このリポジトリをAnsibleコントロールノード内のローカルフォルダーに複製します。

do-community/ansible-playbooksリポジトリを初めて使用する場合は、次の方法でリポジトリをコントローラノードに複製することから始める必要があります。

  1. cd ~
  2. git clone https://github.com/do-community/ansible-playbooks.git
  3. cd ansible-playbooks

別のガイドに従って以前にこのリポジトリのクローンを作成したことがある場合は、既存のansible-playbooksコピーにアクセスし、git pullコマンドを実行して、内容が更新されていることを確認してください。

  1. cd ~/ansible-playbooks
  2. git pull

関心のあるファイルは、setup_ubuntu1804フォルダー内にあります。このフォルダーの構造は次のとおりです。

setup_ubuntu1804
├── playbook.yml
└── vars
    └── default.yml

これらの各ファイルは次のとおりです。

  • vars/default.yml:プレイブックの設定をカスタマイズするための可変ファイル。
  • playbook.yml:リモートサーバーで実行されるタスクを含むプレイブックファイル。

プレイブックの変数ファイルを編集して、その値をカスタマイズします。 setup_ubuntu1804ディレクトリにアクセスし、選択したコマンドラインエディタを使用してvars/default.ymlファイルを開きます。

  1. cd setup_ubuntu1804
  2. nano vars/default.yml

このファイルには、注意が必要ないくつかの変数が含まれています。

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:サーバーの初期設定の一部としてホストにインストールするパッケージのリストを含むアレイ。 この例では、パッケージcurlvimgit、およびufwが存在することを確認します。

vars/default.yml内の変数の更新が完了したら、このファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERの順に押してください。

これで、このプレイブックを1つ以上のサーバーで実行する準備が整いました。 ほとんどのプレイブックは、デフォルトでインベントリ内のすべてのサーバーで実行されるように構成されています。 -lフラグを使用して、サーバーのサブセットまたは単一のサーバーのみがプレイブックの影響を受けるようにすることができます。 -uフラグを使用して、リモートホストでPlaybookコマンドに接続して実行するために使用しているリモートサーバー上のユーザーを指定することもできます。

server1でのみプレイブックを実行し、rootとして接続するには、次のコマンドを使用できます。

  1. 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チートシートガイドを確認してください。

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

  1. ssh sammy@server_host_or_IP

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

copy_local_key変数を変更してカスタムSSHキー(現在のシステムユーザーのキーではない)を指すようにした場合、SSH経由で接続するときに、対応する秘密キーの場所を指定する追加のパラメーターを指定する必要があります新しいユーザーとして:

  1. ssh sammy@server_host_or_IP -i ~/.ssh/ansible_controller_key

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

  1. sudo ufw status

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

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

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

プレイブックの内容

このチュートリアルで紹介されている初期サーバーセットアッププレイブックは、 DigitalOcean CommunityPlaybooks内のansible-playbooksリポジトリにあります。 スクリプトの内容を直接コピーまたはダウンロードするには、各スクリプトの上部にあるRawボタンをクリックします。

プレイブックの全内容とそれに関連するファイルも、便宜上ここに含まれています。

vars / default.yml

default.yml変数ファイルには、作成されるユーザーの名前やサーバーの初期設定の一部としてインストールする必要のあるパッケージなど、プレイブックタスク内で使用される値が含まれています。

vars / 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を使用して、特権昇格( [ X197X])デフォルトで。 次に、構成オプションをロードするためのvars/default.yml変数ファイルが含まれています。

playbook.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ロールを使用してインフラストラクチャ環境を抽象化する方法に関するガイドも確認できます。