最近、自宅サーバーのストレージ兼計算資源用として、SynologyのDiskStation DS1522+というNASを買いました。 このNASは、ストレージ用としてだけでなく、コンテナや仮想マシンを動かすことができるハイスペック機種であり、自宅で高可用性クラスタを組むためのピースとして期待しています。 ちなみにお値段は12万円ほど。
一方で、DSMという独自のブラウザベースのUIを備えており操作は基本的にそこから行うことが想定されているようですが、我が家の自宅サーバーではIaCを全面的に採用しているので、できればコンテナや仮想マシンのデプロイはコード管理をしたいところです。 そこでこの記事では、その点の検証も行っていきます(長くなるので今回はコンテナのみ。仮想マシンはこちら)。
TL; DR;
- SSHの設定をしてしまえばAnsibleから通常のLinuxマシン同様にdockerコンテナを立ち上げられる
- 拡張ACLによりコンテナ内でマウント先への書き込み時の権限に問題が生じることがあるので、適宜設定を行う必要がある
NAS本体のセットアップ
仮想化環境以前にまずはセットアップしないといけないので、開封の儀も兼ねてセットアップ手順を軽く書いていきます。
開封の儀
外箱は画像のように手提げがついており、持ち運びやすいようになっています(通販なので持ち運びませんが)。
内容物は、
- 本体
- ACアダプタ・電源コード
- LANケーブル2本
- 2.5インチSSD固定用ネジ
- ディスクベイ固定用キー
- マニュアル
となっています。
箱の外観は画像のようになっています。
セットアップ
ディスクベイにディスクをセットしたら、電源とLANケーブルを接続して電源を入れます。
公式サイトのドキュメントを参考にしてセットアップをしていきます。 SynologyのNASは、DSMというブラウザベースのUIを備えており、セットアップもここから行っていきますが、特にIPアドレスの設定をしていないのでそのままではアクセスすることができません。 同一のLANでhttp://find.synology.com/にアクセスすることで未セットアップのNASにアクセスできます。
目的のNASに接続できたら、インストールを行っていきます。 画面の指示に従っていくだけで簡単にインストールできます。
しばらくするとインストールが終了するので、セットアップ時に設定したユーザーでログインします。
次にストレージプールをセットアップします。 SynologyのNASでは、ストレージは以下のような階層構造になっています。
- ストレージプール:複数のディスクを束ねて冗長性を保証する単位。LVMでのVolume Groupに相当する概念
- ボリューム:仮想的なパーティション。LVMでのLogical Volumeに相当する概念
- 共有フォルダ:共有の単位
セットアップ直後はストレージプールとボリュームの作成を求められるので作成します。 3TBの2つのHDDをSHRで冗長化し、その中にテスト用に小さなボリュームを作成します。 なお、ボリュームは後から拡大できますが、縮小することはできません。
最後に、DHCPで設定されたIPアドレスを固定にするためにコントロールパネルのネットワーク設定からネットワークインタフェースの設定を変更しDHCPから適切な固定IPアドレスを設定します。
これで最低限のセットアップは終了したので、いよいよ仮想化環境をセットアップしていきます。
IaCを行うための事前準備
IaCの手段には色々ありますが、本記事ではAnsibleを用いたコンテナのセットアップを行っていきます。 Ansibleの実行のためには、マシンに対してSSHでログインできることが必要なので、SSH接続設定を行っていきます。
SSH設定
SSHで接続するためには、SSHの有効化とグループへのユーザー追加が必要です。 それぞれコントロールパネルから簡単に行うことが可能です。
ホームディレクトリの設定
このままでもパスワードによるログインができますが、ホームディレクトリがないので警告が出ますし、公開鍵によるログインが行えません。 そのため、ホームディレクトリを設定していきます。
ホームディレクトリは、File Stationというアプリからアクセスできるので、ログインしているユーザーのホームディレクトリに公開鍵を設置(普通のLinuxマシンと同じく.ssh/authorized_keysに公開鍵を記載)することで準備完了です。
接続確認
sshできればok。
$ ssh [email protected]
Using terminal commands to modify system configs, execute external binary
files, add files, or install unauthorized third-party apps may lead to system
damages or unexpected behavior, or cause data loss. Make sure you are aware of
the consequences of each command and proceed at your own risk.
Warning: Data should only be stored in shared folders. Data stored elsewhere
may be deleted when the system is updated/restarted.
localadmin@Brahma:~
Container Managerのインストール
デフォルトではNASにdockerデーモンは起動していないので、Container Managerをインストールしていきます。 パッケージセンターでインストールを行うだけです。
もちろん(というか本来の方法ですが)このコンソールから手作業でコンテナを立ち上げることも可能です。
$ curl 172.16.1.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Ansibleによるコンテナの起動
それではいよいよAnsibleを使ったIaCな方法でdockerコンテナを動かしてみましょう。
NASはSSH接続できるLinuxマシンなので、普通のinventoryで接続できます。
all:
hosts:
NASのホスト名:
ansible_user: {{ ログインユーザー }}
ansible_become_password: {{ ログインパスワード }}
小手調べに接続できるかだけ試してみます。
$ ansible -i inventory.yaml all -m ping
[WARNING]: Platform linux on host nas.dev.lab.kotaro7750.net is using the discovered Python interpreter at /usr/bin/python3.8, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.16/reference_appendices/interpreter_discovery.html for more information.
nas.dev.lab.kotaro7750.net | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.8"
},
"changed": false,
"ping": "pong"
}
ちゃんと接続できています。
それではdockerコンテナを立ち上げてみます。
---
- name: Launch nginx
hosts: all
tasks:
- community.docker.docker_container:
name: from-ansible
image: nginx:latest
ports:
- 8080:80
become: true
$ ansible-playbook -i inventory.yaml playbook.yaml
PLAY [Launch nginx] **********************************************************************************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************************************************************
[WARNING]: sftp transfer mechanism failed on [172.16.1.1]. Use ANSIBLE_DEBUG=1 to see detailed information
[WARNING]: Could not query system capabilities: [Errno 13] Permission denied: b'/usr/bin/capsh'
[WARNING]: Platform linux on host 172.16.1.1 is using the discovered Python interpreter at /usr/bin/python3.8, but future installation of another Python interpreter could change the meaning of that path. See https://docs.ansible.com/ansible-core/2.16/reference_appendices/interpreter_discovery.html for more information.
ok: [172.16.1.1]
TASK [community.docker.docker_container] *************************************************************************************************************************************************************************************************************************************************************************************
changed: [172.16.1.1]
PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************************************************************
172.16.1.1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
先ほどと同じようにcurlをしても問題なくつながり、無事コンテナを立ち上げられることがわかります。
マウント先への書き込み時のPermission Denied
単純なコンテナなら説明したように実行することができますが、NAS内のファイルシステム内からのマウントに対して書き込みを行う際、適切にパーミッションを設定しているにも関わらず権限の問題が出ることがあります。
このログはHashicorp Vaultコンテナのログですが、ローカルストレージ上のDBに書き込むことができていません。
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /raft-storage/vault.db: permission denied
2024-07-14T13:22:04.620Z [INFO] proxy environment: http_proxy="" https_proxy="" no_proxy=""
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /raft-storage/vault.db: permission denied
2024-07-14T13:22:05.750Z [INFO] proxy environment: http_proxy="" https_proxy="" no_proxy=""
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /raft-storage/vault.db: permission denied
2024-07-14T13:22:06.989Z [INFO] proxy environment: http_proxy="" https_proxy="" no_proxy=""
2024-07-14T13:22:08.213Z [INFO] proxy environment: http_proxy="" https_proxy="" no_proxy=""
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /raft-storage/vault.db: permission denied
Error initializing storage of type raft: failed to create fsm: failed to open bolt file: open /raft-storage/vault.db: permission denied
マウントしているディレクトリのパーミッションは777にしてあり、コンテナ内の実行ユーザーであるrootは問題なく書き込みができるはずと思っていましたが、実際にログインして確認してみると、通常のパーミッションだけではなく拡張パーミッションが設定されていました(cf. ACL(アクセス制御リスト)の使い方 - hana_shinのLinux技術ブログ)。
localadmin@Brahma:~/vault$ ls -le
total 20
-rw-r--r-- 1 localadmin users 2000 Jul 14 22:06 ca.crt
# マウントしているディレクトリ
drwxrwxrwx+ 1 localadmin users 0 Jul 14 22:06 raft
[0] user:localadmin:allow:rwxpdDaARWcCo:fd-- (level: 2)
[1] group:administrators:allow:rwxpdDaARWc--:fd-- (level: 3)
[2] everyone::allow:--x----------:fd-- (level: 3)
[3] owner::allow:rwxpdDaARWcCo:fdi- (level: 3)
[4] user:localadmin:allow:rwxpdDaARWcCo:---- (level: 3)
-rw-r--r-- 1 localadmin users 4115 Jul 14 22:06 server.crt
-rw-r--r-- 1 localadmin users 3243 Jul 14 22:06 server.key
-rwxr-xr-x 1 localadmin users 539 Jul 14 22:12 vault-conf.hcl
NASの共有ファイルを多人数で直接共有するという場合には細かな制御が可能な点は利点がありますが、私はNASをあくまでも仮想化基盤・ストレージとして使いたいので無効にしてしまいます。 File Stationアプリから、ディレクトリの設定を選択して「デフォルトのUNIX許可を適用」にチェックを入れます。 cf. File Station 設定の管理 | File Station - Synology ナレッジセンター
既存のACLは消えないので適宜chmodをして設定を行います。
$ chmod -R 755 localadmin/
これで、問題なく書き込みも行えるようになっているはずです。