Halo semuanya.
Penafian : Saya akan memberi tahu Anda bahwa saya sedang menulis artikel di sepanjang jalan, "kode" di dalamnya berfungsi, tetapi tidak berpura-pura menjadi praktik terbaik, jadi jangan menemukan kesalahan :) Tujuan artikel: untuk menyampaikan prinsip-prinsip umum kepada bagian populasi berbahasa Rusia yang tertarik, adalah mungkin untuk membangunkan minat untuk menyelesaikannya sendiri dan melakukan sesuatu yang jauh lebih baik dan lebih menarik. Jadi ayo pergi!
Katakanlah Anda bekerja dengan Terraform / Terragrunt (yang terakhir tidak mendasar di sini, tetapi lebih baik belajar jika Anda belum menggunakannya) dan mengotomatiskan infrastruktur, misalnya, di AWS (tetapi tidak harus AWS). Infrastruktur ada dalam kode repositori, itu diterapkan darinya, tampaknya ini adalah kebahagiaan GitOps :)
Semuanya berjalan dengan baik sampai beberapa pengguna mengubah sesuatu dengan tangannya melalui konsol / UI dan tentu saja lupa memberi tahu siapa pun tentang hal itu. Dan kemudian dia melakukan sesuatu yang buruk dengan sengaja. Dan inilah maksud Anda: kode dan infrastruktur tidak lagi cocok! :(
Untuk mempelajari hal ini setidaknya tepat waktu, perlu sedikit menyempurnakan otomatisasi.
Seperti biasa, ada banyak cara berbeda untuk mendapatkan apa yang Anda inginkan. Misalnya, baru-baru ini di cakrawala sebuah utilitas yang berkembang dengan baik telah muncul di cakrawala https://github.com/cloudskiff/driftctl , yang bahkan mungkin lebih dari yang akan saya tawarkan kepada Anda di bawah ini, tetapi pada saat penulisan ini, driftctl setidaknya tidak mendukung bekerja dengan penyedia aws v2, dan juga tidak tahu bagaimana multi wilayah, yang membuatnya tidak mungkin digunakan di sebagian besar proyek yang serius. Tapi orang-orang berjanji untuk menyelesaikannya dalam satu atau dua bulan.
Sementara itu, saya akan menjelaskan dan memberikan contoh sejumlah kecil kode untuk skema yang sangat sederhana berikut ini:
kami membuat pipeline, yang baik sesuai jadwal (di Gitlab Anda dapat menggunakan jadwal Pipeline) atau dalam lingkaran akan membuat rencana terraform
(diff ) pipeline , , Slack.
, , issue , api , apply, . - state, .
live , .. , :
account_1/
├── eu-central-1
│ ├── dev
│ │ ├── eks
│ │ │ ├── terragrunt.hcl
│ │ │ └── values.yaml
│ │ └── s3-bucket
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ ├── prod
│ │ ├── eks
│ │ │ ├── terragrunt.hcl
│ │ │ └── values.yaml
│ │ └── s3-bucket
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ └── staging
│ ├── eks
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ └── s3-bucket
│ ├── terragrunt.hcl
│ └── values.yaml
├── us-east-1
│ ├── dev
│ │ ├── eks
│ │ │ ├── terragrunt.hcl
│ │ │ └── values.yaml
│ │ └── s3-bucket
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ ├── prod
│ │ ├── eks
│ │ │ ├── terragrunt.hcl
│ │ │ └── values.yaml
│ │ └── s3-bucket
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ └── staging
│ ├── eks
│ │ ├── terragrunt.hcl
│ │ └── values.yaml
│ └── s3-bucket
│ ├── terragrunt.hcl
│ └── values.yaml
└── terragrunt.hcl
account_1
2 : us-east-1
eu-central-1
, AWS. Terragrunt /, , "${basename(get_terragrunt_dir())}"
, 2: eks
s3-bucket
,
<account_name>/<region>/<environment>/<component>/*
.. " " */*/*/<component>/*
, , s3-bucket ( , ).
Incoming WebHooks Slack Webhook URL. : https://api.slack.com/messaging/webhooks
pipeline Slack diff' :
#!/bin/bash
ROOT_DIR=$(pwd)
plan () {
echo -e "$(date +'%H-%M-%S %d-%m-%Y') $F"
CURRENT_DIR=$(pwd)
PLAN=$CURRENT_DIR/plan.tfplan
terragrunt run-all plan --terragrunt-non-interactive -lock=false -detailed-exitcode -out=$PLAN 2>/dev/null || ec=$?
case $ec in
0) echo "No Changes Found"; exit 0;;
1) printf '%s\n' "Command exited with non-zero"; exit 1;;
2) echo "Changes Found! Reporting!";
MESSAGE=$(terragrunt show -no-color ${PLAN} | sed "s/\"/'/g"); # let's replace the double quotes from the diff with single as double quotes "break" the payload
curl -X POST --data-urlencode "payload={\"channel\": \"#your-slack-channel-here\", \"username\": \"webhookbot\", \"text\": \"DRIFT DETECTED!!!\n ${MESSAGE}\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/YOUR/WEBHOOK/URL_HERE;;
esac
}
N="$(($(grep -c ^processor /proc/cpuinfo)*4))" # any number suitable for your situation goes here
for F in */*/*/s3-bucket/*; do
((i=i%N)); ((i++==0)) && wait # let's run only N jobs in parallel to speed up the process
cd $ROOT_DIR
cd $F
plan & # send the job to background to start the new one
done
- , pipeline :)
!
, /, - , , , , , , @vainkop
PS: IMHO proyek https://github.com/cloudskiff/driftctl menurut saya pribadi sangat berguna dan memecahkan masalah yang benar dan tidak memiliki analog yang baik, jadi saya meminta Anda untuk mendukung orang-orang, dan jika mungkin, lakukan sedikit untuk open source.
Suasana hati yang baik untuk kalian semua!