Opsオートメーションとスクリプト
1)操作を自動化する理由
MTTR/ヒューマンエラーを低減し、リリースと反応を加速します。
アクションを反復可能かつ監査可能にする(コンプライアンス)。
定期的ではなく、改善のためのエンジニアの時間を解放します。
2)基本原則
1.Idempotency:再実行→同じ結果。
2.安全手すり:ドライラン、確認、限界、自動ロールバック。
3.Observability: logs/metrics/trailsは各スクリプト/パイプラインに組み込まれています。
4.Configuration> constants in code: all through parameters/manifests。
5.GitOps/Docs-as-Code:トランザクションコードはバージョン管理、レビュー、テストされます。
6.小さなステップ:カナリアローブ、バッチ、予算とリトレイ。
7.レポに秘密はありません:秘密のストレージを介してのみ。
3)自動化タスククラス
修復とインシデント:ロールバック、プロバイダスイッチ、劣化フィーチャーフラグ。
計画作業:証明書/キーの回転、データベースの移行(展開→移行→契約)。
インフラ管理:IaC (Terraform)、構成(Ansible)、 K8sマニフェスト。
データとDataOps:バックフィル、ETL、品質検証。
Xaoc/DR演習:セキュリティゲートによる障害のシミュレーション。
4)ツールの選び方
Bash-短い接着剤スクリプト、CLIオーケストレーション。
Python-logic/SDK、 retrai、 API、 JSON/YAMLで動作します。
Ansible-idempotent設定、エージェントは必要ありません。
Terraformは宣言的インフラです。
Kubernetes ジョブ/CronJobs-バッチタスク/スケジューリング。
Argo/Airflow-依存するDAGとオーケストレーション。
ChatOps-監査とチャットから安全に起動します。
5)オートメーションアーキテクチャ(参照)
CLI/ChatOps→Controller (GitOps/Orchestrator)→Performers (Ansible/Terraform/K8s Job)→Monitoring (logs/metrics/trails)→Auditing/ticketing→Docking artifacts(証拠)
6) Idempotencyおよび条件管理
「Check、 then change」: detect-then-act(既にOKの場合-何もしない)。
長い手続きのために「state/lock」を保存します。
繰り返し実行の可能性を持つ原子ステップに手順を分割します。
7)バグ、後退およびロールバック
指数遅延とジッタを持つレトライ。
操作時間の予算(タスクあたりの合計SLA)。
ロールバックおよび遮断器は常に提供されます。
明示的なリターンコードと構造化エラー。
8)セキュリティと秘密
RBAC/ABAC、最小特権、一時的なトークン(JIT/JEA)。
Vault/KMS/Cloud Secret Managerの秘密;キーが回転します。
「職務の分離」:誰が書くかは、prodで承認し、起動する人ではありません。
監査ログ:who/when/what/what/with what result。
9) GitOpsのチャット
PR→テスト→レビュー→マージ→環境への自動プロモーション。
チャット内のコマンド(例えば'/ops deploy checkout --canary 5%')はパイプラインを引き起こします。ボットはダッシュボードに証拠とリンクを適用します。
10)企画・オーケストレーション
依存関係と期限を持つCronJobs/DAG。
コンペティション:'Forbid'、 'Replace'、 'Allow' (K8s)タスクに応じて。
プロッドを「食べる」ことができないように、リソースポリシー/クォータ。
11)自動化の観察可能性
メトリクス:成功/エラー、期間、リトレイ、影響を受けるオブジェクト。
ログ:構造化、相関ID、エラー時の赤線。
トレース:長い操作のステップは、分散トレースで表示されます。
アラート:症状(SLO)およびテクニカルメトリック(期限、エラーの%)による。
12)テストおよびシミュレーション
ロジックとアーティファクトパーサのユニットテスト。
サンドボックスとカナリアでの統合テスト。
「シミュレータ」(ドライラン+ダミープロバイダ)、実際のシナリオを再生します。
演習:明確な目標、セキュリティゲート、AAR→RCA→CAPA。
13)コードテンプレート
Bash(手すり付き骨格)
bash
!/usr/bin/env bash set -Eeuo pipefail trap 'echo "[ERR] line $LINENO"; exit 1' ERR
log(){ printf '%s %s\n' "$(date -Iseconds)" "$"; }
DRY=${DRY_RUN--true}
ensure_dep(){ command -v "$1" >/dev/null { echo "need $1"; exit 2; }; }
apply_change(){
local target="$1"
if [[ "$DRY" == "true" ]]; then log "[DRY] would update $target"
else kubectl apply -f "$target"
fi
}
main(){
ensure_dep kubectl for f in manifests/.yaml; do apply_change "$f"
done log "done"
}
main "$@"
Python (Retrai+Idempotency)
python import argparse, time, json, sys from pathlib import Path import requests
def with_retries(fn, attempts=5, base=0. 2):
for i in range(attempts):
try:
return fn()
except Exception as e:
sleep = base (2i)
time. sleep(sleep)
raise
def already_done(marker):
return Path(marker). exists()
def mark_done(marker):
Path(marker). write_text("ok")
def main():
ap = argparse. ArgumentParser()
ap. add_argument("--endpoint", required=True)
ap. add_argument("--marker", default="/tmp/op. marker")
args = ap. parse_args()
if already_done(args. marker):
print("idempotent: nothing to do"); return
def call():
r = requests. post(args. endpoint, json={"action":"rotate"})
r. raise_for_status()
return r. json()
resp = with_retries(call)
print(json. dumps(resp))
mark_done(args. marker)
if __name__ == "__main__":
sys. exit(main())
Ansible (idempotentタスク)
yaml
- hosts: web become: true tasks:
- name: Ensure nginx present and enabled ansible. builtin. package:
name: nginx state: present
- name: Deploy config ansible. builtin. template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: '0644'
notify: restart nginx handlers:
- name: restart nginx ansible. builtin. service:
name: nginx state: restarted
Kubernetes CronJob(ローテーション予定)
yaml apiVersion: batch/v1 kind: CronJob metadata:
name: cert-rotate spec:
schedule: "0 3 "
concurrencyPolicy: Forbid jobTemplate:
spec:
template:
spec:
serviceAccountName: ops-automation restartPolicy: OnFailure containers:
- name: rotator image: registry/ops/rotator:1. 2. 3 args: ["--rotate", "--budget-ms=60000"]
envFrom:
- secretRef: { name: rotator-secrets }
GitHubアクション(ChatOpsトリガー)
yaml name: ops-deploy on:
workflow_dispatch:
inputs:
service: {required: true}
canary: {required: false, default: "5"}
jobs:
deploy:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- run:./scripts/deploy. sh "${{ inputs. service }}" --canary "${{ inputs. canary }}"
14)実装チェックリスト
- 操作ごとにツールが選択され、ランブックが記述されます。
- ドライラン、確認、制限(手すり)があります。
- ログは構造化されており、メトリックとアラートが接続されています。
- ストレージからの秘密、最小限の一時アクセス。
- テスト(ユニット/インテグレーション/カナリア)とシミュレーションを行いました。
- GitOps/PRレビューが必要です、監査があります。
- ロールバック計画と成功基準が文書化されています。
- オートメーションはSLO/エラー予算に関連付けられています。
15)アンチパターン
idempotencyとロールバックのないスクリプト。
「コードの秘密」、superadminはすべてを説明します。
監査なしで販売の手動編集。
宣言的IaCの代わりにChunky Bash Zoo。
コード内のパラメータ「protected」-再利用はありません。
ドライラン/カナリア→大きな爆発はありません。
構造と相関関係のない「人のための」ログ。
16) Opsオートメーション成熟度メトリック
適用範囲:オートメーションおよびrunbook操作の%。
自動タスクの成功率/再試行レート。
実行およびオンタイムの平均時間。
自動化の前後に故障率を変更します。
監査-完全性:完全な証拠を持つ操作の%。
セキュリティ:キー/証明書回転時間、JITアクセスの共有。
17)ボトムライン
Ops Automationは、異なるスクリプトのセットではなく、システムです。idempotentアクション、セキュアな手すり、Observability、 Secrets and access under control、 GitOps/ChatOps、テストと演習。このようなシステムでは、オペレーションは迅速で予測可能で監査可能になり、ビジネスは安定したリリースと低リスクのインシデントを受けます。