はじめに
今回は、自宅で使用しているルーターの設定ファイルをArgo Workflowsを使ってS3にバックアップする方法について説明します。
Argo Workflowsとは
Argo Workflowsは、ワークフローエンジンの1つであり、コンテナベースのジョブオーケストレーションを提供します。
Argo Projectの1つであり、Kubernetes上でのジョブ管理に特化しています。
argoproj.github.io
CronWorkflowとは
CronWorkflowは、Argo WorkflowsのCRDの1つで、CronJobのように定義したスケジュールに従ってWorkflowを実行してくれます。
CronWorkflowは、Workflowの定義の中にスケジュールを記述し、指定されたスケジュールに従ってArgo WorkflowsがWorkflowを実行します。
argoproj.github.io
設定をファイルとして出力する
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
- >-
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ファイルにアップロードすることができます。
argoproj.github.io
argoproj.github.io
外部ストレージへの保存設定は各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
- >-
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を使って、様々な用途に利用することができるので、ぜひ活用してみてください。