はじめに
今回は、自宅で使用しているルーターの設定ファイルをArgo Workflowsを使ってS3にバックアップする方法について説明します。
Argo Workflowsとは
Argo Workflowsは、ワークフローエンジンの1つであり、コンテナベースのジョブオーケストレーションを提供します。
Argo Projectの1つであり、Kubernetes上でのジョブ管理に特化しています。
CronWorkflowとは
CronWorkflowは、Argo WorkflowsのCRDの1つで、CronJobのように定義したスケジュールに従ってWorkflowを実行してくれます。
CronWorkflowは、Workflowの定義の中にスケジュールを記述し、指定されたスケジュールに従ってArgo WorkflowsがWorkflowを実行します。
設定をファイルとして出力する
RTX1300の設定をファイルとして出力するためには、Ansibleを使います。
Playbookでは、以下のようにして設定をファイル化しています。
show config
で標準出力に設定内容を書きだす- 1の結果を
config.txt
に保存する
これを実行するためのPlaybookをConfigMapとして定義します。
--- apiVersion: v1 kind: ConfigMap metadata: name: backup-playbooks data: backup.yaml: | --- - hosts: all connection: network_cli vars: ansible_network_os: yamaha_network.rtx.rtx tasks: - name: get configuration yamaha_network.rtx.rtx_command: commands: - show config register: result - name: Copy output to file ansible.builtin.copy: content: "{{ result.stdout[0] }}" dest: "config.txt" - name: Print config ansible.builtin.debug: msg: - "{{ result.stdout[0] }}"
これで設定をファイルとして出力するためのPlaybookができたので、CronWorkflowを定義してWorkflowが定期的に実行されるようにします。
日本時間の午前0時に実行されるように定義し、volumeMounts
で先ほどのPlaybookをマウントして実行するように定義します。
--- 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 serviceAccountName: backup volumes: - name: playbooks configMap: name: backup-playbooks container: image: ghcr.io/corrupt952/home/ansible:85f40b4ceff32b809d507d234920ce45b2303a60 env: - name: ANSIBLE_HOST_KEY_CHECKING value: "False" envFrom: - secretRef: name: backup-credentials volumeMounts: - name: playbooks mountPath: /playbooks command: - bash - -lc # NOTE: When specifying an IP address directly in the i option, # a trailing comma is used to treat it as an IP address instead of a file. - >- ansible-playbook --ssh-common-args="-o StrictHostKeyChecking=no" -e "ansible_user=$BACKUP_USERNAME ansible_ssh_pass=$BACKUP_PASSWORD" -i "$BACKUP_HOSTNAME," /playbooks/backup.yaml
出力した設定ファイルをS3にアップロードする
Argo WorkflowsのWorkflowには、コンテナ上にあるファイルを外部ストレージへ保存するための機能がついています。
この機能を使用して、Argo WorkflowsでS3ファイルにアップロードすることができます。
外部ストレージへの保存設定は各templatesのoutputs
に定義します。
--- 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 serviceAccountName: backup volumes: - name: playbooks configMap: name: backup-playbooks container: image: ghcr.io/corrupt952/home/ansible:85f40b4ceff32b809d507d234920ce45b2303a60 env: - name: ANSIBLE_HOST_KEY_CHECKING value: "False" envFrom: - secretRef: name: backup-credentials volumeMounts: - name: playbooks mountPath: /playbooks command: - bash - -lc # NOTE: When specifying an IP address directly in the i option, # a trailing comma is used to treat it as an IP address instead of a file. - >- ansible-playbook --ssh-common-args="-o StrictHostKeyChecking=no" -e "ansible_user=$BACKUP_USERNAME ansible_ssh_pass=$BACKUP_PASSWORD" -i "$BACKUP_HOSTNAME," /playbooks/backup.yaml # ここから下が追記 outputs: artifacts: - name: config path: /home/ansible/config.txt s3: endpoint: s3.dualstack.ap-northeast-1.amazonaws.com bucket: x key: backup/routers/rtx1300/config.txt accessKeySecret: name: backup-credentials key: BACKUP_AWS_ACCESS_KEY_ID secretKeySecret: name: backup-credentials key: BACKUP_AWS_SECRET_ACCESS_KEY
これで毎日設定ファイルをS3ファイルにアップロードすることができました。
実務上の応用例
今回は自宅のルーターの設定ファイルのバックアップについて説明しましたが、Argo Workflowsを使うことで、様々な用途に利用することができます。
- CronJobをCronWorkflowに置き換え、各種実行ログを外部ストレージへ直接保存する
- 調査・分析用Worklfow実行後に生成されるファイルを外部ストレージへ保存する
- 賛否はありますが、アプリケーションのバッチ処理から外部ストレージへの保存処理を分離する
おわりに
今回は、Argo Workflowsを使って、自宅で使用しているルーターの設定ファイルをS3にバックアップする方法について説明しました。
Argo Workflowsは、Kubernetes上でのジョブ管理に特化しており、CronWorkflowという機能を利用することで、定期的に実行されるジョブを簡単に定義することができます。
Argo Workflowsを使って、様々な用途に利用することができるので、ぜひ活用してみてください。