はじめに
今日、サーバーは非常に頻繁に作成および破棄される必要があります。これは、サーバーに大量の実行負荷がかかることもあれば、負荷が減少してシステムリソースが無駄になることもあるためです。一般的な例としては、ホリデーシーズン中に大量のトラフィックを集めるEコマースサイトが挙げられます。アプリケーションの性質上、スケーラビリティが求められる場合、サーバー作成のプロセス全体を容易にするための構成管理ツールが常に必要となります。Ansibleは、標準的な手順を使用してサーバー作成を自動化し、人的ミスを削減する優れた構成管理ツールです。
Ansibleは、サーバーのノードに特別なソフトウェアをインストールする必要はありません。スクリプトの作成、ビルド、および自動化を容易にするために必要なすべてのツールを備えています。このチュートリアルは、当社のUbuntuサーバーのセットアップ方法チュートリアルに含まれる手順を、Ansibleを使用して自動化する方法について詳しく説明します。.
前提条件
このガイドを完了するには、Ubuntu 20.04を使用します。さらに、以下も必要になります。
-
Ansibleコントロールノード: 最新のUbuntuバージョンを実行しているUbuntuマシン。このマシンにAnsibleのマスターバイナリがインストールされ、実行されている必要があります。このマシンはAnsibleノードに接続できる必要があります。これらの接続には、SSHキーを使用する必要があります。接続時の問題を避けるため、Ansibleコントロールノードでファイアウォールが有効になっていることを確認してください。サポートが必要な場合は、当社のUbuntu 20.04でのAnsibleのインストールと設定ブログを参照してください。
-
Ansibleホスト: 接続先となる1つ以上のホストが必要です。ホストは基本的にAnsibleにおける管理対象ノードです。これらはUbuntuサーバーである必要があります。
Ansible Playbookの機能
以下に記載されているすべての手順を手動でセットアップすることもできます。しかし、ここではこの実行を自動化します。このPlaybookを実行すると、マシン上で以下の操作が実行されます。
-
以下をインストールします。 aptitude(Ansibleがパッケージマネージャーとして推奨するもの)。
-
管理グループであるwheelをパスワードなしのsudo権限で作成します。
-
新しいsudoユーザーを作成します。
-
ローカルのSSHキーを authorized_keysにコピーします。これは、リモートホスト上の新しい管理ユーザーに使用されます。
-
rootユーザーのパスワードベースの認証を無効にします。
-
必要なパッケージをインストールします。
-
SSH接続のみを許可するようにUFW firewallを設定します。その他の接続はすべて遮断されます。
Playbookの実行が完了すると、新しいユーザーが利用可能になります。このユーザーを使用してシステムにログインできます。
Ansible Playbookの使用方法
サーバーをセットアップするには、初期サーバーセットアップ用のPlaybookとその依存関係が必要です。初めて使用する場合は、以下のリンクを使用してリポジトリをクローンする必要があります。
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
リポジトリがすでにシステムに存在する場合は、以下のコマンドを実行して最新のアップデートを取得します。
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
マシン上に以下のようなファイル構造が作成されます。
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
以下は各ファイルの説明です:
-
vars/default.yml: このファイルには、Ansibleノードを設定するための変数が含まれています。
-
playbook.yml: このファイルには、サーバー上で実行されるジョブが含まれています。
ファイル vars/default.ymlは以下のようになります。
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
以下はこれらの変数の説明です。編集したい場合は、値を独自のものに置き換えることができます。
-
create_user: 作成されるユーザーです。このユーザーは sudo権限を持ちます。
-
copy_local_key: ここにはローカルのSSH公開鍵へのパスが含まれます。これはリモートサーバーに以下としてコピーされます。 authorized_key.
-
sys_packages: サーバーに1つ以上のパッケージをインストールしたい場合は、ここに配列として指定します。
このファイルを編集したら、内容を保存します。その後、nanoで以下を押します。 CTRL+X , Y. 次に, ENTER を押してファイルの内容を保存します。
これで、複数のサーバーでこのプレイブックを実行する準備が整いました。デフォルトでは、プレイブックはインベントリ内のサーバーで実行できるようになっています。特定のサーバーでプレイブックを使用したい場合は、 -l フラグを使用できます。ここで、リモートサーバーに複数のユーザーがいると仮定すると、 -u フラグを使用して、接続するユーザーを指定できます。
サーバー名が my_server で、ユーザー名が my_user の場合は、以下のコマンドを実行してAnsibleノードで実行します:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
以下のような出力が表示されます:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************** ok: [my_server] TASK [Install Prerequisites] *********************************************************************************************************** changed: [my_server] TASK [Make sure we have a 'wheel' group] *********************************************************************************************** changed: [my_server] TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************** changed: [my_server] |
この実行が完了したら、以下のコマンドを使用して接続できます:
|
1 |
ssh my_user@server_host_or_IP |
注意: my_user は、 vars/default.yml ファイルで使用した名前です。上記のコマンドでも、サーバーのIPを実際のサーバーのIPに変更する必要があります。もし、カスタムSSHキーを指すように copy_local_key 変数を指定していた場合は、 -i スイッチで場所を指定します:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
次に、サーバーにログインしてUFWファイアウォールのルールを確認します:
|
1 |
sudo ufw status |
以下のような出力が表示されます:
|
1 2 3 4 5 |
ステータス: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) |
上記の出力は、UFWファイアウォールが正常に設定されたことを確認するものです。これがプレイブックの最後のステップでした。これが正しく実行されていれば、処理は成功したことになります。
Ansibleプレイブックの内容
このチュートリアルで使用したプレイブックファイルは、以下でホストされています:ansible-playbooks/setup_ubuntu1804 at master · do-community/ansible-playbooks · GitHub。使用または編集するために各ファイルの内容を確認したい場合は、各スクリプトの上部にある Raw ボタンをクリックしてください。
すぐに参照できるように、プレイブックの全内容と関連ファイルを以下に共有します:
-
vars/default.yml
このファイルには、プレイブックのタスクで使用される値が含まれています。これには、ユーザー名、権限、SSHキー、初期セットアップの一部としてインストールされるパッケージなどの値が含まれます。
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
この playbook.yml ファイルには、実行されるジョブが含まれています。まず、このファイルは対象となるすべてのホストをリストします。すべてのサーバーを指定したい場合は、このキーの値を all にします。次に、sudo権限を使用して実行するタスクを指定したい場合は、変数 become: true に設定します。最後に、このファイルには上記の vars/default.yml ファイルの内容を含める必要があります。このファイルから設定を読み込むために、次にこれらを含めます:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: インストール 前提条件 apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Sudoグループの設定 - name: 確実に する 私たちが 持つ a 'wheel' グループ group: name: wheel state: present - name: 許可 'wheel' グループに を 持たせる パスワードなしの sudo lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # ユーザーとキーの設定 - name: 作成 a 新規 一般 ユーザーの ( sudo 権限付き) user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: 設定 認定 キーの ( リモート ユーザー用) authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: 無効化 パスワード 認証の ( root用) lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # パッケージのインストール - name: アップデート apt apt: update_cache=yes - name: インストール 必要な システム パッケージ apt: name={{ sys_packages }} state=latest # UFWの設定 - name: UFW - 許可 SSH 接続 ufw: rule: allow name: OpenSSH - name: UFW - 拒否 すべての 他の 受信 トラフィックを デフォルトで デフォルト ufw: state: enabled policy: deny direction: incoming |
結論
ITにおいて自動化は極めて重要であり、すべてのプロセスがエラーフリーで、標準的な慣行や手順に従っていることを保証します。今日のほとんどのソフトウェアはウェブ経由で提供され、分散型の性質を持っているため、ステージングや本番環境、あるいはデモ環境など、さまざまな環境向けに新しいサーバーを作成することは日常的なタスクとなっています。
このチュートリアルでは、多くの時間を節約できる強力で使いやすいツールであるAnsibleを使用して、サーバーの自動化を実現する方法を説明しました。
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。