Bonjour Ă tous.
Clause de non - responsabilité : je vais vous dire que j'écris un article en cours de route, le "code" qu'il contient fonctionne, mais ne prétend pas être une des meilleures pratiques, alors ne trouvez pas de faute :) Le but de l'article: à transmettre des principes généraux à la partie russophone intéressée de la population, il est possible de susciter l'intérêt pour le régler soi-même et faire quelque chose de bien meilleur et de plus intéressant. Alors allons-y!
Disons que vous travaillez avec Terraform / Terragrunt (ce dernier n'est pas fondamental ici, mais mieux étudier si vous ne l'utilisez pas déjà ) et automatisez l'infrastructure, par exemple, dans AWS (mais pas nécessairement AWS). L'infrastructure est dans le code du référentiel, elle est déployée à partir de celui-ci, il semblerait que ce soit le bonheur de GitOps :)
Tout se passe bien jusqu'à ce qu'un utilisateur change quelque chose avec ses mains via la console / l'interface utilisateur et oublie bien sûr d'en parler à quiconque. Et puis il a fait quelque chose de mal exprès. Et voici votre dérive: code et infrastructure ne correspondent plus! :(
Pour en savoir au moins en temps opportun, il est nécessaire d'affiner légèrement l'automatisation.
Comme d'habitude, il existe de nombreuses façons d'obtenir ce que vous voulez. Par exemple, récemment à l'horizon, un utilitaire bien en développement est apparu à l'horizon https://github.com/cloudskiff/driftctl , qui peut même être plus que ce que je vais vous proposer ci-dessous, mais au moment d'écrire ces lignes, driftctl au moins ne prend pas en charge le travail avec le fournisseur aws v2, et ne sait pas non plus comment multi-région, ce qui rend son utilisation impossible dans la plupart des projets sérieux. Mais les gars promettent de le terminer dans un mois ou deux.
En attendant, je décrirai et donnerai un exemple d'une petite quantité de code pour le schéma très simple suivant:
nous créons un pipeline qui, soit sur un calendrier (dans Gitlab, vous pouvez utiliser les calendriers de pipeline), soit en cercle, fera un plan de terraforme
(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: à mon humble avis, le projet https://github.com/cloudskiff/driftctl me semble personnellement très utile et résout le problème correct et il n'a pas de bons analogues, alors je vous demande de soutenir les gars, et si possible, faites votre part pour l'open source.
Bonne humeur Ă tous!