13 tips pour Python
Une série de 6 articles présentant les outils à mettre en place pour le dev Python en 2020. Au programme:
- pyenv et Poetry pour la version python et les dépendances
- click pour la cli
- requests pour les calls HTTP
- pytest, coverage et nox pour les tests units
- black, flake8 et pre-commit pour le code linting
- mypy pour le static typing (pas utilisé encore)
- sphinx et readthedocs pour la doc
- github actions pour le ci/cd
Beaucoup de bonnes pratiques et de plugins flake8 pour automatiser un max de checks...
La série d'article est aussi accompagnée d'un repo qui met tout en pratique: https://github.com/cjolowicz/hypermodern-python
Si Spotify se retrouve bloqué en plein écran sous linux, éditer le fichier ~/.config/spotify/prefs
ou (~/snap/spotify/current/.config/spotify/prefs
) et supprimer les lignes app.window.position.height
et app.window.position.width
.
Quelques tips pour debugger du code python avec print()
, notamment:
- Debug variables with f-strings and
=
:print(f"{myvar=}")
- Use
locals()
to debug all local variables:print(locals())
- Use
vars()
to debug all of an object’s attributes:print(vars(myobject))
Un script shell interactif pour créer facilement une VM VirtualBox MacOS.
Lors du provisioning d'une image Packer Ubuntu, l'installation de packages échoue parfois avec l'erreur Package 'XXX' has no installation candidate
car le setup cloud-init n'est pas terminé.
La doc Packer recommande d'ajouter la step suivante:
{
"type": "shell",
"inline": [
"while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done"
]
}
Il est aussi possible d'utiliser /usr/bin/cloud-init status --wait
(hashicorp/packer#2639).
Un tuto très complet pour apprendre à interagir avec des APIs externes en Python.
Un site qui permet de connaître le pourcentage de PRs mergées pour un repo GitHub donné.
La quasi totalité des livres dont vous êtes le héros disponible en PDF!
When deleting a namespace is stuck in Terminating
state, you can find all resources in this namespace with kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
To write bash one-liner functions, don't forget to add a semi-column at the end of the commands:
$ grep_file() { grep "$@" file; }
Les calendriers partagés Google Calendar ne sont pas synchronisés par défaut sur MacOS/IOS. Pour y accéder, il faut sélectionner explicitement les calendriers ici: https://www.google.com/calendar/syncselect
Une description détaillée des nouveautés de Python 3.9
asdf est un gestionnaire de version universel qui peut remplacer pyenv, rbenv, rvm, sdkman pour gérer les versions de python, ruby, java et bien d'autres languages, mais aussi les versions d'outils comme terrafrom, packer, kubectl...
Pratique pour compresser les PDF lorsqu'on doit envoyer des documents par mail aux administrations mais que celles-ci ont des limites à 10Mb
To save storage space, you can compress a PDF in Preview.
Note: When compressed, the PDF may be of lower quality than the original.
In the Preview app on your Mac, open the PDF, then choose File > Export.
Click the Quartz Filter pop-up menu, then choose Reduce File Size.
Un super tuto pour déployer et utiliser Elasticsearch, Kibana et Metricbeat sur Kubernetes à l'aide des Helm charts Elastic officiels.
Attention, contrairement a ce qui était mentionné à l'origine dans cet article, les Helm charts Elastic be sont pas encore officiellement supporté avec Helm v3. L'utilisation de Helm v2 est donc recommandée.
This article provides a summary of the object storage services of the three biggest cloud providers: AWS, Azure and GCP.
Une bonne explication des différences entre les Helm charts et les opérateurs Kubernetes.
Quelques conseils pour faire des reviews constructives:
- Rephrase your objection as a question
- Avoid hyperbole
- Keep snide comments to yourself
- Engage positively
- Remember that not everybody’s experience is identical to yours
- Don’t diminish the complexity of something that’s not obvious
- Be respectful
- Manage expectations (and your time)
- Say please
- Start a conversation
Une application mobile pour gérer ses clusters k8s depuis son smartphone
InSpec-Iggy permet de générer des règles de compliances InSpec pour les cloud AWS, Azure et GCP à partir de tfstate
Terraform.
Il est possible de générer des règles de compliances incluant le tfstate
Terraform ou l'excluant. Ce derniers cas est intéressant pour vérifier que rien n'est provisionné dans le cloud en dehors de Terraform.
Un ensemble de CRD qui permettent de créer des ressources GCP via des templates kubernetes.
exemple:
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLInstance
metadata:
name: my-sql-instance
labels:
cost-center: "cc9"
spec:
databaseVersion: MYSQL_5_7
region: us-central1
settings:
tier: db-f1-micro
Un Space Invaders like pour killer des pods Kubernetes
Procedure pour installer differentes versions d'un logiciel avec brew:
$ git clone git@github.com:Homebrew/homebrew-core.git
$ cd homebrew-core
$ git log master -- Formula/terraform.rb
# retrouver le commit de la version qu'on souhaite installer
$ git checkout <commitid>
$ cd Formula
$ brew unpin terraform
$ brew unlink terraform
$ brew install terraform.rb
$ brew pin terraform
$ brew switch terraform <version>
Pour gérer les versions de Terraform, je préfère utiliser tfenv, mais la procédure est valable pour n'importe quel logiciel installable avec brew.
Comment utiliser git commit --fixup
, git commit --amend
et git rebase -i --autosquash
pour avoir un historique de commits clean avant de soumettre une PR.
Attention, contrairement a l'exemple de l'article, il est fortement déconseillé d'utiliser ces commandes sur la branche master
ou sur une branche sur laquelle on est pas le seul a travailler si l'on a déjà "pushé" les commits. Par ailleurs , Il vaut mieux utiliser git push --force-with-lease
.
Keybase peut gérer les authentifications SSH par Certificate Authorities. Une fois la clé publique de la CA déployée sur un serveur, la commande kssh
permet de se connecter en SSH a un serveur en générant dynamiquement une clé SSH temporaire signée par la CA.
La gestion des accès de fait en fonction des teams keybase de l'utilisateur.
git worktree
permet de travailler sur une branche d'un repo dans un répertoire de travail dédié.
C'est super utile pour éviter de jongler avec les git stash
quand on travaille sur plusieurs branches en //.
Particulièrement quand on a lancé un build local super long en local et qu'on aimerait bien travailler sur une autre branche en attendant que le build termine.
git log --all --grep "pattern"
pour chercher dans les messages de commit git.
Une bonne explication du fonctionnement interne de git et de l'arborescence du répertoire .git
. A noter que la 2ème partie de l'article sur les rebases est également très intéressante.
Dans mon équipe (infra @ elastic), on utilise Logstash pour indexer les évènements de notre organisation GitHub dans Elasticsearch et générer des alertes et dashboards.
Ce post décrit rapidement notre process.
En bonus, il est possible d'utiliser le nouveau chart officiel Logstash développé par mes soins pour déployer Logstash sur K8S (attention ce chart est toujours en bêta).
J'utilise ce lecteur DVD portable pour occuper les enfants pendant les longs trajets en voiture.
Les codecs et formats qu'il peut lire sont assez limités.
Pour convertir des vidéos afin qu'elles soient lisible sur ce lecteur:
ffmpeg -i existing_file.mp4 -vcodec mpeg4 -vtag DX50 -acodec mp3 -s vga new_file.avi
Script jenkins pour supprimer des builds d'un job, quand on a besoin de le faire on est contant de ne pas devoir se taper tout ça à la main :)
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
vault -autocomplete-install
pour avoir l'autocompletion de la command line Vault
J'avais loupé cette news mais il est désormais possible de lancer des VM ARM64 sur la Freebox Delta.
Pas encore testé mais c'est super interressant pour qui veut s'autohéberger sans s'équiper d'un serveur @home et dispose d'une connexion suffisante (pas mon cas malheureusement, j'attend avec impatience le jour ou la fibre sera disponible chez moi...).
Quelques limitations connus:
- ARM64 uniquement
- 2 VM maximum
- 2 CPU et 1GB dispo pour les VM
Quel est l'intérêt par rapport à un Raspberry Pi pour une utilisation de type server @home?
- Pas d'hardware supplémentaire
- Pas de problème d'alimentation tatillone
- Pas de problème de corruption de carte SD pour le stockage
- Meilleures perfs disque
- Meilleures perfs CPU (entre 30% et 80% d'après l'article)
- Meilleures perfs réseau
Les commandes pour générer un kubeconfig à partir d'un Service Account K8S.
J'ai créé 2 scripts à partir de ces instructions:
- create-serviceaccount.sh pour générer le serviceaccount
- create-kubeconfig.sh pour générer le kubeconfig
Super utile pour coller des gros logs dans un commentaire GitHub par exemple:
## collapsible markdown?
<details><summary>CLICK ME</summary>
<p>
hidden blocks!
</p>
</details>
AWS EKS gère désormais les node groups de workers en tant que ressources managées (avant il fallait gérer soit même les ASG de workers nodes).
En plus c'est déjà géré par la nouvelle version du provider terraform-aws
Le Getting Started pour utiliser Hammerspoon sur MacOS
What is Hammerspoon?
Hammerspoon is a desktop automation tool for OS X. It bridges various system level APIs into a Lua scripting engine, allowing you to have powerful effects on your system by writing Lua scripts.
C'est super puissant pour controller MacOS.
Quelques examples:
- Déplacer la fenêtre actuelle sur la moitié gauche de l'écran en pressant les touches
Cmd
,alt
,ctrl
et gauche
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Left", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
- Déplacer la fenêtre actuelle sur la moitié droite de l'écran en pressant les touches
Cmd
,alt
,ctrl
et droite
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Right", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x + (max.w / 2)
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
- Afficher le titre en écoute sur Spotify en pressant les touches
Cmd
,alt
,ctrl
etS
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "S", function()
hs.spotify.displayCurrentTrack()
end)
MacOS inclut /usr/libexec/java_home
pour configurer JAVA_HOME
:
export JAVA_HOME=$(/usr/libexec/java_home)
Un générateur de "CV" basé sur l'activité publique Github.
Présentation de ClusterAPI qui permet de provisionner depuis un cluster k8s existant (management cluster) d'autres clusters k8s (target clusters) dans le cloud grâce a des CRDs (ex: AWSCluster, MachineDeployment). C'est encore en alpha mais ça a l'air très prometteur.
Un testeur de template Ansible en ligne
Des bonnes pratiques pour optimiser l'utilisation de repos git volumineux avec jenkins (reference repos, shallow clone, sparse checkout...)
Comment troubleshooter un cluster elasticsearch en utilisant l'api _cat
.
Ce post a été écrit il y a 5 ans mais la méthode et les commandes sont toujours d'actualité.
Pour utiliser gcloud
(cli GCP) avec Python3 (>=3.4) au lieu de Python2:
# Use the python3 interpreter on your path
$ export CLOUDSDK_PYTHON=python3
Un générateur de launchd.plist
pour executer des tâches schedulées sur MacOS.
Un plugin Helm qui permet de déclencher un rollback automatique suite à l'upgrade d'une release Helm en fonction d'une query Elasticsearch ou Prometheus
Un simple outils Python en ligne de commande qui reste la taille d'une image Docker et retourne une erreur si celle ci dépasse une taille donnée. A intégrer dans les CI pour s'assurer que les images Docker ne grossissent pas exponentiellement au fil du temps.
Un petit script groovy à lancer sur une instance Jenkins pour trouver l'arbre de dépendences des plugins installés:
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {
println "${it.getShortName()} (${it.getVersion()}) - ${it.getDependencies()}"
}
GCP fournis désormais des VM Windows disposant de docker pré-installé pour faire tourner des containers Windows.
Actuellement les images à utiliser sont:
- windows-2019-for-containers
- windows-2019-core-for-containers
- windows-1809-core-for-containers
- windows-1803-core-for-containers
(source: https://cloud.google.com/compute/docs/images#unshielded-images)
Pour générer un fichier ~/.gitignore_global
en fonction de son environnement.
Perso j'utilise https://www.gitignore.io/api/go,vim,gpg,code,linux,macos,emacs,python,packer,archive,ansible,vagrant,archives,terraform,jetbrains,virtualenv
Ensuite un petit coup de git config --global core.excludesfile ~/.gitignore_global
et on est tranquille
Powershell est disponible sur macos (brew install powershell-preview
). Pratique quand a pas envie de lancer un os windows juste pour tester un bout de code powershell. Bien il n'est pas possible sur les fonctions bas niveau de powershell...
A noter que c'est aussi dispo sur la plupart des distros linux: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux
For future reference.
Here are the links for getting Public IPv4 on various clouds.
Azure
curl -H Metadata:true "http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-08-01&format=text"
AWS
curl http://169.254.169.254/latest/meta-data/public-ipv4
GCP
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip
Since 169.254.169.254 is a global metadata server for these above cloud vendors, no need to use different domain names.
Procédure pour générer des OTP avec Hashicorp Vault pour les connexions SSH
Un générateur de meme "code compiling / github is down" :D
Pour visualiser l'historique d'un fichier sur GitHub
Kendrick Lamar sur des beats de Dr Dre
Avec Python2, dict.keys()
, dict.values()
et dict.items()
retournent une liste. Avec Python3, ces méthodes retournent un objet de type "dictionary view".
Utiliser une loop avec une de ces 3 méthodes renvoie l'erreur suivante: 'dict object' has no attribute \"dict_keys(['hosts'])
Il faut utiliser le filtre list pour convertir l'objet en liste:
vars:
hosts:
testhost1: 127.0.0.2
testhost2: 127.0.0.3
tasks:
- debug:
msg: '{{ item }}'
# Only works with Python 2
#loop: "{{ hosts.keys() }}"
# Works with both Python 2 and Python 3
loop: "{{ hosts.keys() | list }}"
Jenkins permet d'utiliser un repository de référence local en tant que cache pour les jobs.
- créer un mirroir du repository en local:
git clone --mirror git@github.com:my-user/my-repository.git
- configurer le job jenkins pour utilise le repo de référence:
Git SCM
=>Additional Behavior
=>Advanced clone behaviours
=>Path of the reference repo to use during clone
- mettre à jour régulièrement le repo de référence:
git fetch --all --prune
Les jobs vont alors utiliser ce repo local en tant que cache ce qui peut grandement accélérer les temps de builds pour les repos bien lourds.
Sur les distribs disposant de python < 2.7.9 (ubuntu 14.04 par exemple), les modules ansible apt_key et apt_repository ne gèrent pas les urls en HTTPS.
example:
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Failed to validate the SSL certificate for packages.elastic.co:443. Make sure your managed systems have a valid CA certificate installed. If the website serving the url uses SNI you need python >= 2.7.9 on your managed machine (the python executable used (/usr/bin/python) is version: 2.7.6 (default, Nov 13 2018, 12:45:42) [GCC 4.8.4]) or you can install the `urllib3`, `pyOpenSSL`, `ndg-httpsclient`, and `pyasn1` python modules to perform SNI verification in python >= 2.6. You can use validate_certs=False if you do not need to confirm the servers identity but this is unsafe and not recommended. Paths checked for this platform: /etc/ssl/certs, /etc/pki/ca-trust/extracted/pem, /etc/pki/tls/certs, /usr/share/ca-certificates/cacert.org, /etc/ansible. The exception msg was: hostname 'packages.elastic.co' doesn't match 'e.sni.fastly.net'."}
Il est nécessaire d'installer les packages python-urllib3
, python-openssl
, python-pyasn1
, python-pip
et pip ndg-httpsclient
pour que cela soit fonctionnel.
example:
- name: Debian - ensure python-urllib3, python-openssl, python-pyasn1 & python-pip are installed
apt:
name: python-urllib3,python-openssl,python-pyasn1,python-pip
state: present
when: ansible_distribution_release == "trusty"
- name: Debian - ensure ndg-httpsclient pip is installed
pip:
name: ndg-httpsclient
state: present
when: ansible_distribution_release == "trusty"
Un outil tout simple en go développé par un collègue qui vérifie toute les 60 secondes le status d'une PR GitHub et renvoie SUCCESS quand tout les checks définis sur la PR sont OK.
Prérequis: Créer un token GitHub disposant du scope repo:status
$ go get github.com/crazybus/pratus
$ export GITHUB_TOKEN=xxxxxxx
$ pratus https://github.com/Crazybus/pratus/pulls/1
Checking status of pull request 1 in Crazybus/pratus every 60 seconds
......
PR finished with state: success
Petit procédure pour générer une clé GPG avec Keybase sur MacOS et l'utiliser pour signer ses commits GitHub
Une nouvelle vulnérabilité a été découverte dans runc qui permet aux containers Docker qui tournent en tant que root de devenir root sure le système hôte.
Il faut mettre à jour Docker (dernière version: 18.09.02).
Il est également recommandé de ne jamais faire tourner de containers en tant que root et de contrôler les images Docker qui tournent en production.
EDIT: voire également la communication côté K8S (https://kubernetes.io/blog/2019/02/11/runc-and-cve-2019-5736/) et AWS (https://aws.amazon.com/security/security-bulletins/AWS-2019-002/)
Pour afficher toutes les variables ansible d'un host: ansible -m debug -a "var=hostvars[inventory_hostname]" localhost
C'est super utile pour débuguer les variables réellement prises en compte quand on a des variables qui s'overrident entre les host_vars
, group_vars
, ...
Les jobs CI peuvent être très consomateurs en IOPS, notamment lors des phases de téléchargement des artifacts (maven :) ou docker par exemple...) ou lors du build. Une CI déployée sur des instances EC2 avec des volumes EBS standards (gp2) peut connaitre des temps de réponse particulièrement dégradés lorsqu'elle à dépassé sa capacité de burst et qu'elle est limité en IOPS.
Il est interessant dans ce contexte de monitorer l'EBS Burst Balance sur ces volumes.
En cas de performance limitée par les IOPS EBS, il y a 3 solutions:
- augmenter la taille des EBS pour bénéficier de d'un nombre d'IOPS plus important (nb IOPS = 3 x nb GB)
- passer sur des EBS de type io1 pour bénéficier d'un nombre d'IOPS garanti (souvent moins intéressant en terme de coûts)
- utiliser des instances disposant de SSD internes à la place des EBS (ex: c5d ou m5d instances)
Un top-like pour kubernetes qui permet de monitorer en temps réel les resources K8S mais aussi d'afficher ou éditer leurs définition, d'afficher les logs des pods ou de lancer un kubectl exec
dessus.
Les Operators K8S permettent de déployer un produit (ex: Prometheus, ETCD out Vault...) sur K8S et de gérer toute la configuration sous forme d'objets K8S custom (CRDs). C'est selon moi un des concepts les plus prometteurs de K8S qui permet notamment de déployer le monitoring Prometheus en même temps qu'une appli dans K8S, mais aussi d'automatiser le provisioning de ressources externes cloud nécessaires au fonctionnement de l'application (bucket S3, record DNS ou base DynamoDB par exemple). L'article présente les Operators plus en détail et liste les 120 Operators existant actuellement avec le niveau de maturité de chacun.
Quelques optimisations pour utiliser EKS en production
Les prérequis a connaitre pour utiliser K8S avec le cloud provider AWS qui permet de provisionner automatiquement de ressources ELB et EBS pour les services de type Load balancer et les PersistentVolumes
Pager Duty vient de publier ses procédures de gestion d'incident en Open Source.
Voire également les slides ici: https://response.pagerduty.com/training/courses/incident_response/
Le getting started officiel Hashicorp pour déployer un cluster EKS avec Terraform.
Le code est ici: https://github.com/terraform-providers/terraform-provider-aws/tree/master/examples/eks-getting-started
EDIT:
NOTE: The usage of the specific kubernetes.io/cluster/ resource tags below are required for EKS and Kubernetes to discover and manage networking resources.
NOTE: The usage of the specific kubernetes.io/cluster/ resource tag below is required for EKS and Kubernetes to discover and manage compute resources.
voir également: https://github.com/kubernetes/cloud-provider-aws/blob/8f6e1e3d2cfa20a0deac088b9c4022d433500369/pkg/cloudprovider/providers/aws/tags.go#L30-L52
Je n'ai pas trouvé de doc officielle claire indiquant les tags à mettre en place sur les ressources AWS, mais après avoir passé 2 jours à débugguer pourquoi mes ELB ne se provisionnaient pas, puis pourquoi mes Nodes n'arrivaient pas à joindre le cluster EKS, je confirme que ces tags sont très importants à ajouter sur les ressources suivantes:
- VPC
- Subnets
- Security Groups
- Instances EC2
Pour installer une appli via brew à partir d'une PR pas encore mergée dans master:
brew pull <github_pr_number>
brew install <formula_name>
L'auteur propose de se passer de bastion pour accéder aux resources dans le cloud en ouvrant le port SSH uniquement lorsque l'on a besoin de se connecter à une instance grace à un script qui génère dynamiquement des Security Groups.
La démarche est interessante mais n'apporte pas de solutions pour les instances situés dans des subnets privés et ne disposant pas d'IP publiques.
Une bonne introduction au déploiement d'infra sur Azure avec Ansible et Terraform. A noter l'utilisation du module Ansible pour Terraform.
Suivre à la lettre le principe DRY peut être source d'over-engineering et conduire à créer du code moins lisible/maintenable inutilement. Avec WET, la duplication de code est autorisé lorsque ce code est utilisée 2 fois, le refactoring du code pour limiter la redondance n'intervient qu'au bout de la 3ème utilisation du code.
Un petit tuto pour créer un cluster AKS (K8S managé Azure) avec Terraform.
Un catalogue de helm charts façon DockerHub
Les règles de la communication asynchrone chez GitHub:
- Prefer asynchronous communication
- Don’t underestimate high-fidelity mediums
- Nobody gets fired for opening an issue
- Copy teams, not team members
- Be mindful of noise
- Use checklists to make blockers explicit
- Issues are organization-wide todos
- Master the gentle bump
- Keep discussions logically distinct
- There’s only one way to change something
- Secrets, secrets, are no fun
- Surface work early for feedback
- If you can’t diff it, don’t use it
- Pull requests are community property
- Don’t ping, just ask
Bonus: Overcompensate for tone
Double bonus: If it has a URL, link to it
Une liste exhaustive de bonnes pratiques à mettre en place avant de déployer une infrastructure en production sur AWS
Le SSH ForwardAgent
est déconseillé car il peut potentiellement exposer les clés SSH (cf. https://julien.mailleret.fr/links/?QRAuyw). Il est désormais recommender d'utiliser ProxyJump
sur les versions d'OpenSSH > 7.3 qui remplace ProxyCommand
.
Voir également: https://heipei.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
Example d'utilisation de pre-commit git pour forcer le formattage de code python avec black et flake8
Terratest est un framework de test en Go pour automatiser les tests d'infrastructure Terraform, mais aussi Packer et Docker build.
12 bonnes pratiques a mettre en place quand on publie du code python en open source
Firecracker est un VMM (Virtual Machine Manager) open source light qui s'interface avec KVM pour créer des microvm qui démarrent en moins de 125ms. Le but de Firecracker est de pouvoir bénéficier de la rapidité d'instanciation d'un container avec l'isolation d'une VM. C'est développé par AWS qui l'utilise en interne pour faire tourner AWS Lambda et AWS Fargate.
Super utile pour créer, reviewer et merger des PR GitHub depuis VS Code
L'article propose d'optimiser les coûts d'infrastructures et de bénéficier d'un pseudo chaos engineering sur les clusters k8s en utilisant des spots instances aws (ou équivalent dans les autres clouds).
Des retours d'expériences et conseils pour bien gérer le travail en full-remote
- Habit 1: You analyze every change in the context of the (much) bigger picture
- Habit 2: You’re pragmatic and forward-thinking about that analysis
- Habit 3: You are willing to move on when something isn’t actually helping
- Habit 4: You embrace every opportunity to automate
- Habit 5: You can persuade organizations to do what needs to be done
- Habit 6: You expand your existing skill set to include new tools and approaches
- Habit 7: You trust the process
Une liste de services cloud disposant d'une offre free tier suffisante pour faire tourner un SAAS gratuitement
Atlantis permet d'orchestrer la planification et l'application topologies Terraform depuis des pull requests GitHub, GitLab où BitBucket.
Atlantis fait désormais partie d'Hashicorm (cf. https://medium.com/runatlantis/joining-hashicorp-200ee9572dc5)
- Distinguer la documentation conceptuelle (why-doc) de la documentation pratique (how-doc)
- La documentation conceptuelle (why-doc) a rarement besoin de changement. Celle-ci a toujours sa place dans un wiki ou README
- La documentation pratique (how-doc) a un cycle de vie beaucoup plus court. Elle est composée de snippets immutables d'une ligne qui peuvent être ajoutés et recherchés via un bot Slack.
L'utilisation de Slack a ici plusieurs intérêts:
- Chaque snippet est timestampé et relié a un auteur
- Les snippets sont triés par ordre chronologique du plus récent (Doc la plus fraîche) au plus ancien (potentiellement obsolète)
- L'ajout de snippet est directement intégré au système de communication qui sers aux questions/réponses, quand on pose une question sur Slack, le coût pour ajouter la réponse dans la doc est donc quasi-nul
- En revanche si l'on souhaite se passer de Slack ou d'un équivalent, on pourrait très facilement développer un script permettant d'ajouter/rechercher des snippet timestampés dans un backend (simple fichier versionné, service rest très simple, bdd SQLite) en s'inspirant de certains outils de gestion de todo-list en ligne de commande par example
Erreur rencontrée avec Ansible 2.6.5, Python 2.7.15 et MacOS 10.13 lors de l'execution d'un playbook sur un Windows 2016 Server:
$ ansible-playbook playbook.yml
PLAY [Prepare instance] *********************************************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************************************************************************************
Friday 05 October 2018 11:32:23 +0200 (0:00:00.072) 0:00:00.072 ********
objc[11299]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[11299]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
^C [ERROR]: User interrupted execution
A priori c'est lié à la gestion des forks dans MacOS High Sierra. Le workaround est de faire un export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
avant de lancer Ansible
Le texte d'une conférence qui défend l'idée que l'augmentation de la complexité technologique pour en améliorer l'efficacité ne permet pas de réduire la consommation, bien au contraire. Le texte montre aussi que la basse technologique (Low Tech), ou une société sobre, ne signifie pas non plus le retour à la caverne.
Superbe discours de François Ruffin contre les politiques de croissance.
Un tuto pour faire tourner une webapp sur un cluster K8S GKE minimal (3 nodes f1-micro / 600Mb RAM) pour 5$ par mois
Amazon permet désormais d'ouvrir un shell sur les instances EC2 sans passer par SSH via la console web ou la cli AWS.
La doc de l'API S3 avec pour chaque endpoint les permissions IAM nécessaires.
C'est super utile quand on essaie de debugger un provisionning de bucket avec terraform qui plante parce qu'il manque des droits:
TF_LOG=debug terraform apply --target aws_s3_bucket.mon_bucket
puis on cherche l'appel qui plante et on va voir dans la doc les permissions à ajouter à sa policy IAM.
Le simulateur de policy AWS IAM, url à garder sous le coude
Un linter et formatter JSON, c'est super utile pour trouver et corriger les erreurs dans un gros json qui est mal formaté