Olá pessoal.
Aviso : vou te dizer que estou escrevendo um artigo ao longo do caminho, o "cĂłdigo" nele está funcionando, mas nĂŁo pretende ser nenhuma prática recomendada, portanto, nĂŁo encontre falhas :) O objetivo do artigo: para transmitir princĂpios gerais Ă parte interessada da população que fala russo, Ă© possĂvel despertar o interesse para resolver vocĂŞ mesmo e fazer algo muito melhor e mais interessante. EntĂŁo vamos!
Digamos que você esteja trabalhando com Terraform / Terragrunt (o último não é fundamental aqui, mas é melhor estudar se você ainda não estiver usando) e automatizar a infraestrutura, por exemplo, em AWS (mas não necessariamente AWS). A infraestrutura está no código do repositório, é implantada a partir dele, parece que essa é a felicidade do GitOps :)
Tudo está indo bem até que algum usuário mude algo com as mãos através do console / IU e, claro, se esqueça de contar a alguém sobre isso. E então ele fez algo ruim de propósito. E aqui está sua tendência: código e infraestrutura não combinam mais! :(
Para aprender sobre isso pelo menos em tempo hábil, é necessário refinar um pouco a automação.
Como de costume, existem muitas maneiras diferentes de obter o que deseja. Por exemplo, recentemente, um utilitário bem desenvolvido apareceu no horizonte https://github.com/cloudskiff/driftctl , que pode até ser mais do que vou oferecer a você abaixo, mas no momento em que este artigo foi escrito, driftctl pelo menos não suporta trabalhar com aws provider v2, e também não sabe multirregião, o que inviabiliza seu uso na maioria dos projetos sérios. Mas os caras prometem terminá-lo em um ou dois meses.
Enquanto isso, vou descrever e dar um exemplo de uma pequena quantidade de cĂłdigo para o seguinte esquema muito simples:
nĂłs criamos um pipeline, que tanto em um cronograma (no Gitlab vocĂŞ pode usar cronogramas de pipeline) ou em um cĂrculo fará um plano de 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 o projeto https://github.com/cloudskiff/driftctl me parece pessoalmente muito Ăştil e resolvendo o problema correto e nĂŁo tem bons análogos, entĂŁo peço que apoiem os caras, e se possĂvel, façam a sua parte para cĂłdigo aberto.
Bom humor a todos!