何をするか?
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 で制御できるようにセットアップします。
- VPS に
ansible
ユーザーを作成する ansible
ユーザーを sudoers に登録する- VPS に
ansible
ユーザーで SSH 接続できるようにする - (おまけ)Ansible で SSH デーモンの設定を変更しておく
root
ユーザーで直接 SSH 接続すれば専用のユーザーを作成する必要はないのですが、それは sshd の運用上望ましくない ので却下とします。
VPS に ansible ユーザーを作成する
VPS に root ユーザーで SSH 接続し、useradd
コマンドを使って ansible
ユーザーを作成します。
あるいは、多くの VPS サービスでは、Web サイトからコンソール接続できるようになっているので、そこで root ログインして作業しても構いません。
ユーザー作成時には、-m
(--create-home
) オプションを指定してホームディレクトリを作成しておきます。
これは、SSH の公開鍵を ~/.ssh
以下に配置する必要があるからです。
後述の SSH 接続 (ssh-id-copy
) のため、passwd
コマンドで、ユーザーのパスワードも設定しておきます。
ansible
というユーザーを使うというルールに統一しています。
こうすることでインベントリーファイル内に、ansible
というユーザーを決め打ちで記述できます。ansible ユーザーを sudoers に登録する
Ansible のタスクを管理者権限で実行 (become: true
) できるようにするために、ユーザーを suduoers
に登録しておきます。
次のように visudo
コマンドを実行して、/etc/sudoers.d/ansible
ファイルを作成します(ファイル名は何でもよいですが、ここでは ansible
としています)。
(VPS)# visudo /etc/sudoers.d/ansible
ファイルの内容は次のような感じにして、ansible
ユーザーであれば任意のコマンドをパスワードなしで実行できるようにしておきます。
別の方法として、次のように既存の管理者系グループに 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_rsa
、id_rsa.pub
) を作成することにします。
SSH キーができたら、ssh-id-copy
コマンドで VPS に公開鍵を登録します。
この時点ではまだ SSH キーによる接続はできないので、ansible
ユーザーのパスワードを入力して接続することになります。
これで、SSH キーで接続できるようになったので、次のように確認しておきます。
Ansible で接続確認する
VPS に SSH 接続できるようになったので、Ansible コマンドも実行できるようになっています。 インベントリファイルを作成して、接続先の VPS サーバー名と、ユーザー名、SSH 秘密鍵のパスを記述しておきます。
インベントリーファイルに接続情報を記述したくない場合は、SSH クライアントの設定ファイル (~/.ssh/config
) に SSH の接続設定を記述しておくこともできます。
この例では、ホスト名のエイリアスとして example.com-ansible
を定義しています。
通常のホスト名の代わりのこのエイリアスを使うことで、ホスト example.com
にユーザー ansible
で接続することや、使用する SSH 秘密鍵などをまとめて指示できます(この仕組みは ansible
コマンドだけではなく、SSH を使用するコマンド全般に有効です)。
結果として、インベントリーファイルは次のように簡潔に記述できます。
後は、おもむろに 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
このような調子で、サーバーのセットアップを自動化していけます。
関連記事
- Ansible で SSH サーバーをセキュアにする (ansible.builtin.lineinfile, ansible.builtin.service)
- Ansible タスク例: APT パッケージをインストールする (ansible.builtin.apt)
- Ansible タスク例: UFW でファイアウォールを設定する (community.general.ufw)
- Ansible タスク例: Web からファイルをダウンロードする (ansible.builtin.get_url)
- Ansible タスク例: when による Playbook の条件分岐
- Ansible の SSH 接続で使用するユーザーと秘密鍵を指定する
- Docker コンテナで Ansible のテストベッド環境を用意する