まくろぐ
更新: / 作成:

何をするか?

ConoHa VPS などの VPS を借りてサーバーをセットアップしようとすると、多くの手順が必要になります。 そんなとき、最初から Ansible で環境構築するようにしておけば、セットアップ手順を Ansible Playbook でドキュメント化することができ、サーバーの再構築が容易になります。

ここでは、初期状態の VPS サーバー(root 接続のみ可能な状態)に、ansible というユーザーを追加し、Ansible で VPS を制御するための環境を整えます。

前提条件

  • コントロールノード側(手元の PC)には、あらかじめ Ansible の実行環境がインストールされているものとします(参考: Ansible をインストールする)。
  • マネージドノード側(VPS サーバー)にはパスワードで SSH 接続することが可能で、Python3 の実行環境がインストールされているものとします。最新の Ubuntu であれば、これらのソフトウェアは最初から使えるはずです。

多くの場合、VPS を使い始めた直後は、root ユーザーで直接 SSH 接続できるようになっていると思います。 今回の手順で、Ansible による接続ができるようになった後は、SSH デーモンの設定を変更して、root ユーザーでの直接接続を禁止するようにしておくと安全です。 もちろん、この設定には Ansible を使うことができます。

セットアップの流れ

ここでは、VPS に ansible というユーザーを作成し、Ansible で制御できるようにセットアップします。

  1. VPS に ansible ユーザーを作成する
  2. ansible ユーザーを sudoers に登録する
  3. VPS に ansible ユーザーで SSH 接続できるようにする
  4. (おまけ)Ansible で SSH デーモンの設定を変更しておく

root ユーザーで直接 SSH 接続すれば専用のユーザーを作成する必要はないのですが、それは sshd の運用上望ましくない ので却下とします。

VPS に ansible ユーザーを作成する

VPS に root ユーザーで SSH 接続し、useradd コマンドを使って ansible ユーザーを作成します。 あるいは、多くの VPS サービスでは、Web サイトからコンソール接続できるようになっているので、そこで root ログインして作業しても構いません。

VPS に root 接続してユーザーを追加
$ ssh root@example.com
root@examle.com's password: ********

(VPS)# useradd -m ansible
(VPS)# passwd ansible

ユーザー作成時には、-m (--create-home) オプションを指定してホームディレクトリを作成しておきます。 これは、SSH の公開鍵を ~/.ssh 以下に配置する必要があるからです。 後述の SSH 接続 (ssh-id-copy) のため、passwd コマンドで、ユーザーのパスワードも設定しておきます。

☝️ ansible というユーザー名 すでに sudoers 登録されたユーザーが存在する場合は、Ansible でもそのユーザーを使えばいいのではと思うかもしれません。 ここでは Ansible での操作には ansible というユーザーを使うというルールに統一しています。 こうすることでインベントリーファイル内に、ansible というユーザーを決め打ちで記述できます。

ansible ユーザーを sudoers に登録する

Ansible のタスクを管理者権限で実行 (become: true) できるようにするために、ユーザーを suduoers に登録しておきます。 次のように visudo コマンドを実行して、/etc/sudoers.d/ansible ファイルを作成します(ファイル名は何でもよいですが、ここでは ansible としています)。

(VPS)# visudo /etc/sudoers.d/ansible

ファイルの内容は次のような感じにして、ansible ユーザーであれば任意のコマンドをパスワードなしで実行できるようにしておきます。

/etc/sudoers.d/ansible
ansible ALL=(ALL) NOPASSWD:ALL
☝️ ワンポイント

別の方法として、次のように既存の管理者系グループに ansible ユーザーを登録してしまう方法もあります。

(VPS)# gpasswd -a ansible admin (Debian/Ubuntu の場合)
(VPS)# gpasswd -a ansible wheel (CentOS/RockyLinux の場合)

ただし、この方法を使った場合は、ansible (ansible-playbook) コマンドを実行するときに、-K (--ask-become-password) オプションで sudo パスワードの入力が必要になります。

VPS に ansible ユーザーで SSH 接続できるようにする

exit でコントロールノード(手元の PC)に戻って、SSH 鍵を作成し、VPS に公開鍵を登録します。 ここでは、~/.ssh/ansible ディレクトリ以下に SSH キーペア (id_rsaid_rsa.pub) を作成することにします。

SSH キーの作成
$ mkdir -p -m 0700 ~/.ssh/ansible
$ ssh-keygen -t rsa -f ~/.ssh/ansible/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): (パスワード省略するならそのまま Enter)

SSH キーができたら、ssh-id-copy コマンドで VPS に公開鍵を登録します。 この時点ではまだ SSH キーによる接続はできないので、ansible ユーザーのパスワードを入力して接続することになります。

SSH 公開鍵を ansible ユーザー用に登録
$ ssh-copy-id -i ~/.ssh/ansible/id_rsa.pub ansible@examle.com
...
ansible@example.com's password: (先ほど passwd で設定したパスワードを入力)

これで、SSH キーで接続できるようになったので、次のように確認しておきます。

SSH キーによる接続確認
$ ssh -i ~/.ssh/ansible/id_rsa ansible@example.com

Ansible で接続確認する

VPS に SSH 接続できるようになったので、Ansible コマンドも実行できるようになっています。 インベントリファイルを作成して、接続先の VPS サーバー名と、ユーザー名、SSH 秘密鍵のパスを記述しておきます。

hosts.ini
example.com ansible_user=ansible ansible_ssh_private_key_file=~/.ssh/ansible/id_rsa

インベントリーファイルに接続情報を記述したくない場合は、SSH クライアントの設定ファイル (~/.ssh/config) に SSH の接続設定を記述しておくこともできます。

~/.ssh/config
Host example.com-ansible
    Hostname example.com
    User ansible
    Port 22
    IdentityFile ~/.ssh/ansible/id_rsa

この例では、ホスト名のエイリアスとして example.com-ansible を定義しています。 通常のホスト名の代わりのこのエイリアスを使うことで、ホスト example.com にユーザー ansible で接続することや、使用する SSH 秘密鍵などをまとめて指示できます(この仕組みは ansible コマンドだけではなく、SSH を使用するコマンド全般に有効です)。

結果として、インベントリーファイルは次のように簡潔に記述できます。

hosts.ini
example.com-ansible

後は、おもむろに ansible コマンドか ansible-playbook コマンドで VPS を制御できるか確認します。

$ ansible all -i hosts.ini -m ping
example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

これで、VPS を Ansible で制御できるようになりました!

(おまけ)Ansible で SSH デーモンの設定を変更しておく

VPS の SSH デーモンは、デフォルトで root ユーザーでの SSH 接続が許可 (PermitRootLogin: yes) されていたりするので、この設定を変更しておくと安全です。 そのための Ansible Playbook の記述例が下記ページにあるので参考にしてください。

この Playbook を次のように実行すれば、VPS への root ユーザーでの接続が無効になります。

$ ansible-playbook -i hosts.ini secure-sshd.yaml

このような調子で、サーバーのセットアップを自動化していけます。

関連記事

まくろぐ
サイトマップまくへのメッセージ