ルーターの設定ファイルをArgo WorkflowsでS3にバックアップする方法

はじめに

今回は、自宅で使用しているルーターの設定ファイルを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では、以下のようにして設定をファイル化しています。

  1. show config で標準出力に設定内容を書きだす
  2. 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ファイルにアップロードすることができます。

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: 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を使って、様々な用途に利用することができるので、ぜひ活用してみてください。