設定をバックアップするCron Workflowについて紹介する

注意事項

この記事は、Notion AIに対して

  • 問題と解決策の概要
  • 例示用のコード

を渡して生成した実験的な記事になります。

はじめに

最近、私はRTX1300の設定ファイルを定期的にバックアップするためにArgo WorkflowsのCRDであるCron Workflowを使って指定されたスケジュールでワークフローを実行するようにしました。
今回は正確に言えばバックアップではなく、あくまでログに設定ファイルを残しておいて、バックアップ代わりにしているのが性買うです。

バックアップする

以前、Rubyを使用してshow configを行う方法を紹介しましたが、sshexpectを使用して設定を取得する方法を紹介します。

khasegawa.hatenablog.com

前回でも出していた話ですが、RTX1300のSSHサーバはRFC4254のSec 6.5にあるexecを実装していないため、ssh rtx1300 show configのようなコマンドの実行を行うことはできません。
そういった理由もあり、expectを使っていきます。

backup.sh

バックアップする処理をシェルスクリプトとして定義しておきます。
実際にはConfigMapに定義しています。

#!/bin/bash -Ceuo pipefail

# 必要なパッケージをインストール
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -qq --no-install-recommends expect openssh-client >/dev/null

# /tmp/result.txtに一連の出力を書き出す
echo "Connecting $BACKUP_USERNAME@$BACKUP_HOSTNAME"
expect <<EOF >/tmp/result.txt
set timeout 10
spawn ssh $BACKUP_USERNAME@$BACKUP_HOSTNAME
expect "(yes/no"
send "yes\r"
expect "password: "
send "$BACKUP_PASSWORD\r"
expect "> "
send "show config\r"
expect "> "
send "exit\r"
expect eof
EOF

# /tmp/result.txtから「> show config」から「> exit」までの行(設定)を標準出力に出力する
sed -n '/> show config/,/> exit/{/> show config/!{/> exit/!p}}' /tmp/result.txt

専用のコンテナイメージを用意するのが面倒だったこともあり、スクリプトの中でパッケージをインストールしていて大変行儀がよろしくないですね。

詳細は割愛しますが、expectを使ってRTX1300にSSHで接続し、出力された内容に応じてyesといったり、パスワードを入力してログインしたり、show configを実行しています。

Cron Workflow

以下が、先ほどのbackup.shを実行するためのCron Workflowです。
あまり馴染みはないかもしれないですが、workflowSpec.templatesの各要素は微妙にPodのSpecに準拠しています。

apiVersion: argoproj.io/v1alpha1
kind: CronWorkflow
metadata:
  name: backup
spec:
  timezone: 'Asia/Tokyo'
  schedule: "0 0 * * *"
  concurrencyPolicy: "Allow"
  startingDeadlineSeconds: 0
  workflowSpec:
    entrypoint: backup
    templates:
    - name: backup
      volumes:
      - name: scripts
        configMap:
          name: backup-scripts
      container:
        image: ubuntu:22.04
        stdin: true
        tty: true
        envFrom:
        - secretRef:
            name: backup-credentials
        volumeMounts:
        - name: scripts
          mountPath: /scripts
        command:
        - sh
        - /scripts/backup.sh

実行は、JSTの00:00に実行するように定義しています。
なので、それまで待っても良いですし、Argo WorkflowsのWebUIを有効にしているなら、 単発で実行することもできて非常に便利です。

おわりに

以上が、RTX1300の設定ファイルをバックアップするためのCron Workflowについての紹介でした。
この設定を使うことで、設定ファイルのバックアップを自動的に作成することができます。
Cron Workflowではなく、この程度であれば標準リソースであるCronJobで書いても良いです。

この記事がRTX1300の設定ファイルをバックアップする方法についての情報源として役立つことを願っています。