haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

【自分用】作成物のまとめ(2022/4/12更新)

本記事で行うこと

  • いままで趣味で作成したものを振り返る
  • あくまでも仕事で作成したものは含まない
  • 自分の記録用

モチベーション

  • 今まで趣味でなにを作ったのかをまとめて見たくなったため。
  • 後で見返して、今後の設計に活かすため。

サマリ

ページ内リンク 技術スタック git
自宅kubernetes環境 (rancher/rke2) kubernetes, rancher, rke2, dnsmasq, nginx ingress controller, istio, Longhorn, prometheus, ansible ※非公開repo
https://github.com/n-guitar/private-server-ansible
https://github.com/n-guitar/private-cluster
資産設計シミュレーションWebアプリ Python3, Django3, sqlite, Bootstrap, chartjs2 ※非公開repo
https://github.com/n-guitar/personal_finance
Slack Botで家電操作 Python3, slackbot ※非公開repo
https://github.com/n-guitar/family-bot
家電操作Webアプリ(Flask Nature Remo) Python3, Flask, javascript https://github.com/n-guitar/flask-natuer-remo
Slackもどき (Websocket勉強用) Python3, Django3, Websocket https://github.com/n-guitar/django-webchat/tree/webchat-chat-room-design
家電操作Webアプリ v2 (Vue Nature Remo) vue.js2,vuex3, vuetify2 https://github.com/n-guitar/vue-natuer-remo
家電操作モバイル向けWebアプリ v3 (Vue Nature Remo PWA) vue.js2,vuex3, vuetify2, PWA ※非公開repo
https://github.com/n-guitar/vue-natuer-remo-pwa
ファイルアップローダー (fiber-file-uploader) vue.js2, golang, fiber https://github.com/n-guitar/fiber-file-uploader
Web時計 ランダム英語表示 (english-web-clock) vue.js2, nuxt.js2, Bootstrap4, v-calendar, dayjs ※非公開repo
https://github.com/n-guitar/english-web-clock
container buildツール (build-ops-container) Frontend: vue.js2, nuxt.js2, vuetify
Backend: golang, fiber, sqlite, gorm, img
※非公開repo
https://github.com/n-guitar/build-ops-container-ui
https://github.com/n-guitar/build-ops-container
資産設計シミュレーションWebアプリ (vue.js版, 追加開発中) Frontend: vue2, nuxt.js2, vuetify, apexcharts
Backend: python3, fastapi, pydantic, sqlalchemy
※非公開repo
https://github.com/n-guitar/private_fp_ui
https://github.com/n-guitar/private_fp_api
Web Terminal (プロトタイプ作成, 追加開発中) Frontend: vue.js2, xterm.js
Backend: python3, fastapi, websocket, paramiko
※vue3, typescriptで本格開発予定
※非公開repo

作成物

自宅kubernetes環境 (rancher/rke2)

  • 構成イメージ
    f:id:n-guitar:20220412002853p:plain:w800

  • 利用ステータス
    アプリ実行環境として運用中

  • 技術スタック
    kubernetes, rancher, rke2, dnsmasq, nginx ingress controller, istio, Longhorn, prometheus, ansible

  • 機能・こだわり
    code-serverやjupiter notebookを使うことデプロイしておくことで、低スペックのchromebookからもお風呂で開発できるようになった。
    private registryの許可設定をして、自作containerをpull/runできるようにしている。
    wildcard dns、nginx ingress controllerを利用し、自己証明をPC/iPhoneにインストールすることでurlベースアクセス&tls/sslを実現
    マシンスペック節約のため、軽量なkubernetesディストーションのrke2を採用。
    rancher自体はdockerを利用しているが、rke2ではdockerは利用していない。

  • モチベーション・感想
    Cloudでも良かったのだが、なんとなくお金を払うのが嫌で自宅で基盤を用意することにした。
    実は停電や予期せぬ障害で何度か作成し直していて、最終的に今の軽量なRKE2に落ち着いた。
    自作アプリをすぐに家庭内に展開できるのでそれなりに満足している。
    普通に仕事と同じく、家庭の基盤も障害復旧やメンテナンス、定期バックアップなどの運用している。
    ちなみにUPSを購入し、停電は怖くなくなった。

資産設計シミュレーションWebアプリ

  • 画面イメージ f:id:n-guitar:20220411224201p:plain:w800

  • 利用ステータス
    稼働停止
    後にvue.jsで再作成したため。

  • 機能・こだわり
    プラス資産・マイナス資産と資産推移をグラフで表現し、視覚的にマイナスになってしまうところがすぐに分かるようにしたところ
    chartjsで表示できるように、配列の0埋め、プラス資産の繰越計算結果の配列の作成
    シンプルにするために1テーブルで実現

  • 技術スタック
    Python3, Django3, sqlite, Bootstrap, chartjs2

  • モチベーション・感想
    自分の家庭の資産設計シミュレーションを行いたかったため作成した。
    おそらくこれがDjangoで作成した後にちゃんと使ってた最初のWebアプリケーションだと思う。
    確か会社の(STEP休暇)長期休暇中に

Slack Botで家電操作

  • 画面イメージ
    f:id:n-guitar:20220411230115p:plain:w400

  • 利用ステータス
    稼働停止
    正直あまり使わなかったため。

  • 機能・こだわり
    NatureRemoのApiを、Slack bot経由で実行する。
    正規表現で曖昧な言葉でも反応してくれる。

  • 技術スタック
    Python3, slackbot
    https://github.com/scrapinghub/slackbot

  • モチベーション・感想
    リモートの打ち合わせ中に声を出さずにエアコンや照明をコントロールしたかった。
    かなり簡単に実装できるため、別用の用途でまた使って見るかもしれない。

家電操作Webアプリ(Flask Nature Remo)

  • 画面イメージ

f:id:n-guitar:20220411231618g:plain:w800

  • 利用ステータス
    稼働停止
    後にvue.jsで再作成したため。

  • 技術スタック
    Python3, Flask, javascript

  • 機能・こだわり
    NatureRemoのApiを、Webアプリ経由で実行する。
    Top画面をアップロードして変更できる
    css,Javascript部分はフレームワークを使わず一からすべて書いた。

  • モチベーション・感想
    タブの切り替え部分は苦労したのを覚えているが、こうやって実現しているんだというのがわかった気がする。
    iPadからでも反応するように、window.ontouchstart ? 'touchstart' : 'click';を記載しないと行けないのかということに初めて気がついた。
    CSSを全部書くのはかなり大変だった記憶。

Slackもどき (Websocket勉強用)

  • 画面のイメージ
    f:id:n-guitar:20220411233557p:plain:w800

  • 利用ステータス
    稼働停止
    勉強用のため。

  • 技術スタック
    Python3, Django3, Websocket

  • 機能・こだわり
    任意のチャンネルにメッセージをブロードキャストする。
    django channelsを使わずに実装。

  • モチベーション・感想
    作成当時、djangoがまだ非同期(ASGI)に対応したばかりで、実装例が英語圏のサイトでもほとんどなかったと思う。
    ASGIってそもそも何?からWebsocket仕様まで詳しくなったきっかけだと思う。

家電操作Webアプリ v2 (Vue Nature Remo)

  • 画面のイメージ
    f:id:n-guitar:20220411234959g:plain:w800

  • 利用ステータス
    PWA版と併用して利用中

  • 技術スタック
    vue.js2,vuex3, vuetify2

  • 機能・こだわり
    基本的にはFlask版と同じ機能
    Tokenを起動時ではなく、起動後に画面から設定する方式(LocalStorage or Vuex.Storeに保存)に変更

  • モチベーション・感想
    Flask版では起動時に環境変数として、Tokenの設定が必要であったが画面から設定できるようにしてみた。
    BrowserのCookie、LocalStorageの仕組みについて学んだと思う。
    LocalStorage保存モードはセキュアではないが、家庭内だけ利用ということでOKとし、最低限画面上から削除も同時にできるようにした。
    コンポーネントから設定したTokenを親やその他のコンポーネントから利用する作りであり、createdイベントのときにLocalStorageやstoreからいちいち取得してくる仕様になっている。親で取得して、propsで渡せばよかったと正直思っており作りが微妙・・・。
    この反省は、PWA版の設計に取り入れることとした。

家電操作モバイル向けWebアプリ v3 (Vue Nature Remo PWA)

  • 画面のイメージ

f:id:n-guitar:20220412000401g:plain:w600

  • 利用ステータス
    Web版と併用して利用中

  • 技術スタック
    vue.js2,vuex3, vuetify2, PWA

  • 機能・こだわり
    PWA(Progressive Web Apps)の技術を使い、嫁さんにアプリインストールさせることなく家電操作機能を提供。
    機能はWeb版とほぼ同じだが、一括で照明を消す機能を追加。

  • モチベーション・感想
    アプリインストールなく嫁さんにアプリ機能を提供したかった。
    今でも利用してくれて嬉しい。
    ほぼすべてのアプリは自宅のkubernetes上で稼働しているのだが、kubernetesが障害中でもPWAとして機能していてPWAすげーと思った。
    PWAの実装例が当時あまりなくて、service-workerって何やねんって思ってた。

※ここまで記載

ファイルアップローダー (fiber-file-uploader)

  • 画面のイメージ
    f:id:n-guitar:20220412094000g:plain:w600

  • 利用ステータス
    利用中。

  • 技術スタック
    vuejs2, golang, fiber
    https://github.com/gofiber/fiber

  • 機能・こだわり
    特定のディレクトリに、複数のファイルを同時にアップロードする。

  • モチベーション・感想
    自宅サーバに手元のMacからファイルの移動を行いたかったため。
    golangのfiberのwebフレームワークを使ってみたかったため。
    FlontendからFormで複数同時にfiber側で受け取り方法を模索した気がする。
    fiberがかなり使いやすかったので、後にBackendとしてたまに使うことになる。
    Front画面はvue.js2だがあえて、CDNから持ってきてindex.htmlのみのファイルとした。

Web時計 ランダム英語表示 (english-web-clock)

  • 画面のイメージ
    f:id:n-guitar:20220412095105p:plain:w600

  • 利用ステータス
    利用中。

  • 技術スタック
    vue.js2, nuxt.js2, Bootstrap4, v-calendar, dayjs

  • 機能・こだわり
    時計を表示。
    一定間隔ごとに表示する英文を更新。

  • モチベーション・感想
    nuxt.jsを使ってみたかった。
    手元のタブレットで時間を表示したかった。
    英語を常に見る習慣をつけて置きたかった。
    nuxt.jsはrouterとか設定する必要がなくて便利だなーと思った。
    このとき初めてプラグインやモジュールをどうやってnuxt.jsに追加するかを調べた気がする。

container buildツール (build-ops-container)

  • 画面のイメージ
    f:id:n-guitar:20220412100219p:plain:w600

  • 利用ステータス
    停止中。
    そんなに利用頻度が高くなく、ほぼ使っていないので停止中とした。

  • 技術スタック
    Frontend: vue.js2, nuxt.js2, vuetify
    Backend: golang, fiber, sqlite, gorm, img

  • 機能・こだわり
    FrontendからBackendのAPIを実行し、DBの登録、gitコマンド、imgコマンドを実行する。
    container内部から実行することを想定し、containerないからgit clone&container build&container registry登録を行う。

  • モチベーション・感想
    手元がM1 Mackubernetes環境がIntel環境だったため、M1 Macでbuildしたcontainerイメージをpushしてしまうと、kubernetes上で動作しないため、じゃぁWeb画面でポチッと押すだけでregistryへの登録までやろうというのが発端。
    Racnher付属の機能でbuild機能があるのだが、rancher.yamlなるものをgithubに登録したくなかったので作成。
    Jenkins等使おうと思ったが、使う機能は限られているので、作って見ようと思った。
    alpine linux containerからprivate registryにpushするまでそこそこハマった気がする。
    imgを使った理由はdockerをalpineかにdocker in dockerみたいな感じでインストールしたくなかった。
    golang経由でdbを更新するのを久しぶりに行った気がする。
    gormを使うことで、起動時にtableを作成してくれるのは便利だなーと思った記憶がある。

資産設計シミュレーションWebアプリ (vue.js版, 追加開発中)

  • 画面のイメージ

f:id:n-guitar:20220412103620p:plain:w600

f:id:n-guitar:20220412102953p:plain:w600

  • 利用ステータス
    利用中。
    追加開発中。

  • 技術スタック
    Frontend: vue2, nuxt.js2, vuetify, apexcharts
    Backend: python3, fastapi, pydantic, sqlalchemy

  • 機能・こだわり
    基本機能はDjango版と同じ。
    グラフ上のクリックイベントを拾って右側に詳細を表示する。

  • モチベーション・感想
    fastapiの公式チュートリアルをAdvancedも含めて一度全部やってみたのだが、かなり使いやすくメインのBackendではfastapiにしようとなり、とりあえず開発してみようと思ったのがきっかけ。
    Djangoよりかっこよくしたかったのだけれども、あまりかっこよくならなくてUIの難しさも知った気がする。(デザイナーってすごい)
    chartjs→apexchartsに変更している。これはchartjsがnuxt.jsでうまく動作しなかったからに起因する。
    gitのissue上で、対応が間に合っていないのを知り、OSSの資金面・開発斜面での難しさを思い知った。
    jsの世界で貢献できる余裕がなく・・・申し訳ない気持ちになった。

Web Terminal (プロトタイプ作成, 追加開発中)

  • 画面のイメージ

f:id:n-guitar:20220412105449p:plain:w600

  • 利用ステータス
    開発中。

  • 技術スタック
    Frontend: vue.js2, xterm.js
    Backend: python3, fastapi, websocket, paramiko
    このタイミングでvue3, typescriptに置き換えを検討中。

  • 機能・こだわり
    web browserでserverにssh接続し、対話型で操作する。

  • モチベーション・感想
    Frontend(websocket) → Backend(websocket) → ssh → serverで処理する部分が結構ハマった。
    そうしても、sshの部分でsocket通信の部分でblockingしてしまい、コマンド結果を正しく画面に返せなかった。
    このblocking部分をどうやって突破するか一週間位かかったと思う。
    最終的に、threading + asyncioで突破することができたけど、ここまで来るのが長かった。
    実はtornadoで実装している例はgithub上に行く使ったが、絶対に使わずいこうと決めていた。
    実はこれを開発するために、websocketを学んでいた部分はある。
    メイン機能の実装ができたので、今後このアプリをメインに開発していく。

その他画面なし

JOB実行ツール

任意のコマンドをWeb上からリモートで実行するツール。
Python, Django, paramikoで実装。
kubernetesのcronjobで十分だったため、ボツ

読み方登録

用語の読み方、意味を登録・投票するwebアプリケーション
Python, Django,実装。
vueかreactで作り直すかもしれない。

感想

  • 2022/4/12時点の感想
    golang, python, javascript, java, Django, flask, fastapi, SpringBoot, Fiber, vue.js, react.js, nuxt.jsあたりを主に個人開発で使ってきたが、現時点ではnuxt.js + fastapiが最も早く開発ができそう。
    react.jsはhooksが出てきてから開発しやすくなったが、基本的に複雑な処理はBackendに寄せる方針なので、JSX記法の恩恵をあまり受けないなぁという印象のためvue.jsをメインとした。
    現時点の仕事では、インフラディレクション業務やSRE的な業務、マネジメント系が多いので、FrontendもBackendも書くことがほぼ0ではあるが、結果的に仕事にも活用できている。
    単純に自分や家庭で使うものを開発して、それを活用もしているのでテクノロジーで便利になっているのを実感できてとても楽しい。

【RKE2/rancher2.6.1】rancherからRKE2クラスターを構築する(Tech Preview - RKE2 Cluster Provisioning)

本記事で行うこと

  • rancherからRKE2クラスターを構築する ※ Tech Preview であることに注意してください。

本記事で行わないこと

  • rancherの構築 ※rancherの構築は以下を参照ください。

n-guitar.hatenablog.com

モチベーション

  • 自宅サーバが増えたので、single構成だったk3sからControlPlane、Worker、rancher、dns serverの4台構成で、改めてkubernetes環境を作りたかったため。
  • せっかくなのでRKE2を使ってみたかったため。

環境

  • 基本構成は以下の通り。
種別 HW OS CPU MEM
DNS raspberry pi 3 model b+ Ubuntu 20.04.3 LTS Cortex-A53 4コア 1GB
rancher server (2.6.1) GMK NucBox Ubuntu 20.04.3 LTS IntelJ4125 4コア 8GB
control plane, etcd, worker GMK NucBox Ubuntu 20.04.3 LTS IntelJ4125 4コア 8GB
worker nuc 11世代 (NUC11PABi3) Ubuntu 20.04.3 LTS Core i3-1115G4 2コア(4スレッド) 32GB(カスタマイズ)

RKE2とは

アーキテクチャ

f:id:n-guitar:20211017180919p:plain:w600

  • くわえて、rancher側のアーキテクチャが以下の通りで、RKE2側にrancherと通信するCluster AgentのPodがデプロイされます。
  • このCluster AgentからrancherのDNSを引ける必要があるので注意が必要です。

f:id:n-guitar:20211017181236p:plain:w600

  • 詳しくは公式ドキュメントを参照ください。

RKE2 - Rancher's Next Generation Kubernetes Distribution

rancherからRKE2クラスターの雛形作成

  • rancherの画面からRKE2クラスターの雛形を作ります

  • 左上のハンバーガーメニューから GLOBAL APPSCluster Managementを選択し、Createします。

f:id:n-guitar:20211017175849p:plain:w600

  • RKE2/K3sのtoggleを選択すると、Use existing nodes and create a cluster using RKE2/K3sのTech Previewが選択できるようになります。
  • Customを選択します。

f:id:n-guitar:20211017180027p:plain:w600

Cluster Configuration
  • Clusterの初期設定をします。
Basics
  • RKE2のバージョン、NWプラグイン、セキュリティを選択します。
  • NWプラグインはcanalを使いたいのでcanalにします。
  • CISは使ってみたいので、v1.6を選択します。
  • System Servicesはすべて利用したいのでデフォルトとします。

f:id:n-guitar:20211017180333p:plain:w600

  • 追記
  • CISの基準を満たしていないと、Cluster Provisioningに失敗します。
  • なのでCISをOFFにしてProvisioningします。

f:id:n-guitar:20211017200931p:plain:w600

  • NWプラグインについては以下のブログがわかりやすいです。

Comparing Kubernetes Networking Providers

  • CIS v1.6については以下を参照ください。

CIS 1.6 Self-Assessment Guide - RKE2 - Rancher's Next Generation Kubernetes Distribution

  • Basicsはそれぞれ、以下の選択肢を選べます。

f:id:n-guitar:20211017180400p:plain:w400 f:id:n-guitar:20211017180415p:plain:w400 f:id:n-guitar:20211017180429p:plain:w400 f:id:n-guitar:20211017180449p:plain:w400

Member Roles
  • デフォルトとしますが、rancher側でユーザを作成してClusterへのアクセスレベルを設定できます。

f:id:n-guitar:20211017180714p:plain:w600

Add-On Config
  • デフォルトとします

f:id:n-guitar:20211017181702p:plain:w600

Agent Environment Vars
  • デフォルトとします

f:id:n-guitar:20211017181728p:plain:w600

etcd
  • デフォルトとします
  • ここでetcdのバックアップ世代、時間を選択できますが、後から変更可能です。

f:id:n-guitar:20211017181806p:plain:w600

Labels & Annotations
  • デフォルトとします

f:id:n-guitar:20211017181909p:plain:w600

Networking
  • デフォルトとします

f:id:n-guitar:20211017182044p:plain:w600

Registries
  • デフォルトとします
  • Pull images for Rancher from public DockerHub

f:id:n-guitar:20211017182102p:plain:w600

Upgrade Strategy
  • デフォルトとします

f:id:n-guitar:20211017182235p:plain:w600

Advanced
  • デフォルトとします

f:id:n-guitar:20211017182254p:plain:w600

RKE2クラスターのプロビジョニング

  • 雛形が完成していれば以下の通りになっています。

f:id:n-guitar:20211017192811p:plain:w600

クラスターへの追加

  • クラスター名を選択して、Registrationを開きます。
  • Node Roleにチェックをします。
  • 今回は自己証明書を利用しているのでInsecure: Select this to skip TLS verification if your server has a self-signed certificate.にチェックを入れます。
  • 出来上がったコマンドをコピーして、それぞれ参加させたいOS上で実行します。

f:id:n-guitar:20211017193714p:plain:w600

  • Provisioning状態でしばらく待ちます。

f:id:n-guitar:20211017194703p:plain:w600

  • 10~20分くらいすれば以下のようにActiveになります。
  • EXPLORE CLUSTERから構築した、Clusterが有効化されていれば完了です。

f:id:n-guitar:20211017205909p:plain:w600

f:id:n-guitar:20211017205937p:plain:w600

f:id:n-guitar:20211017210059p:plain:w600

  • 最終的にworkerを加えて以下になりました。
  • この環境を今後、自宅のアプリの実行基盤として利用していきます。

f:id:n-guitar:20211017222917p:plain:w600

うまく行かないとき
  • Provisioning状態からActiveにならないときの確認方法です。
RKE2プロセスの起動確認
  • RKE2プロセスはsystemdで起動されているのでstatusを見ます。
# Control Planeの場合
$ sudo systemctl status rke2-server.service

# Workerの場合
$ sudo systemctl status rke2-agent.service
RKE2プロセスのログ確認
# Control Planeの場合
$ sudo journalctl -u rke2-server -f

# Workerの場合
$ sudo journalctl -u rke2-agent -f
kubernetesリソースの確認
  • rke2のデプロイはうまく行っているが、rancherと疎通できないときはkubectlでdeploymentの状態を確認します。
  • cattle-system namespaceのリソースがうまく起動できていないときは、なにかエラーが発生しています。
$ sudo export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
$ sudo kubectl get nodes
NAME             STATUS   ROLES                              AGE   VERSION
nucbox-002-hkm   Ready    control-plane,etcd,master,worker   40m   v1.21.5+rke2r2

$ sudo kubectl  kubectl get all -n cattle-system
NAME                                             READY   STATUS    RESTARTS   AGE
pod/cattle-cluster-agent-78767b885c-5ttn8        1/1     Running   5          38m
pod/system-upgrade-controller-679575c7b4-7j8vv   1/1     Running   0          17m

NAME                           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
service/cattle-cluster-agent   ClusterIP   10.43.57.9   <none>        80/TCP,443/TCP   42m

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cattle-cluster-agent        1/1     1            1           42m
deployment.apps/system-upgrade-controller   1/1     1            1           17m

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/cattle-cluster-agent-75979cf449        0         0         0       41m
replicaset.apps/cattle-cluster-agent-78767b885c        1         1         1       38m
replicaset.apps/system-upgrade-controller-679575c7b4   1         1         1       17m
 

$ sudo kubectl logs cattle-cluster-agent-78767b885c-5ttn8 -n cattle-system

後書き

  • スペックのいいマシンでVM環境を作っても良かったのですが、消費電力と設置場所が小さい事という自分の要件があり、mini pcで自宅環境を整えました。
  • DNS serverをubuntuからうまく見れなくて少しハマりました。。。
  • また、Clusterの設定内容によってはデプロイが失敗することもあり、エラーを取り除くのにも数時間かかってしまいました。。
  • もともとk3s環境で作った環境をすべて削除して今回のRKE2環境に作り直すので、しばらく掛かりそう・・・です。
  • まずprivate registry環境を作るところから初めて、その後build環境を整えます。

  • 以上、rancherからRKE2クラスターを構築する(Tech Preview - RKE2 Cluster Provisioning)でした。

【rancher:2.6.1/docker】dockerを使用して単一ノードにRancherをインストールする(自己証明書とデータの永続化とバックアップ)

本記事で行うこと

  • dockerを使用して単一ノードにRancherをインストールする
  • 自己証明書を使って、Rancherをインストールする
  • rancherのデータの永続化を行う
  • rancherのデータのバックアップとリストアを行い

本記事で行わないこと

  • 自己証明書の発行 ※以下記事で実施しています。

【OpenSSL(LibreSSL)】OpenSSL(LibreSSL)を利用して自己証明書の作成(pem形式) - haku-maiのブログ

モチベーション

  • k3s上にhelmでrancherをdeployし使っていたが、自宅サーバが増えたので、別serverに分離したかった。
  • rancher2.6が出たので、使ってみたかった。

環境

  • HW GMKTEC NucBox 以下参考です。

n-guitar.hatenablog.com

$ cat /etc/os-release |grep VERSION
VERSION="20.04.3 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal

参考サイト

  • 公式マニュアル

rancher.com

  • 自己証明書を利用してインストール

Rancher Docs: Installing Rancher on a Single Node Using Docker

  • データの永続化

Rancher Docs: Advanced Options for Docker Installs

dockerでrancherを起動、自己証明書、データの永続化

  • 以下のように実行するだけです。

  • 各証明書は適当なディレクトリに配置し、/etc/rancher/ssl/にbindさせてください。

  • また中間証明書がない場合は、cert.pemcacert.pemは同じで大丈夫です。
  • データの永続化をする場合はcontainerの/var/lib/rancherをホストOS側にbindすればOKです。
docker run -d --restart=unless-stopped \
  --name rancher-hkm \
  --hostname rancher-hkm \
  -p 80:80 -p 443:443 \
  -v /var/lib/cert_directory/rancher.hkm.home/cert.pem:/etc/rancher/ssl/cert.pem \
  -v /var/lib/cert_directory/rancher.hkm.home/key.pem:/etc/rancher/ssl/key.pem \
  -v /var/lib/cert_directory/rancher.hkm.home/cert.pem:/etc/rancher/ssl/cacerts.pem \
  -v /var/lib/rancher:/var/lib/rancher \
  --privileged \
  rancher/rancher:v2.6.1

webアクセス

f:id:n-guitar:20211013184355p:plain:w600

  • 以下のように作成した自己証明書をmacにインストールすればでなくなります。

f:id:n-guitar:20211013184440p:plain:w600 f:id:n-guitar:20211013184459p:plain:w600

  • 初回ログイン時は、以下のように初期パスワードを必要とします。
  • 画面に従って、logから抽出しログインします。

f:id:n-guitar:20211013184536p:plain:w600

$ docker logs rancher-hkm 2>&1 | grep "Bootstrap Password:"
2021/10/13 09:33:13 [INFO] Bootstrap Password: XXXXXXX
  • その後、以下のようにパスワードを設定することで、次回からid:admin、PASSWORD:設定したパスワードでログインできるようになります。 f:id:n-guitar:20211013184640p:plain:w600

  • ログイン画面になります。

f:id:n-guitar:20211017121650p:plain:w600

バックアップとリストア

  • バックアップを行うには、rancherを停止して、/var/lib/rancherを保存していけば問題ありません。

バックアップのテスト用のdeployment作成

  • リストアできるか試したいため、簡易的に画面からdeploymentを作成します。

  • 左上のハンバーガーメニューから、EXPLORE CLUSTERのlocalを選択

f:id:n-guitar:20211017133935p:plain:w600

  • Workload -> Deploymentsの画面から、右上のCreateを選択

f:id:n-guitar:20211017134044p:plain:w600

  • NameとContainer Inageだけ設定してCreateします。

f:id:n-guitar:20211017134218p:plain:w600

  • backupでフィルターすると以下の状態です。

f:id:n-guitar:20211017134316p:plain:w600

rancherの停止とバックアップ

  • rancherを停止し、/var/lib/rancherのバックアップをします
rancherの停止
  • 以下のコマンドでdocker Containerを停止します。
$ docker ps --filter name=rancher-hkm
CONTAINER ID   IMAGE                    COMMAND           CREATED       STATUS       PORTS                                                                      NAMES
05f3a1f54ae7   rancher/rancher:v2.6.1   "entrypoint.sh"   2 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   rancher-hkm

$ docker stop rancher-hkm
rancher-hkm

$ docker ps --filter name=rancher-hkm
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

$ docker ps -a --filter name=rancher-hkm
CONTAINER ID   IMAGE                    COMMAND           CREATED       STATUS                     PORTS     NAMES
05f3a1f54ae7   rancher/rancher:v2.6.1   "entrypoint.sh"   2 hours ago   Exited (1) 6 seconds ago             rancher-hkm
/var/lib/rancherのバックアップ
  • tarで/var/lib/rancherを別ディレクトリに固めます。

  • 初期状態

$ ls -l /var/lib/rancher/
合計 1464
drwxr-xr-x 5 root root    4096 10月 17 01:21 k3s
-rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log
drwx------ 6 root root    4096 10月 17 01:28 management-state
  • 他のストレージにバックアップすべきですが簡易的にバックアップ用のディレクト/var/lib/rancher_backupを作成します。
  • /var/lib/rancher_backupにバックアップファイルを格納します
$ sudo mkdir /var/lib/rancher_backup
$ ls -l /var/lib/rancher_backup
合計 0
$ sudo tar -C /var/lib/rancher -pzcvf /var/lib/rancher_backup/rancher_backup_$(date +%Y%m%d%H%M%S).tar.gz ./

$ ls -lh /var/lib/rancher_backup
合計 426M
-rw-r--r-- 1 root root 426M 10月 17 14:37 rancher_backup_20211017143633.tar.gz

/var/lib/rancherの削除とリストア

/var/lib/rancherの削除
  • 少し怖いですがバックアップをとったので/var/lib/rancherを綺麗サッパリ削除します。
$ ls -l /var/lib/rancher
合計 1464
drwxr-xr-x 5 root root    4096 10月 17 01:21 k3s
-rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log
drwx------ 6 root root    4096 10月 17 01:28 management-state

$ sudo rm -rf /var/lib/rancher/*
$ ls -l /var/lib/rancher
合計 0
/var/lib/rancherのリストア
  • 取得したバックアップファイルを/var/lib/rancherに戻します。
$ ls -lh /var/lib/rancher_backup
合計 426M
-rw-r--r-- 1 root root 426M 10月 17 14:28 rancher_backup_20211017143633.tar.gz


$ sudo tar -pzxvf /var/lib/rancher_backup/rancher_backup_20211017143633.tar.gz -C /var/lib/rancher

$ ls -l /var/lib/rancher
合計 1460
drwxr-xr-x 5 root root    4096 10月 17 01:21 k3s
-rw-r--r-- 1 root root 1486050 10月 17 13:48 k3s.log
drwx------ 6 root root    4096 10月 17 01:28 management-state

rancherの起動と確認

  • 以下のコマンドでdocker Containerを起動します。
$ docker start rancher-hkm
rancher-hkm

$ docker ps --filter name=rancher-hkm
CONTAINER ID   IMAGE                    COMMAND           CREATED       STATUS          PORTS                                                                      NAMES
05f3a1f54ae7   rancher/rancher:v2.6.1   "entrypoint.sh"   3 hours ago   Up 16 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   rancher-hkm
  • 起動したら画面から先程、確認用に用意したdeploymentを確認します。
  • 問題なくバックアップできていますね!

f:id:n-guitar:20211017144203p:plain:w600

  • 以上、dockerを使用して単一ノードにRancherをインストールする(自己証明書とデータの永続化とバックアップ)でした。

【ansible/awx:19.4.0】ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールする

本記事で行うこと

  • ubuntu:20.04.2にansible awxをバージョン指定で19.4.0をdockerでインストールし、ログインまで行う

本記事で行わないこと

  • docker/docker composeのインストール
  • python3のインストール
  • gitのインストール
  • ansible のインストール

モチベーション

  • RKE2の検証時に、自宅サーバ設定を何度もやり直すことになり手動が面倒になったため。
  • awxを数年ぶりに触って見たくなったため。

環境

$ cat /etc/os-release |grep VERSION
VERSION="20.04.3 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
  • docker/docker-compose
$ docker --version
Docker version 20.10.7, build f0df350

$ docker-compose --version
docker-compose version 1.26.0, build d4451659
$ python3 --version
Python 3.8.10
  • ansible
$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/haku-mai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.10 (default, Sep 28 2021, 16:10:42) [GCC 9.3.0]

参考サイト

github.com

  • dockerを利用したawxのインストール手順

awx/README.md at devel · ansible/awx · GitHub

前提条件

  • docker/docker-composeがインストールされていること
  • python3がインストールされていること
  • gitがインストールされていること
  • ansibleがインストールされていること

git clone

  • まずAWXのモジュールを持ってきます。
  • 最新のHEADは安定していないので、Brunch指定でcloneします。
  • 2021/10/15時点の最新は以下ですので、本記事は以下のバージョンを利用します。

Release 19.4.0 · ansible/awx · GitHub

$ git clone -b 19.4.0 https://github.com/ansible/awx.git
cd awx/
$ ls -l
合計 140
-rw-rw-r--  1 haku-mai haku-mai  2556 10月 15 09:21 API_STANDARDS.md
-rw-rw-r--  1 haku-mai haku-mai   303 10月 15 09:21 CHANGELOG.md
-rw-rw-r--  1 haku-mai haku-mai  9149 10月 15 09:21 CONTRIBUTING.md
-rw-rw-r--  1 haku-mai haku-mai   385 10月 15 09:21 DATA_MIGRATION.md
-rw-rw-r--  1 haku-mai haku-mai  1620 10月 15 09:21 DCO_1_1.md
-rw-rw-r--  1 haku-mai haku-mai  2265 10月 15 09:21 INSTALL.md
-rw-rw-r--  1 haku-mai haku-mai  5137 10月 15 09:21 ISSUES.md
-rw-rw-r--  1 haku-mai haku-mai  9304 10月 15 09:21 LICENSE.md
-rw-rw-r--  1 haku-mai haku-mai  1095 10月 15 09:21 MANIFEST.in
-rw-rw-r--  1 haku-mai haku-mai 19736 10月 15 09:21 Makefile
-rw-rw-r--  1 haku-mai haku-mai  3240 10月 15 09:21 README.md
-rw-rw-r--  1 haku-mai haku-mai     7 10月 15 09:21 VERSION
drwxrwxr-x 12 haku-mai haku-mai  4096 10月 15 09:21 awx
drwxrwxr-x  8 haku-mai haku-mai  4096 10月 15 09:21 awx_collection
drwxrwxr-x  4 haku-mai haku-mai  4096 10月 15 09:21 awxkit
drwxrwxr-x  2 haku-mai haku-mai  4096 10月 15 09:21 config
drwxrwxr-x 10 haku-mai haku-mai  4096 10月 15 09:21 docs
-rwxrwxr-x  1 haku-mai haku-mai   149 10月 15 09:21 manage.py
-rwxrwxr-x  1 haku-mai haku-mai   265 10月 15 09:21 pre-commit.sh
-rw-rw-r--  1 haku-mai haku-mai   103 10月 15 09:21 pyproject.toml
-rw-rw-r--  1 haku-mai haku-mai   521 10月 15 09:21 pytest.ini
drwxrwxr-x  2 haku-mai haku-mai  4096 10月 15 09:21 requirements
-rwxrwxr-x  1 haku-mai haku-mai  5700 10月 15 09:21 setup.py
drwxrwxr-x 13 haku-mai haku-mai  4096 10月 15 09:21 tools
-rw-rw-r--  1 haku-mai haku-mai   313 10月 15 09:21 tox.ini

docker imageの作成

  • makeコマンドで作成します。
# バージョン固定
$ export DEVEL_IMAGE_NAME=quay.io/awx/awx_devel:19.4.0

# Makefileがあるディレクトリで
$ ls -l Makefile
-rw-rw-r-- 1 haku-mai haku-mai 19736 10月 15 09:21 Makefile

$ make docker-compose-build

$ docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
quay.io/awx/awx_devel         19.4.0    c5566c6146d9   6 minutes ago   2.09GB
  • 余談ですが実際にはMakefileには以下のように記載されていて、これを実行しているだけです。
# Base development image build
docker-compose-build:
    ansible-playbook tools/ansible/dockerfile.yml -e build_dev=True
    DOCKER_BUILDKIT=1 docker build -t $(DEVEL_IMAGE_NAME) \
        --build-arg BUILDKIT_INLINE_CACHE=1 \
        --cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .

awxの実行

テスト実行

  • makefileを見るとテストコマンドがあったので一度実行します。
$ COMPOSE_TAG=19.4.0 make docker-compose-runtest
  • すべてPASSEDになったため実行します

  • ※このタイミングで他のdocker imagesがpullされます。

$ docker images
REPOSITORY                          TAG       IMAGE ID       CREATED        SIZE
quay.io/awx/awx_devel               19.4.0    c5566c6146d9   13 hours ago   2.09GB
postgres                            12        fd694ed1533c   3 days ago     371MB
redis                               latest    7faaec683238   3 days ago     113MB
quay.io/project-receptor/receptor   latest    ac55a9332b22   3 months ago   313MB

実行

  • バージョン指定、デタッチドモードで起動しますが、マニュアル通り19.4.0で実行すると怒られます。
$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose
make: *** 'docker-compose' に必要なターゲット 'docker-auth' を make するルールがありません.  中止.
  • これはMakefileからdocker-authが削除されているにも関わらず、コマンドの引数として設定されているからになります。
  • 2021/10/15時点では以下のcommitで修正されていますが、このときの最新のtagの19.4.0にはこの修正が含まれていません。

Fix docker-compose targets · ansible/awx@57c9b14 · GitHub

  • Makefileを修正して再実行します。
  • docker-auth部分を削除します。

Makefileの修正

docker-compose: docker-auth awx/projects docker-compose-sources
        docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans
# ↓
docker-compose: awx/projects docker-compose-sources
        docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans

再実行

$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose

$ docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                                                                                                                                                                                                     NAMES
782c9236f1ec   quay.io/awx/awx_devel:devel                "/entrypoint.sh rece…"   5 minutes ago    Up 5 minutes    22/tcp, 8013/tcp, 8043/tcp, 8080/tcp                                                                                                                                                                                                                                                                                                      tools_receptor_1
b22a5a71fc92   quay.io/awx/awx_devel:devel                "/entrypoint.sh rece…"   5 minutes ago    Up 5 minutes    22/tcp, 8013/tcp, 8043/tcp, 8080/tcp                                                                                                                                                                                                                                                                                                      tools_receptor_2
51d0fd4cfa94   quay.io/project-receptor/receptor:latest   "/usr/bin/dumb-init …"   5 minutes ago    Up 5 minutes    0.0.0.0:5555->5555/tcp, :::5555->5555/tcp, 7323/tcp                                                                                                                                                                                                                                                                                       tools_receptor_hop
832940d3fc45   quay.io/awx/awx_devel:19.4.0               "/entrypoint.sh laun…"   5 minutes ago    Up 5 minutes    0.0.0.0:2222->2222/tcp, :::2222->2222/tcp, 0.0.0.0:6899->6899/tcp, :::6899->6899/tcp, 0.0.0.0:7899-7999->7899-7999/tcp, :::7899-7999->7899-7999/tcp, 0.0.0.0:8013->8013/tcp, :::8013->8013/tcp, 0.0.0.0:8043->8043/tcp, :::8043->8043/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp   tools_awx_1
3bc2e00c9029   postgres:12                                "docker-entrypoint.s…"   27 minutes ago   Up 27 minutes   5432/tcp                                                                                                                                                                                                                                                                                                                                  tools_postgres_1
05398afb1d6b   redis:latest                               "redis-server /usr/l…"   27 minutes ago   Up 27 minutes   6379/tcp                                                                                                                                                                                                                                                                                                                                  tools_redis_1

UIをクリーンアップして構築する

  • UIを利用できるように以下コマンドを実行します。
$ docker exec tools_awx_1 make clean-ui ui-devel

*ここまで完了したら、webアクセスできます。 * 証明書がないためブラウザによっては、アクセス拒否されて、400エラーになったりします。 * 私はsafafiで接続しました。

https://XXXXXXXX:8043/#/login

  • httpはこちら

https://XXXXXXXX:8013/#/login

  • むちゃくちゃ・・・ダサい!!!
  • 昔は中二感あったロゴだったはずなのですが・・・

f:id:n-guitar:20211015114318p:plain

管理ユーザの作成

  • ログイン用の管理ユーザを作成します。
$ docker exec -ti tools_awx_1 awx-manage createsuperuser

Username (leave blank to use 'awx'): haku-mai
Email address:
Password:
Password (again):
Superuser created successfully.
  • 作成したユーザでログインします。
  • アイコンダサすぎないですか?

f:id:n-guitar:20211015114815p:plain:w600

ロゴの変更

  • あまりにもロゴがダサいで変更します。
  • ちゃんと変更機能がありました。

f:id:n-guitar:20211015115228p:plain:w600 f:id:n-guitar:20211015115344p:plain:w600 f:id:n-guitar:20211015115610p:plain:w600

  • とても残念なことに、認証画面しか変わりませんでした・・・
  • なんか3週くらいして、かっこよく見えてきたのでもうこれで良しとします。

f:id:n-guitar:20211015115654p:plain:w600 f:id:n-guitar:20211015115733p:plain:w600

*正直UIが数年前と結構変わっていて、少し検証が必要です。

サーバにpingするまで

guthub repoの作成

  • 適当なrepoを作成し、サンプルでplaybookを作ります。
---
- name: sample
  hosts: nucbox-002-hkm
  gather_facts: no
  collections:
    - ansible.builtin
  tasks:
    - name: 疎通チェック
      ping:

トークンの作成

  • Settings -> Developer settings -> personal access tokens から作成します。
  • repoの読み取りのみで問題ありません。
  • ここで取得したトークンを認証情報で設定します。
  • ※このトークンは絶対に外部に流出させないように!

f:id:n-guitar:20211015194700p:plain:w400

f:id:n-guitar:20211015194840p:plain:w600

認証情報の登録

github
  • GitHub パーソナルアクセストークンと記載されていますが、これは使いません。罠です。

f:id:n-guitar:20211015194235p:plain:w600

  • ソースコントロールが正解。少しハマりました。

f:id:n-guitar:20211015195243p:plain:w600

OSログイン情報
  • テストなのでパスワード認証にしてきます。
  • SSH公開鍵認証が良いと思います。

f:id:n-guitar:20211015205529p:plain:w600

プロジェクトの登録

  • プロジェクトというのは論理的なplaybookのコレクションみたいなもので、今回はgitrepoにあるplaybookをひっぱてくる場所みたいなものです。
  • 登録後、成功になっていればOKです。

f:id:n-guitar:20211015195504p:plain:w600

f:id:n-guitar:20211015203002p:plain:w600

インベントリーの登録

  • インベントリーを作り、ホストを登録していきます。

f:id:n-guitar:20211015205730p:plain:w600 f:id:n-guitar:20211015210001p:plain:w600 f:id:n-guitar:20211015211434p:plain:w600

ホストの登録
  • ホスト名をgithubに登録したhosts: nucbox-002-hkmに合わせます。

f:id:n-guitar:20211015211517p:plain:w600

---
ansible_host: 192.168.XXX.XXX

f:id:n-guitar:20211015211607p:plain:w600

テスト実行

f:id:n-guitar:20211015211836p:plain:w600 f:id:n-guitar:20211015211930p:plain:w600 f:id:n-guitar:20211015215315p:plain:w600 f:id:n-guitar:20211015215336p:plain:w600 f:id:n-guitar:20211015221405p:plain:w600

  • 問題なく実行できました。

f:id:n-guitar:20211015221447p:plain:w600

テンプレートの作成

  • github repoに作成したplaybookを実行します。
  • 追加から新規ジョブテンプレートの追加

f:id:n-guitar:20211015203106p:plain:w600

  • JOB名、インベントリー、プロジェクト、実行環境、Playbook、認証情報を選択します。
  • Playbookはgithubからcloneした値が出てきます。

f:id:n-guitar:20211015221939p:plain:w600

  • 保存して、起動を押します。

f:id:n-guitar:20211015222002p:plain:w600

  • 無事pingが成功しました。

f:id:n-guitar:20211015223939p:plain:w600

  • 以上ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールするでした。

余談

以前のバージョンについて

  • 以前のバージョンは中二感丸出しのロゴが使われてました。
  • これから

f:id:n-guitar:20211015225523p:plain:w400

  • これになったので超びっくりしました。

f:id:n-guitar:20211015225745p:plain:w400

  • ui_nextという形でAWX 16.0.0 から変更になったようです。
  • 前のほうが好きだったけど、この謎のキャラクタを好きになろうと思います。

2020年のAWXの世界を少しだけ覗いちゃう - 赤帽エンジニアブログ

docker-compose.yamlについて

  • 実行するdocker-compose.yamlは少し微妙です。
  • バージョン指定したのに、awx/awx_devel:devel箇所があります。
  • 修正して実行しても良かったのですが、まぁいいかなと割り切りました。
$ cat  tools/docker-compose/_sources/docker-compose.yml
---
version: '2.1'
services:
        # Primary AWX Development Container
  awx_1:
    user: "1000"
    image: "quay.io/awx/awx_devel:19.4.0"
    container_name: tools_awx_1
    hostname: awx_1
    command: launch_awx.sh
    environment:
      OS: " Operating System: Ubuntu 20.04.3 LTS"
      SDB_HOST: 0.0.0.0
      SDB_PORT: 7899
      AWX_GROUP_QUEUES: tower
      MAIN_NODE_TYPE: "${MAIN_NODE_TYPE:-hybrid}"
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
      RUN_MIGRATIONS: 1
    links:
      - postgres
      - redis_1
    working_dir: "/awx_devel"
    volumes:
      - "../../../:/awx_devel"
      - "../../docker-compose/supervisor.conf:/etc/supervisord.conf"
      - "../../docker-compose/_sources/database.py:/etc/tower/conf.d/database.py"
      - "../../docker-compose/_sources/websocket_secret.py:/etc/tower/conf.d/websocket_secret.py"
      - "../../docker-compose/_sources/local_settings.py:/etc/tower/conf.d/local_settings.py"
      - "../../docker-compose/_sources/SECRET_KEY:/etc/tower/SECRET_KEY"
      - "../../docker-compose/_sources/receptor/receptor-awx-1.conf:/etc/receptor/receptor.conf"
      # - "../../docker-compose/_sources/certs:/etc/receptor/certs"  # TODO: optionally generate certs
      - "/sys/fs/cgroup:/sys/fs/cgroup"
      - "~/.kube/config:/var/lib/awx/.kube/config"
      - "redis_socket_1:/var/run/redis/:rw"
    privileged: true
    tty: true
    ports:
      - "7899-7999:7899-7999"  # sdb-listen
      - "6899:6899"
      - "8080:8080"  # unused but mapped for debugging
      - "8888:8888"  # jupyter notebook
      - "8013:8013"  # http
      - "8043:8043"  # https
      - "2222:2222"  # receptor foo node
  redis_1:
    image: redis:latest
    container_name: tools_redis_1
    volumes:
      - "../../redis/redis.conf:/usr/local/etc/redis/redis.conf"
      - "redis_socket_1:/var/run/redis/:rw"
    entrypoint: ["redis-server"]
    command: ["/usr/local/etc/redis/redis.conf"]
  # A useful container that simply passes through log messages to the console
  # helpful for testing awx/tower logging
  # logstash:
  #   build:
  #     context: ./docker-compose
  #     dockerfile: Dockerfile-logstash
  postgres:
    image: postgres:12
    container_name: tools_postgres_1
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_USER: awx
      POSTGRES_DB: awx
      POSTGRES_PASSWORD: vEUithzhAYIeRdMQGfVI
    volumes:
      - "awx_db:/var/lib/postgresql/data"
  receptor-hop:
    image: quay.io/project-receptor/receptor:latest
    user: root
    container_name: tools_receptor_hop
    hostname: receptor-hop
    command: 'receptor --config /etc/receptor/receptor.conf'
    links:
      - awx_1
    ports:
      - "5555:5555"
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-hop.conf:/etc/receptor/receptor.conf"
  receptor-1:
    image: quay.io/awx/awx_devel:devel
    user: "1000"
    container_name: tools_receptor_1
    hostname: receptor-1
    command: 'receptor --config /etc/receptor/receptor.conf'
    environment:
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
    links:
      - receptor-hop
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-worker-1.conf:/etc/receptor/receptor.conf"
      - "/sys/fs/cgroup:/sys/fs/cgroup"
    privileged: true
  receptor-2:
    image: quay.io/awx/awx_devel:devel
    user: "1000"
    container_name: tools_receptor_2
    hostname: receptor-2
    command: 'receptor --config /etc/receptor/receptor.conf'
    environment:
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
    links:
      - receptor-hop
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-worker-2.conf:/etc/receptor/receptor.conf"
      - "/sys/fs/cgroup:/sys/fs/cgroup"
    privileged: true

volumes:
  awx_db:
    name: tools_awx_db
  redis_socket_1:
    name: tools_redis_socket_1

【OpenSSL(LibreSSL)】OpenSSL(LibreSSL)を利用して自己証明書の作成(pem形式)

f:id:n-guitar:20211013235036p:plain:w800

本記事で行うこと

  • OpenSSLで自己証明書の作成し、pem形式それぞれ行う。

モチベーション

  • いつも忘れるので自分のメモ用に記録しておきたかったため。
  • 自宅kubernetes上のdocker registry、Ingressに設定するサーバ証明書を作成したかったため。
  • 自宅rancher server用に設定するサーバ証明書を作成したかったため。

環境

証明書を作成する環境 * M1 Macbook Air

$ sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
$ uname -m
arm64

$ openssl version
LibreSSL 2.8.3

※LibreSSLとは

ja.wikipedia.org

秘密鍵の作成

  • RSA方式とし、鍵の保護はAES-128とします。
  • 鍵の長さは2048 bitで十分強固です。
  • パスフレーズを入れて作成
$ openssl genrsa -aes128 -out encrypted.key.pem 2048
$ ls -l ./encrypted.key.pem
-rw-r--r--  1 haku-mai  staff  1766 10 12 21:49 ./encrypted.key.pem

暗号化されない鍵ファイル作成

  • serverに配置する用のものです。
$ openssl rsa -in encrypted.key.pem -out key.pem

証明書署名要求(CSR)の作成

  • 以下の項目を-subjにセットして作成します。
C = 2文字の国名
ST = 都道府県
L = 地域
O = 組織名
OU = 組織単位名
CN = コモンネーム
$ openssl req -new -key key.pem -out csr.pem -subj "/C=JP/ST=Tokyo/L=chiyodaku/O=haku-mai/CN=*.hkm.home"
Enter pass phrase for key.pem:
$ ls -l ./csr.pem    
-rw-r--r--  1 haku-mai  staff  985 10 12 22:05 ./csr.pem

自己署名証明書作成

  • 今回は複数ドメインの証明書を作成したいのでSAN(Subject Alternative Name)を作成し、自己証明書を作成します。
$ echo "subjectAltName = DNS:rancher.hkm.home, DNS:*.hkm.home" > san.txt

$ openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out cert.pem -extfile san.txt
Signature ok
subject=/C=JP/ST=Tokyo/L=chiyodaku/O=haku-mai/CN=*.hkm.home
Getting Private key
Enter pass phrase for key.pem:
  • 以上となります。
  • 中間証明書は自宅環境では不要とします。

  • ちなみにRFC 2818でSANがないとエラーになります。実際以前docker registryにSANなしで作成した自己証明書を使い、kubernetesのpod内からプログラムでアクセスしたところ以下のようなエラーが出てアクセスできませんでした。

Error: creating registry client failed: Get "https://docker-registry.svc.cluster.local/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

RFC 2818 - HTTP Over TLS 日本語訳

  • 以上、OpenSSL(LibreSSL)を利用して自己証明書の作成(pem形式)でした。
  • 次回以降rancher server、Ingressをこの自己証明書を使って構築しています。
  • またiPhoneにプロファイルも合わせてインストールしていきます。

【docker/dnsmasq】docker containerでdnsmasqを起動しワイルドカードDNSを構築する

f:id:n-guitar:20211010180720p:plain:w800

本記事で行うこと

モチベーション

git repo

  • 参考ように以下repoを用意しています。 github.com

動作確認済環境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
$ uname -m
arm64
  • Intel macbook pro 2019
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H15
$ uname -m
x86_64
$ uname -a
Linux ubuntu-pi 5.11.0-1008-raspi #8-Ubuntu SMP PREEMPT Thu May 6 17:46:38 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 21.04
Release:    21.04
Codename:   hirsute
  • Docker Engine
  • Version: 20.10.6

dnsmasq

dnsmasqとは

  • 小規模向けのDNSで、あまりDNSの知識がない人でも簡易的に構築可能です。
  • dnsmasqを入れたサーバの/etc/hostsに書くだけでも、DNSサーバとして動作します。
  • 今回はワイルドカードDNSを構築したいため、専用のconfファイルを使います。
  • ロゴはなんだかやらしい・・・

f:id:n-guitar:20211010142749p:plain:w400 ja.wikipedia.org

dnsmasq.confの準備

  • 以下のようにconfファイルを作成します。
  • .wc.haku-maiのように.を先頭に書くことでその部分がワイルドカードになります。
  • 127.0.0.1の部分がどのドメインで返してほしいIPアドレスになります。
  • test001.haku-maiのようにフルドメインで書けばそのFQDNが返ります。
  • .wc.haku-maitest001.haku-maiをどちらを先に書いても、想定通り動作します。
  • ドメインを追加したい場合は、confファイルを編集して、docker containerを再作成すれば良いので簡単です。

dnsmasq.conf

port=53
address=/test001.haku-mai/127.0.0.2
address=/.wc.haku-mai/127.0.0.1
log-facility=/var/log/dnsmasq.log

dnsmasq docker image (Dockerfile)の準備

Dockerfile
  • 軽量のalpine linuxを使いdnsmasqをインストールします。
  • alpineのバージョンは固定しなくても最新のものであれば動作します。

Dockerfile

FROM alpine:3.13.2

RUN apk update && \
    apk upgrade && \
    apk add bash dnsmasq && \
    rm -rf /var/cache/apk/* && \
    mkdir -p /etc/default/ && \
    echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq

CMD ["dnsmasq","--no-daemon"]
image build
  • Dockerfileと同じディレクトリでbuild
  • tag名はおすきなものを
$ docker build -t dnsmasq:sample .

dnsmasq docker containerの起動

  • 作成した、dnsmasq.confをContainerの/etc/dnsmasq.confにbindして、NET_ADMIN権限を付けて起動します。
$ docker run -d -p 53:53/tcp -p 53:53/udp --cap-add=NET_ADMIN \
-v $PWD/dnsmasq.conf:/etc/dnsmasq.conf \
--name dnsmasq dnsmasq:sample

動作確認

  • 起動したサーバ/Mac上で確認するためにはDNSを指定してnslookup/digを行います。

単一ドメイン

  • 想定通り設定したIPが返ってくることがわかります。
nslookup
$ nslookup test001.haku-mai 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   test001.haku-mai
Address: 127.0.0.2
dig
$ dig test001.haku-mai @127.0.0.1

; <<>> DiG 9.10.6 <<>> test001.haku-mai @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47722
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test001.haku-mai.              IN      A

;; ANSWER SECTION:
test001.haku-mai.       0       IN      A       127.0.0.2

;; Query time: 6 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Oct 10 15:38:37 JST 2021
;; MSG SIZE  rcvd: 61

ワイルドカードドメイン

  • ワイルドカード部分に何を入れても想定通り設定したIPが返ってくることがわかります。
nslookup
$ nslookup yakiniku.wc.haku-mai 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   yakiniku.wc.haku-mai
Address: 127.0.0.1

$ nslookup tabetai.wc.haku-mai 127.0.0.1
Server:         127.0.0.1
Address:        127.0.0.1#53

Name:   tabetai.wc.haku-mai
Address: 127.0.0.1
dig
$ dig yakiniku.wc.haku-mai @127.0.0.1   

; <<>> DiG 9.10.6 <<>> yakiniku.wc.haku-mai @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51347
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;yakiniku.wc.haku-mai.          IN      A

;; ANSWER SECTION:
yakiniku.wc.haku-mai.   0       IN      A       127.0.0.1

;; Query time: 6 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Oct 10 15:41:44 JST 2021
;; MSG SIZE  rcvd: 65

$ dig tabetai.wc.haku-mai @127.0.0.1

; <<>> DiG 9.10.6 <<>> tabetai.wc.haku-mai @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49729
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tabetai.wc.haku-mai.           IN      A

;; ANSWER SECTION:
tabetai.wc.haku-mai.    0       IN      A       127.0.0.1

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Oct 10 15:42:00 JST 2021
;; MSG SIZE  rcvd: 64

別の端末(Macなど)から→DNSサーバにアクセスする場合

  • 例えば、自宅プライベートアドレス帯の192.168.XXX.XXXが割り振られているサーバで動作させての場合、127.0.0.1の部分を動作させているIPアドレスを指定します。
$ nslookup test001.haku-mai 192.168.XXX.XXX
$ dig yakiniku.wc.haku-mai @192.168.XXX.XXX

MacDNS を記載する場合の例

*「ネットワークの環境設定を開く」-> 「Wi-Fi」 -> 「詳細」 -> 「DNS」タブから DNSサーバのIP(例:192.168.XXX.XXX)を追加

  • 既存で書いてあるDNSは消すとgoogkeとかにアクセスできなくなるので注意してください。

  • 間違えてけしちゃった場合は、今回追加したものも全部一度消してしまえば戻ります。(自宅ルーターに設定してあるものが入ります)

f:id:n-guitar:20211010155145p:plain:w400

  • DNS キャッシュクリア
$ sudo killall -HUP mDNSResponder

iPhoneDNS を記載する場合の例

*「設定」-> 「Wi-Fi」 -> 接続中のwifiの「infoマーク」 -> 「DNSを構成」-> 「手動」に切り替えて DNSサーバのIP(例:192.168.XXX.XXX)を追加

  • 実際にiPhone(safari)で自作のWEBアプリにアクセスするためには、SSL証明書が必要になります。※自己証明でも個別でプロファイルをインストールすることで可能

  • (自己証明書の作成&インストールはどこかで書きます)

f:id:n-guitar:20211010160214p:plain:w300

f:id:n-guitar:20211010160321p:plain:w300

f:id:n-guitar:20211010160420p:plain:w300

あとがき

  • 自宅環境ではraspberry piDNSサーバとして使っており、自宅PC/スマホにはraspberry piDNSサーバとして見れるように追加しています。
  • ここまで準備しておくと、kubernetesIngressを楽に使うことができます。
  • 自宅では様々な自作アプリをkubernetes上で動作させていて、半年近く立っていますが、何も問題なく動作しています。
  • DNSってちょっとハードルあるように感じますが、簡易的に動かすにはdnsmasqで十分だと感じました。
  • スペックが上がっているraspberry pi 4がほしいです。

【userLAnd】余っているAndoroidのスマートフォンを利用してLinuxサーバとして利用する。(root化不要)

本記事で行うこと

  • 余っているAndoroidのスマートフォンuserLAndを使ってLinuxサーバをインストールする。
  • インストールしたLinuxサーバ上にMacOSからsshログインする。

モチベーション

  • 普段自宅用アプリケーションはRaspberry Piをサーバーとして利用しているが、他のサーバーマシンがほしかった。
  • 使わなくなった(高価な・・・)Andoroid端末がもったいないので活用したかった。
  • userLAndは疑似rootのprootで動作させるため、Andoroid端末のroot化不要であり、最も簡単なLinuxサーバー化だと思ったから。

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69
項目 バージョン・名称
Android 9
kernel 4.4.148
機種名 Xperia XZ1 Compact SO-02K

※古い端末はセキュリティアップデートができない事が多いので、自宅用で利用するようにしてください。

userLAndのインストール

Google PlayストアでuserLAndをインストールしアプリを開く。
f:id:n-guitar:20210203011413p:plain:w300 f:id:n-guitar:20210203011551p:plain:w300

対応しているLinuxサーバーは表示されているものが対応している。

公式sourceは以下レポジトリとなる。
2021/2/3時点でメンテナンスが2020/6で止まっているのが気になる・・・。
GitHub - CypherpunkArmory/UserLAnd: Main UserLAnd Repository

ubuntuサーバのインストール

ubuntuアイコンをタップし、username,password,VNCpasswordを設定。
VNCを利用しなくてもVNCpasswordは必須。
f:id:n-guitar:20210203014127j:plain:w300 f:id:n-guitar:20210203014204j:plain:w300

sshを選択肢するとインストールが始めるので数分待つ。
f:id:n-guitar:20210203014212j:plain:w300 f:id:n-guitar:20210203014222j:plain:w300

インストールが完了すると、コンソールが開くので先程設定したusername,passwordを入力するとログインできる。
IPアドレスは自宅のルーターからDHCPしたもの。固定化したい場合はルーター側で割当を固定する。
f:id:n-guitar:20210203014258j:plain:w300 f:id:n-guitar:20210203015346j:plain:w300

※プライベートアドレスなので隠す必要はないのですが癖で・・・

ubuntuサーバへMacOSからsshログイン

macから先程確認したIPとユーザでsshログインします。
デフォルトではssh portは2020になっているため指定します。

$ ssh hakumai@192.168.XXX.XXX -p 2022
The authenticity of host '[192.168.XXX.XXX]:2022 ([192.168.XXX.XXX]:2022)' can't be established.
ECDSA key fingerprint is SHA256:x906JFzoV+84iIp6vo4OGYeYSWai1Df4lcstHq7GsG4.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[192.168.XXX.XXX]:2022' (ECDSA) to the list of known hosts.
hakumai@192.168.XXX.XXX's password:
hakumai@localhost:~$ id
uid=2000(hakumai) gid=2000(hakumai) groups=2000(hakumai)

無事MacOSからログインすることができました。

以上、余っているAndoroidのスマートフォンを利用してLinuxサーバとして利用する。でした。