0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

おうちサーバー構築報告:AnsibleでProxmoxVEのゲストマシン4台それぞれ/etcをSubversion管理

Last updated at Posted at 2024-12-24

能書き

おうちサーバー構築報告:予告からのおうちサーバー構築の続きです。

Intel NUC のマシン NUC13ANHI5000 に Proxmox VE をインストールして、コンテナの構築方法を調査し、仮想マシンの構築方法も調査し、さあこれからだ!と言う訳ですが。その前に/etcのバージョン管理を仕込みます。但し私の個人的な好みで、GitではなくSubversionを使います。その為etckeeperは使いません。

既に何度か同じ内容の記事を書いていますが、今回は作業手順をAnsibleで実行する形にしてみました。Ansibleを使うのは初めてです。

目標

  • ProxmoxVE上にゲストマシンを構築
    • コンテナを3台(マシン名: network, mail, proxy)
    • 仮想マシンを1台(マシン名: docker)
  • それぞれSubversionでバージョン管理できるように設定し、最初のコミットを実行
    • その手順をAnsibleで各マシンにおいて実行

参考文献

/etcをSubversion管理する過去記事です。

/etcのバージョン管理とは関係ありませんが、もしxmllistコマンドがあればSubversionのログを自由に操作できます。

Ansibleについての参考文献と言えば、筆頭はやはり公式でしょうか。

Ansible関連での諸々。

Ansibleの構成管理ではない使い方という事で、こんなQiita記事がありました。

その他。

ゲストマシン構築

コンテナ仮想マシンの構築方法は以前やりましたので、ProxmoxVE操作の詳細はそちらを参照してください。画面キャプチャを撮って貼り付けるのは大変なんです…

ゲストマシンへの接続は、Ansibleコントロールノードについては普段使いのWindowsマシンから公開鍵方式でssh接続しようと思います。ProxmoxVEのコンソールではコマンドのコピペとか出来なさそうですし。

Windowsにおいても下記のコマンドで公開鍵ペアを生成できます。暗号の種類は、昨今の情勢を鑑みて楕円曲線暗号Ed25519にします。既に公開鍵があればそれを再利用しても良いです。

クライアントマシン:Windows
ssh-keygen -t ed25519 -P ""

鍵ペアは%HOMEPATH%/.sshディレクトリに作成されて、それに関して問合せがありますので、何も入力せずにEnterキーを押しましょう。

そうして作成した鍵ペアのうち公開鍵の方(ファイル名:id_ed25519.pub、拡張子.pubの付いている方)を適当なテキストエディタで開いて、もしくは下記コマンドを実行して、内容をコピーします。

クライアントマシン:Windows
type %HOMEPATH%\.ssh\id_ed25519.pub

コントロールノードとしてコンテナ1台

構築

  • ホスト名: constructor
  • リソースプール: all
  • パスワード: (適当なパスワードを設定)
  • SSH公開鍵: (コピーした公開鍵を貼り付け)
  • テンプレート: ubuntu-24.04-standard_24.04-2_amd64.tar.zst
  • ディスクサイズ: 8GiB
  • CPUコア: 1
  • メモリ: 512MiB
  • スワップ: 512MiB
  • IPv4/CIDR: 172.16.1.100/16 (我が家のIPアドレス体系に沿って決定)
  • ゲートウェイ: 172.16.2.1 (我が家のゲートウェイアドレス)

そして作成したコンテナを開始。

設定したパスワードはコンソールでrootログインする際に使用します。GUIで確認します。

普段使いのWindowsマシンからssh接続を試みます。パスワードを入力せずに接続できます。

クライアントマシン:Windows
ssh root@172.16.1.100

準備

Ansibleを実行するユーザーを作成します。rootでこういう操作はセキュリティ的にまずいので。

コントロールノードconstructor:ユーザーroot
useradd -m -s /bin/bash ansible
passwd ansible

このコントロールノードから各ターゲットノードにansibleユーザーで公開鍵ssh接続しますので、それ用の鍵を作成しておきます。

コントロールノードconstructor:ユーザーroot
su - ansible
コントロールノードconstructor:ユーザーansible
ssh-keygen -t ed25519 -P ""

作成できたら公開鍵を表示。

コントロールノードconstructor:ユーザーansible
cat .ssh/id_ed25519.pub

ターゲットノードを作成する際にはこの公開鍵をコピペします。

ターゲットノードとしてコンテナ3台

1台目は諸々雑多なサーバーソフトを集めます。何となくネットワーク関連に見えなくもないので、マシン名は network とします。あまり動かない筈なので超非力でも十分です。多分。

  • ホスト名: network
  • リソースプール: all
  • パスワード: (適当なパスワードを設定)
  • SSH公開鍵: (コントロールノードconstructorの公開鍵をコピーして貼り付け)
  • テンプレート: ubuntu-24.04-standard_24.04-2_amd64.tar.zst
  • ディスクサイズ: 8GiB
  • CPUコア: 1
  • メモリ: 512MiB
  • スワップ: 512MiB
  • IPv4/CIDR: 172.16.1.101/16 (我が家のIPアドレス体系に沿って決定)
  • ゲートウェイ: 172.16.2.1 (我が家のゲートウェイアドレス)

2台目は電子メールサーバーです。内部専用で滅多に動かないので超非力にしましたが、ディスクサイズだけ念の為にちょっと付け足しました。

  • ホスト名: mail
  • リソースプール: all
  • パスワード: (適当なパスワードを設定)
  • SSH公開鍵: (コントロールノードconstructorの公開鍵をコピーして貼り付け)
  • テンプレート: ubuntu-24.04-standard_24.04-2_amd64.tar.zst
  • ディスクサイズ: 16GiB
  • CPUコア: 1
  • メモリ: 512MiB
  • スワップ: 512MiB
  • IPv4/CIDR: 172.16.1.102/16 (我が家のIPアドレス体系に沿って決定)
  • ゲートウェイ: 172.16.2.1 (我が家のゲートウェイアドレス)

3台目はリバースプロキシです。これも超非力で大丈夫かな。念の為にメモリだけちょっと付け足しましょうか。

  • ホスト名: proxy
  • リソースプール: all
  • パスワード: (適当なパスワードを設定)
  • SSH公開鍵: (コントロールノードconstructorの公開鍵をコピーして貼り付け)
  • テンプレート: ubuntu-24.04-standard_24.04-2_amd64.tar.zst
  • ディスクサイズ: 8GiB
  • CPUコア: 1
  • メモリ: 1024MiB
  • スワップ: 1024MiB
  • IPv4/CIDR: 172.16.1.103/16 (我が家のIPアドレス体系に沿って決定)
  • ゲートウェイ: 172.16.2.1 (我が家のゲートウェイアドレス)

3台構築できたらすべて開始しておきます。
開始したらコントロールノードconstructorから公開鍵で(パスワード無しで)ssh接続できる事を確認します。

コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.101
コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.102
コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.103

ターゲットノードとして仮想マシン1台

仮想マシンはDockerサーバーです。それなりにパワーを付与します。現在の予定ではGitLabとMattermostを動かそうと考えています。趣味で開発を始めたら GitLab CI/CD とか試したい。

  • 名前: docker
  • リソースプール: all
  • ブート時に起動: チェックを入れる
  • CD/DVDイメージファイル(iso)を使用
    • ISOイメージ: ubuntu-24.04-live-server-amd64.iso
  • ディスクサイズ: 512GiB
  • CPUコア: 4
  • メモリ: 16384MiB
  • 最小メモリ量: 8192MiB

そしてUbuntuインストール。

  • Installer update available
    • Continue without updating
  • keyboard configuration
    • Layout: Japanese
    • Variant: Japanese
  • Choose the type of installation
    • Ubuntu Server
  • Network configuration
    • IPv4 Method: Manual
    • Subnet: 172.16.0.0/16
    • Address: 172.16.1.104
    • Gateway: 172.16.2.1
    • Name servers: 172.16.2.1
    • Search domains: local
  • Proxy configuration
    • Proxy address: (空欄のまま)
  • Ubuntu archive mirror configuration
    • (特に何もせずDone)
  • Guided storage configuration
    • Use an entire disk
      • Set up this disk as an LVM group
  • Storage configuration
    • (特に何もせずDone)
    • Confirm destructive action
      • このままインストールするとデータが消えるとの警告
  • Profile configuration
    • Your name: administrator (適当に名前を決める)
    • Your servers name: docker
    • Pick a username: administrator (適当に名前を決める)
    • Choose a password: (適当なパスワードを設定)
    • Confirm your password: (パスワードをもう一度)
  • Upgrade to Ubuntu Pro
    • Skip for now
  • SSH configuration
    • Install OpenSSH server: チェックを入れる
  • Featured server snaps
    • dockerを選択

最初はパスワードでログインします。

クライアントマシン:Windows
ssh administrator@172.16.1.104

確認できたらすぐにexit。そして公開鍵を設定します。
公開鍵を転送して設定するのはssh-copy-idという便利なコマンドがあるそうですが、Windowsには無いらしいです。残念。

クライアントマシン:Windows
ssh administrator@172.16.1.104 "cat >.ssh/authorized_keys" <.ssh\id_ed25519.pub

今度はパスワード無しでログインできます。

クライアントマシン:Windows
ssh administrator@172.16.1.104

また、コントロールノードconstructorからの公開鍵ssh接続を設定します。Ubuntuなのでssh-copy-idが使えます。

コントロールノードconstructor:ユーザーansible
ssh-copy-id administrator@172.16.1.104

コントロールノードconstructorからもパスワード無しでログインできるようになりました。

コントロールノードconstructor:ユーザーansible
ssh administrator@172.16.1.104

最後に一つ細工を。仮想マシンdockerに於いて、administratorユーザーがsudoで昇格する際はパスワード無しにします。Ansibleで必要なので。

ターゲットノードdocker
echo administrator$'\t'ALL=\(ALL\) NOPASSWD: ALL | sudo tee -a /etc/sudoers.d/npconf >/dev/null

余談ですが、/etc/sudoers.dの中に置くファイルは拡張子があったらダメのようです。実際に試行錯誤して掴んだ情報です。

再起動で反映します。実際にやってみると再起動しなくても反映しているようですが。

ターゲットノードdocker:ユーザーadministrator
sudo reboot

Ansibleインストール

コントロールノードconstructorにAnsibleをインストールします。Ubuntu24.04へのAnsibleインストールは、単にapt installで良いみたいです

コントロールノードconstructor:ユーザーroot
apt update
apt upgrade -y
コントロールノードconstructor:ユーザーroot
apt install -y ansible

確認。

コントロールノードconstructor:ユーザーroot
ansible --version

Ansible設定と実行

ansibleユーザーになります。

コントロールノードconstructor:ユーザーroot
su - ansible

インベントリを定義します。

コントロールノードconstructor:ユーザーansible
cd
mkdir svn_etc
cd svn_etc
cat <<___ >inventory.ini
[servers]
172.16.1.101
172.16.1.102
172.16.1.103
172.16.1.104 ansible_user=administrator

[servers:vars]
ansible_user=root
___

インベントリの確認の為にpingしてみましょう。

コントロールノードconstructor:ユーザーansible
ansible all -m ping -i inventory.ini

playbook.yamlを作ります。内容は/etcのSubversion管理で、以前の手順を脚本化したものです。おお、「Playbook化した」と書くよりカッコいい気がしますな。

残念ながら冪等性はありません。2回流すとrm /etc/ssl/certs/NetLock*の所でエラーが出て停止します。正確なファイル名を書けないので仕方がありません。

コントロールノードconstructor:ユーザーansible
cat <<___ >playbook.yaml
- name: Play test
  hosts: servers

  tasks:
  - name: apt update
    apt:
      update_cache: yes
    become: yes
  - name: apt upgrade
    apt:
      upgrade: yes
    become: yes
  - name: install subversion
    apt:
      name: subversion
    become: yes
  - name: create the directory of a repository
    file:
      path: /etc/.svn_repo
      state: directory
    become: yes
  - name: initialize the repository
    shell:
      cmd: svnadmin create /etc/.svn_repo/
      creates: /etc/.svn_repo/README.txt
    become: yes
  - name: create the temporary directory of /etc
    file:
      path: /tmp/etc
      state: directory
    become: yes
  - name: svn-import the temporary directory
    shell:
      cmd: svn import /tmp/etc file:///etc/.svn_repo/ -m "create a project"
      creates: /etc/.svn_repo
    become: yes
  - name: remove the temporary directory
    file:
      path: /tmp/etc
      state: absent
    become: yes
  - name: remove an illegal ssl certificate (1)
    shell: bash -c "ls /etc/ssl/certs/*.0 | while read f; do echo -n $f$'\t'; readlink $f; done | grep NetLock | cut -f 1 | xargs -r rm"
    become: yes
  - name: remove an illegal ssl certificate (2)
    shell: rm /etc/ssl/certs/NetLock*
    become: yes
  - name: svn-checkout the directory /etc
    shell:
      cmd: svn co file:///etc/.svn_repo/ /etc
      creates: /etc/.svn
    become: yes
  - name: svn-add all the directory /etc
    shell: svn add *
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/1
    become: yes
  - name: svn-revert some files
    shell: ls *- | xargs -r svn revert
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/1
    become: yes
  - name: svn-commit /etc
    shell: svn ci -m "first commit"
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/1
    become: yes
  - name: svn-update /etc for first commit
    shell: svn up /etc
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/2
    become: yes
  - name: svn-ignore some files
    shell: bash -c "svn propset svn:ignore -F <(svn st | cut -b9-) /etc"
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/2
    become: yes
  - name: svn-commit ignored files
    shell: svn ci -m "setting svn:ignore"
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/2
    become: yes
  - name: svn-update /etc for setting svn:ignore
    shell: svn up
    args:
      chdir: /etc
      creates: /etc/.svn_repo/db/revs/0/3
    become: yes
___

まずは文法チェック。

コントロールノードconstructor:ユーザーansible
ansible-playbook -i inventory.ini playbook.yaml --syntax-check

問題無ければ実行しましょう。

コントロールノードconstructor:ユーザーansible
ansible-playbook -i inventory.ini playbook.yaml

確認

各ゲストマシンにログインして、それぞれログを表示させてみます。

コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.101 svn log /etc
コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.102 svn log /etc
コントロールノードconstructor:ユーザーansible
ssh root@172.16.1.103 svn log /etc
コントロールノードconstructor:ユーザーansible
ssh administrator@172.16.1.104 sudo svn log /etc

それぞれこんな感じで表示されればOKです。

コントロールノードconstructor:ユーザーansible
$ ssh root@172.16.1.101 svn log /etc
------------------------------------------------------------------------
r2 | root | 2024-12-22 09:25:56 +0000 (Sun, 22 Dec 2024) | 1 line

setting svn:ignore
------------------------------------------------------------------------
r1 | root | 2024-12-22 09:20:06 +0000 (Sun, 22 Dec 2024) | 1 line

first commit
------------------------------------------------------------------------

仕舞い

これで/etcをバージョン管理できるようになりました。その手順をAnsibleで自動化し、同じ手作業を4台で繰り返さなくて済むようにしました。

ProxmoxVEでコンテナと仮想マシンの混在環境をAnsibleでまとめて初期設定という事例は、ネット記事でも(日本語では)見かけないようです。皆様の参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?