Ansibleでユーザー作成とSSH認証

はじめに

こんにちはnaya(@NayaTaiyo)です。前回はVagrantでWordPressを構築しましたが、今回はAnsibleを利用して、ユーザー作成とSSH鍵認証を自動化してみました。Ansibleは汎用性が高く、人によって設定方法が異なるため、本手順に記載のある設定方法はあくまでも参考までにご確認いただければと思います。

VagrantでWordPressを構築する


Ansibleとは

Ansibleは、サーバやネットワーク機器などの構築を自動化するためのOSSツールです。SSHエージェントレスでのデプロイとシンプルなyamlファイルで実装することができます。以下IaCについて説明します。

  • Infrastructure as Code(IaC)とは?

従来は手動で設定していたインフラの構成や管理を、コードとして定義・Gitで管理する手法です。IaCを使うと、サーバーやネットワーク、データベース、といったインフラ要素のプロビジョニングや設定をコードベースで自動化・統一化できます。


Ansibleの基本用語

  • インベントリ(hosts)

インベントリは、Ansibleが管理する対象ホストの一覧を定義したファイルです。ホストをグループ化することで、特定のサーバー群に対して操作を行うことができます。本記事では、hosts ファイルのことを指します。また、hostsで指定したホスト環境で使用できる変数を定義する group_vars ディレクトリもあります。

  • 設定ファイル(ansible.cfg)

ansible.cfg は、Ansibleの動作に関する設定を記述するファイルです。

  • モジュール(Module)

モジュールは、Ansibleが実行する個々の機能や操作を定義したものです。ユーザーの作成やパッケージのインストールなど、さまざまなタスクを実行するためのモジュールが用意されています。

  • タスク(Task)

タスクは、モジュールを使用して実行される具体的な操作です。Playbook内で順番に定義され、上から順に実行されます。

  • プレイブック(Playbook)

プレイブックは、YAML形式で記述された設定ファイルで、実行するタスクの一覧を定義します。Playbookを実行することで、指定したタスクが対象ホストに適用されます。

  • ロール(Role)

Ansibleの「ロール(Role)」は、Ansibleプレイブックの設定やタスクを再利用可能な単位にまとめる機能です。ロールは、特定の目的の設定を整理し、複雑なインフラ構成を管理しやすくするために使用されます。ロールを使うことで、設定の再利用が容易になり、可読性が向上します。

構築環境

  • ホストOS: Windows11
    • Vagrant 2.4.1
    • VirtualBox 7.0.14
  •  リモートマシンOS:Linux
    • Amazon Linux 2 202404.23.0版

  • Vagrantfile

ディレクトリ構造

本記事のディレクトリ構造になります。


Ansible実装手順

  • Ansibleのインストール

まず、Ansibleを管理用PCやサーバーにインストールします。ここでは、Amazon Linux2を例に説明します。なお、仮想マシンについては接続設定はすでに設定されており、互いに通信ができる状態です。

  • インベントリファイルの作成

対象ホストを定義するインベントリファイルを作成します。デフォルトでは/etc/ansible/hostsが使用されますが、独自のファイルを作成することも可能です。例として、project_root/inventory/配下にhostsというファイルを作成します。

  • ansible.cfgの作成(project_root/ansible.cfg)

対象ホストを定義したhostsファイルだけだと、playbook動作時に読み込まないためproject_root/配下にansible.cfgを作成して設定を記載します。

[説明]

  • inventory ={ファイルパス}
    • インベントリファイルのパスを指定
  • log_path = {ファイルパス}
    • Ansibleのログファイルの出力先を指定
  • interpreter_python = auto_silent
    • Pythonインタープリタを自動で選択し、警告メッセージを表示しない設定。
  • become = {True/false}
    • Ansibleのタスクをrootで実行
  • scp_if_ssh = {True/false} 
    • ファイル転送メソッドとしてscpを使用

ansible.cfgについての注意
こちらのansible.cfgについてはアクセス権限777を与えるとplaybookを実行時にエラーが起きてしまうのと、以下の読み込みの優先順位があるため気を付けましょう。

  1. ANSIBLE_CONFIG (環境変数にansible.cfgのパスが設定されている場合)
  2. ansible.cfg (現在のディレクトリー)
  3. ~/.ansible.cfg (ホームディレクトリー)
  4. /etc/ansible/ansible.cfg

例えば、ANSIBLE_CONFIG に設定されているパスがproject_root/ansible/ansible.cfgの場合は、現在のディレクトリがproject_root/配下であってもplaybook実行時に優先的にANSIBLE_CONFIGに格納されているパスのansible.cfgを読み込んでしまうので注意。

  • group_varsの作成
  • project_root/group_vars/all.yml

  • Playbookの作成(project_root/playbook.yml)

ユーザーの新規作成、SSH鍵認証を設定するするためのplaybookを作成します。ファイル名はplaybook.ymlとします。

[説明]

  • name: {タスク名}
    • タスク名を指定
  • hosts: {ホスト名/ホストグループ名/all}
    • playbook実行対象ホスト名/ホストグループ名を指定。allだと全ホスト
  • roles: {ロール名}
    • playbook実行ロールの指定

各ロールの設定を行う

  • userロール(project_root/roles/user/vars/main.yml)

新規ユーザの追加を行うロールファイルの作成を行います。

  • project_root/roles/user/tasks/main.yml

[説明]

  • lineinfile:
    • ファイルの編集、追記、削除を行う
  • group: 
    • playbook実行対象ホスト名/ホストグループ名を指定。allだと全ホスト
  • user: 
    • 新規ユーザーの設定と作成
  • loop:
    • 同じ処理を複数回繰り返すために使用する機能”{{ item }}”や”{{ item.変数名 }}”で値を取り出す
  • path: {ファイルパス}
    • lineinfileの対象ファイルパス
  •  line: {編集する内容}
    • ファイルの編集内容
  •  state: {present/absent}
    • presentは存在しない場合は作成や追記。absentは存在する場合は削除。
  • validate: {オプション}
    • 指定したファイルの構文エラーチェックを行う
  • password :{ パスワード | password_hash(‘sha512’) }
    • ユーザのパスワードを設定。パスワードはSHA512などで暗号化された形式で指定する必要があります。
  • shell: {シェルのパス}
    • ユーザーが使用するデフォルトのシェルを指定
  • update_password: {always/on_create/no}
    • パスワードを更新する。alwaysは毎回更新、on_createは初回設定時のみ更新、noは更新しない

※loop処理を使用している理由は、作成するユーザーやグループが増えた場合を想定して追加しております。

  • sshロールの作成

ssh公開鍵認証の設定を行うロールのファイルを作成します。

  • project_root/roles/ssh/vars/main.yml

lookupでauthorized_keysファイルの中身を出力して結果をssh_keyに格納

  • project_root/roles/user/vars/password.yml

  • project_root/roles/ssh/files/sshd_config

[説明]

  • HostKey{鍵ファイルパス}
    • サーバーが使用するホストキーのファイルパス
  • SyslogFacility {ログファシリティ}
    • SSHサーバーがログを出力するログファシリティ
  • PermitRootLogin yes/no
    • rootユーザでのSSHログイン有/無
  • PubkeyAuthentication yes/no
    • 公開鍵認証有/無
  • AuthorizedKeysFile {ファイルパス}
    • 公開鍵ファイルのファイルパス
  • project_root/roles/ssh/tasks/main.yml
  • project_root/roles/ssh/handlers/main.yml

  • playbookの実行


まとめ

Ansibleを使用することで、複数のサーバーに対して一括でユーザーを作成するなど、管理作業を効率化できます。本記事では、Ansibleの基本用語とともに、新規ユーザーを作成する手順とSSH鍵認証の設定を紹介しました。

また、Ansibleでは数多くのモジュールを実装しているのでこれを機に、様々なモジュールを使って実装してみるのも面白いと思います!私は、コードを書く経験が今までほとんどなかったので、勉強したての時はエラーが発生しまくりでとても苦戦した記憶がありました。コードへの理解は数をこなして勉強していくのが大事だと思うので最初は苦戦するかもですが皆さんもぜひ一緒に学んでいきましょう!

■参考リンク

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール