<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bruno Padilha</title>
    <description>The latest articles on Forem by Bruno Padilha (@brunopadz).</description>
    <link>https://forem.com/brunopadz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F381003%2F2a69c2d3-3646-4b3d-b541-51b822261b27.png</url>
      <title>Forem: Bruno Padilha</title>
      <link>https://forem.com/brunopadz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/brunopadz"/>
    <language>en</language>
    <item>
      <title>Próximos passos com Atlantis</title>
      <dc:creator>Bruno Padilha</dc:creator>
      <pubDate>Wed, 19 Jul 2023 16:59:40 +0000</pubDate>
      <link>https://forem.com/brunopadz/proximos-passos-com-atlantis-8b8</link>
      <guid>https://forem.com/brunopadz/proximos-passos-com-atlantis-8b8</guid>
      <description>&lt;p&gt;Oi! Esse dev.to não será mais atualizado, agora eu tenho um Substack com temas do tipo. Me segue por lá! =&amp;gt; &lt;a href="https://blog.padz.dev" rel="noopener noreferrer"&gt;https://blog.padz.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Depois de dois longos anos, é hora de reviver essa série de como continuar sua jornada com automação de infraestrutura como código. Em dois anos, muita coisa mudou, aprendi muito usando Atlantis praticamente toda dia, então espero fechar esse post e em breve terminar a série com um resumão e minhas experiências com Atlantis e Terraform.&lt;/p&gt;

&lt;p&gt;Nesse post, abordarei um pouco sobre instalação e configuração e integração com GitHub.&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciando
&lt;/h2&gt;

&lt;p&gt;Existem alguns modos de instalação, isso vai depender muito de onde você roda sua infraestrutura. Tome cuidado com anti-patterns, aqui vale pensar da seguinte forma "O que vem primeiro? O ovo ou a galinha?". Por isso, pense bem onde você vai subir e rodar sua instância de Atlantis.&lt;/p&gt;

&lt;p&gt;Atualmente (Julho de 2023) existem as seguintes formas de você fazer deploy do Atlantis. Vou deixar links abaixo para cada uma delas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#kubernetes-helm-chart" rel="noopener noreferrer"&gt;Helm Chart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#kubernetes-manifests" rel="noopener noreferrer"&gt;Manifestos Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#kubernetes-kustomize" rel="noopener noreferrer"&gt;Kustomize&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#openshift" rel="noopener noreferrer"&gt;OpenShift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#aws-fargate" rel="noopener noreferrer"&gt;AWS Fargate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#google-kubernetes-engine-gke" rel="noopener noreferrer"&gt;Google Kubernetes Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#google-compute-engine-gce" rel="noopener noreferrer"&gt;Google Compute Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#microsoft-azure" rel="noopener noreferrer"&gt;Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/deployment.html#roll-your-own" rel="noopener noreferrer"&gt;A forma como você quiser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa parte vai depender de como você ou seu time vão querer suportar o Atlantis. A minha dica é, se é um projeto greenfield, comece com uma EC2, AWS Fargate, Google Cloud Run ou uma VM no GCE (Google Compute Engine) e depois pense melhor onde rodar. Abordarei mais sobre patterns e anti-patterns no próximo post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Independente de onde você for fazer deploy do Atlantis, a configuração é igual para qualquer uma delas. O que muda a partir daqui é, com qual Git provider você quer integrar o Atlantis. &lt;/p&gt;

&lt;p&gt;Os providers suportados são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/configuring-webhooks.html#github-github-enterprise" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/configuring-webhooks.html#gitlab" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/configuring-webhooks.html#bitbucket-cloud-bitbucket-org" rel="noopener noreferrer"&gt;Bitbucket Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/configuring-webhooks.html#bitbucket-server-aka-stash" rel="noopener noreferrer"&gt;Bitbucket Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.runatlantis.io/docs/configuring-webhooks.html#azure-devops" rel="noopener noreferrer"&gt;Azure DevOps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como mencionei anteriormente, faremos a configuração passo a passo com GitHub.&lt;/p&gt;

&lt;p&gt;O que você vai precisar ter para os próximos passos é basicamente a URL externa do Atlantis. Vou falar sobre segurança em um próximo post, mas isso vai também depender de sua arquitetura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Se preparando
&lt;/h3&gt;

&lt;p&gt;Como mencionado no último post, você interage com o Atlantis através de eventos de Pull Request (ou Merge Request no GitLab). Para isso, o Atlantis precisa receber webhooks do seu Git provider para que ele funcione.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;De uma forma básica, webhook é uma requisição HTTP que é enviada por um evento a partir de um sistema para outro com um payload com alguns dados. Para saber mais sobre Webhooks, leia &lt;a href="https://blog.bytebytego.com/i/130740815/what-is-a-webhook" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Uma boa estratégia aqui é criar uma secret para o webhook. Essa secret pode ser criada com qualquer gerador de string e deve ser maior que 24 caractéres. Você pode criar com bash utilizando o comando &lt;code&gt;echo | md5sum | head -c 32; echo;&lt;/code&gt; Após gerar salve a secret, você precisará dela mais pra frente.&lt;/p&gt;

&lt;p&gt;Outro passo importante é criar um usuário no GitHub específico (ou utilizar algum já existente) para o Atlantis. Mesmo que a documentação trate como opcional, eu recomendo. Você também pode utilizar um &lt;a href="https://www.runatlantis.io/docs/access-credentials.html#github-app" rel="noopener noreferrer"&gt;GitHub App&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Com esse usuário criado, crie um Personal Access Token com permissões apenas para repo. Também é recomendável que esse token expire de tempos em tempos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6ijuurdbxiluxnd0p5n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6ijuurdbxiluxnd0p5n.png" alt="Configuração de Personal Access Token no Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A partir daqui você já deve estar com o Atlantis rodando e acessível via UI na porta 4141 ou na porta que você expôs no Load Balancer.&lt;br&gt;
Se você tem dúvidas de como subir, me chama no Telegram em &lt;a href="https://t.me/brunopadz" rel="noopener noreferrer"&gt;@brunopadz&lt;/a&gt; ou comenta no post e a gente bate um papo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No GitHub, há duas possibilidades de integração do Atlantis. Ou a nível de organização ou a nível repositório. O processo é o mesmo para ambos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adicione um Webhook, no campo &lt;strong&gt;Payload URL&lt;/strong&gt; coloque &lt;code&gt;https://URL_DO_ATLANTIS/events&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No &lt;strong&gt;Content-type&lt;/strong&gt; coloque application/json.&lt;/li&gt;
&lt;li&gt;No campo &lt;strong&gt;Secret&lt;/strong&gt; cole a secret gerada anteriomente para o Webhook. Se você está criando um Webhook por repositório, a secret deverá ser a mesma.&lt;/li&gt;
&lt;li&gt;Selecione &lt;strong&gt;Let me select individual events&lt;/strong&gt; e selecione:

&lt;ul&gt;
&lt;li&gt;Pull request reviews&lt;/li&gt;
&lt;li&gt;Pushes&lt;/li&gt;
&lt;li&gt;Issue comments&lt;/li&gt;
&lt;li&gt;Pull Requests&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deixe o checkbox &lt;strong&gt;Active&lt;/strong&gt; marcado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafj8bm19tauejminyfkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafj8bm19tauejminyfkb.png" alt="Configuração de Webhook no GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nh8p9050cxjmkuj9fna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nh8p9050cxjmkuj9fna.png" alt="Configuração de permissões de um Webhook no GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ay8n1alz19w1h6u4xkf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ay8n1alz19w1h6u4xkf.png" alt="Teste de Webhook feito pelo GitHub"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Autenticação com cloud provider
&lt;/h3&gt;

&lt;p&gt;O Atlantis funciona basicamente executando os comandos terraform plan e terraform apply. Assim como você roda o Terraform da sua máquina, o Atlantis precisa de credenciais para se comunicar com cloud providers.&lt;/p&gt;

&lt;p&gt;Fica a seu critério como realizar a autenticação. É possível fazer via ENV VARs, EC2 Roles (no caso da AWS) ou GCE Instance Service Accounts no Google.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Para se integrar com múltiplas contas da AWS, é recomendável fazer assume roles. Mais infos sobre isso no próximo post da série.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na AWS recomendo utilizar EC2 Roles. Fica fácil de utilizar tanto no Fargate, quanto no Kubernetes (com IRSA) ou em EC2s.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o Atlantis
&lt;/h2&gt;

&lt;p&gt;Existem 3 formas de configurar o Atlantis:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Através de flags no comando atlantis server&lt;/li&gt;
&lt;li&gt;Utilizando a flag --repo-config para controlar o comportamento do Atlantis em cada repositório e definir o que usuários podem configurar no atlantis.yaml&lt;/li&gt;
&lt;li&gt;Utilizando arquivos atlantis.yaml na raíz dos repositórios que possuem código em Terraform&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dica:&lt;/strong&gt; Existe uma precedência para carregar as configurações. A ordem é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flags&lt;/li&gt;
&lt;li&gt;ENV VARs&lt;/li&gt;
&lt;li&gt;Arquivos de configuração&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como estamos configurando para integração com GitHub, o mínimo de &lt;strong&gt;configurações necessárias&lt;/strong&gt; são as seguintes flags ou ENV VARS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--gh-user&lt;/code&gt; ou &lt;code&gt;ATLANTIS_GH_USER&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--gh-token&lt;/code&gt; ou &lt;code&gt;ATLANTIS_GH_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--gh-webhook-secret&lt;/code&gt; ou &lt;code&gt;ATLANTIS_GH_WEBHOOK_SECRET&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--repo-allowlist&lt;/code&gt; ou &lt;code&gt;ATLANTIS_REPO_ALLOWLIST&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="c"&gt;# Usuário do GitHub que irá fazer os comentários nas Pull Requests&lt;/span&gt;
&lt;span class="nt"&gt;--gh-user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;atlantis-ci-user &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# Personal Access Token do usuário "atlantis-ci-user"&lt;/span&gt;
&lt;span class="nt"&gt;--gh-token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abcdefg123456xyz1337 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# Secret criada para o Webhook&lt;/span&gt;
&lt;span class="nt"&gt;--gh-webhook-secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abcdefg123456xyz1337abcdefg123456xyz1337 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="c"&gt;# List de quais repos que o Atlantis pode rodar dentro de uma organização&lt;/span&gt;
&lt;span class="nt"&gt;--repo-allowlist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'github.com/minha-org/*'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Com essas configurações o Atlantis está pronto para receber os webhooks vindos do GitHub. Para testar, abra uma Pull Request em qualquer repositório que contenha código em Terraform e que esteja na &lt;strong&gt;Allow list&lt;/strong&gt; da configuração.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qtm9nwcgx2n5oq0mgcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qtm9nwcgx2n5oq0mgcx.png" alt="Exemplo de Pull Request"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa mensagem, o Atlantis vai mostrar o output do &lt;code&gt;terraform plan&lt;/code&gt; e você pode interagir com ele através de um comentário na Pull Request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd3pbak842lgu1nvkmpv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhd3pbak842lgu1nvkmpv.png" alt="Exemplo de um fluxo do Atlantis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basicamente, todo comentário é feito com &lt;code&gt;atlantis&lt;/code&gt; ao invés de &lt;code&gt;terraform&lt;/code&gt;. Para todos os possíveis comandos, consulte a &lt;a href="https://www.runatlantis.io/docs/using-atlantis.html" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; ou &lt;code&gt;atlantis help&lt;/code&gt;. Alguns exemplos além do &lt;code&gt;plan&lt;/code&gt; e &lt;code&gt;apply&lt;/code&gt; são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;atlantis import&lt;/code&gt; para importar recursos no state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;atlantis state rm&lt;/code&gt; para remover recursos do state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No próximo post, trarei alguns temas como boas práticas e anti-patterns ao utilizar o Atlantis. &lt;/p&gt;

&lt;p&gt;Até lá!&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>infrastructureascode</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>Iniciando com Atlantis</title>
      <dc:creator>Bruno Padilha</dc:creator>
      <pubDate>Tue, 15 Jun 2021 20:48:38 +0000</pubDate>
      <link>https://forem.com/brunopadz/iniciando-com-atlantis-5dcd</link>
      <guid>https://forem.com/brunopadz/iniciando-com-atlantis-5dcd</guid>
      <description>&lt;p&gt;Oi! Esse dev.to não será mais atualizado, agora eu tenho um Substack com temas do tipo. Me segue por lá! =&amp;gt; &lt;a href="https://blog.padz.dev" rel="noopener noreferrer"&gt;https://blog.padz.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Esse é o primeiro post de uma série sobre o &lt;a href="https://www.runatlantis.io/" rel="noopener noreferrer"&gt;Atlantis&lt;/a&gt;, onde o intuito é dar um mega salto no fluxo de trabalho de quem já utiliza Terraform no dia dia. Se você já:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utiliza Terraform para criar infraestrutura&lt;/li&gt;
&lt;li&gt;Ainda usa o Terraform local&lt;/li&gt;
&lt;li&gt;E sente falta de um ambiente mais colaborativo para desenvolver sua infraestrutura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa série é para você! &lt;/p&gt;

&lt;p&gt;Vamos passar por alguns pontos básicos de como a ferramenta funciona e até explorar alguns modos de deployment. Tudo isso com um &lt;a href="https://github.com/brunopadz/atlantis-101" rel="noopener noreferrer"&gt;repo&lt;/a&gt; no Github para te ajudar com configuração e exemplos.&lt;/p&gt;

&lt;p&gt;Caso você não tenha experiência prévia com Terraform, super recomendo o conteúdo do &lt;a href="https://www.youtube.com/channel/UC3yoPZJdjwOjrHWy_iEP08A/videos" rel="noopener noreferrer"&gt;Igor Souza&lt;/a&gt; no Youtube. :)&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o Atlantis
&lt;/h2&gt;

&lt;p&gt;O Atlantis é uma aplicação que automatiza através de Pull Requests a forma como rodamos o Terraform. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Gosto muito da definição do &lt;a href="https://twitter.com/fidelissauro" rel="noopener noreferrer"&gt;Matheus Fidelis&lt;/a&gt;, que o Atlantis permite fazer GitOps para Terraform. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ele funciona ouvindo Webhooks de plataformas de Git como: Github, Gitlab ou do Bitbucket e retorna o output dos comandos &lt;code&gt;terraform plan&lt;/code&gt; e &lt;code&gt;terraform apply&lt;/code&gt; através de comentários. Ou seja, todo fluxo de trabalho que antes era feito via CLI, terminal, pipeline do Jenkins, agora é feito nos comentários de uma Pull Request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2afb9dxqo9xynyqypx6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2afb9dxqo9xynyqypx6g.png"&gt;&lt;/a&gt;&lt;br&gt;Exemplo de fluxo no trabalho. 🙂
  &lt;/p&gt;

&lt;p&gt;De uma forma mais simples, o Atlantis atua como uma "ponte" entre o Terraform e a plataforma de Git tornando os plans e applies muito mais colaborativos. Mas por quê? Oras, infraestrutura como código é uma abordagem de automação de infraestrutura baseada em princípios de desenvolvimento de software, com reviews, testes, CI/CD e etc...&lt;/p&gt;




&lt;h2&gt;
  
  
  Antes de iniciar
&lt;/h2&gt;

&lt;p&gt;Como mencionei acima, o Atlantis é uma espécie de wrapper do Terraform, por isso, a partir do momento que o Atlantis é adotado, é ele quem define qual versão do Terraform está rodando e é ele quem conhece as secrets e keys dos provedores de cloud, serviços e etc...&lt;/p&gt;

&lt;p&gt;Por isso, a primeira dica é ficar de olho nas &lt;a href="https://github.com/runatlantis/atlantis/releases" rel="noopener noreferrer"&gt;releases&lt;/a&gt; do projeto para saber se a última versão do Terraform já é suportada pelo Atlantis. E não necessariamente utilizar a última versão do Atlantis requer que você atualize seus projetos, por exemplo, é possível utilizar a última versão do Atlantis e para cada repo/projeto utilizar uma versão diferente do Terraform. Veremos sobre isso mais pra frente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Um pouco de mundo real...
&lt;/h3&gt;

&lt;p&gt;Para os projetos do time de e-commerce da Leroy Merlin, nós rodamos o Atlantis como container no Kubernetes, utilizamos Terraform Cloud como backend e uma abordagem com monorepo e multirepo. Alguns projetos como IAM, configuração do Vault e coisas relacionadas a sec, ficam fora do monorepo por uma questão de segurança.&lt;/p&gt;

&lt;p&gt;Nos outros repositórios todo o time de engenharia possui acesso e cada módulo e projeto, possui documentação para auxiliar a criar novos recursos.&lt;/p&gt;

&lt;p&gt;Dependendo do repositório e do projeto é necessário que haja no mínimo "x" aprovações para rodar um &lt;code&gt;atlantis apply&lt;/code&gt;, em outros é necessário aprovação de &lt;code&gt;CODEOWNERS&lt;/code&gt;. O ponto é que não importa sua estrutura atual ou o que você está planejando, o Atlantis vai suportar.&lt;/p&gt;

&lt;p&gt;De uma forma gráfica, o Atlantis funciona assim no nosso time:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51fsr5zrsc97d0m04ttj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51fsr5zrsc97d0m04ttj.png"&gt;&lt;/a&gt;&lt;br&gt;Fluxo do Atlantis no time de e-commerce da Leroy Merlin.
  &lt;/p&gt;




&lt;h2&gt;
  
  
  Indo mais a fundo
&lt;/h2&gt;

&lt;p&gt;Nessa série de posts, utilizarei Github, Kubernetes e AWS. E durante ela, você irá encontrar nesse &lt;a href="https://github.com/brunopadz/atlantis-101" rel="noopener noreferrer"&gt;repo&lt;/a&gt; mais informações e formas de deploy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requerimentos
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;O Atlantis suporta as principais plataformas de Git como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github&lt;/li&gt;
&lt;li&gt;Gitlab&lt;/li&gt;
&lt;li&gt;Bitbucket&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Atlantis suporta todos os tipos de backend, menos o local, já que o Atlantis não tem um banco de dados e não commita o state no git (o que é um mega anti-pattern).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estrutura de diretório e repositórios&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Qualquer seja a estrutura utilizada, o Atlantis vai rodar sem problemas. É possível utilizar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monorepo com vários projetos&lt;/li&gt;
&lt;li&gt;Único repo com um único projeto&lt;/li&gt;
&lt;li&gt;Monorepo com vários projetos e + módulos&lt;/li&gt;
&lt;li&gt;Multirepo (basta ter um webhook para cada um deles)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É possível também utilizar &lt;a href="https://www.terraform.io/docs/language/state/workspaces.html" rel="noopener noreferrer"&gt;Workspaces&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura
&lt;/h3&gt;

&lt;p&gt;O Atlantis é uma aplicação desenvolvida em Go. Com um binário por volta de 40MB e com uma imagem docker por volta de 250MB é super simples de subi-lo no Kubernetes, ECS / Fargate ou instalá-lo em uma instância.&lt;/p&gt;

&lt;p&gt;A comunicação entre o Atlantis e o plataforma de Git é intrínseca. Por exemplo, o Atlantis precisa receber os Webhooks e fazer chamadas para as APIs da plataforma de Git utilizada. Em caso de serviços externos, o Atlantis precisa responder por uma URL válida, já em casos de serviços internos como Github Enterprise, Gitlab Enterprise e Bitbucket Server, isso já não é necessário.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante&lt;/strong&gt;&lt;br&gt;
O Atlantis não possui um banco de dados, todos os arquivos de &lt;code&gt;plan&lt;/code&gt;, binários dos providers e etc são salvos em disco.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Configuração
&lt;/h3&gt;

&lt;p&gt;Existem alguns métodos de configurar o Atlantis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilizando flags no comando &lt;code&gt;atlantis server&lt;/code&gt;, onde também é possível utilizar arquivo de configuração e ENV VARs. Por exemplo: 
```sh
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Flags
&lt;/h1&gt;

&lt;p&gt;atlantis server --gh-token="token/123456/ABCDE"&lt;/p&gt;

&lt;h1&gt;
  
  
  ENV VAR
&lt;/h1&gt;

&lt;p&gt;ATLANTIS_GH_TOKEN='token/123456/ABCDE' atlantis server&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
* Arquivo de configuração para cada repo. Onde o arquivo de configuração `repos.yml` fica junto do server.
* Arquivo de configuração em cada repositório. Onde cada repo possui o seu `atlantis.yml`.

### Utilização

Como deu pra notar, a principal diferença é que a partir de agora, o comando para rodar o Terraform mudou. O comando a ser chamado agora é o `atlantis`. Existem três principais subcomandos:

* `atlantis plan` que roda o `terraform plan` na branch de uma determinada Pull Request. É possível configurar para rodar de forma automática a cada novo commit, evitando intervenções manuais.
* `atlantis apply` que roda o `terraform apply` no plan executado anteriormente. 
* `atlantis help` que mostra a ajuda do Atlantis.

E claro, existem algumas flags em comum no `plan` e no `apply`, que no caso são as:

* `-w` que roda o plan ou apply contra um determinado workspace.
* `-d` que roda o plan ou apply de um projeto dentro de um diretório. Ele é importante quando a uma criação, alteração ou deleção de vários recursos em vários projetos em um único Pull Request. Se não especificado, roda em todos diretórios novos.

```sh


# Roda um plan para no diretório app1
atlantis plan -d app1

# Roda um plan no diretório aws/iam
atlantis plan -d aws/iam


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;E existe o &lt;code&gt;-p&lt;/code&gt; que roda plan e apply para um projeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É possível também utilizar flags do Terraform, como &lt;code&gt;-target&lt;/code&gt;, &lt;code&gt;-var&lt;/code&gt; e &lt;code&gt;-var-file&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gerência do state
&lt;/h3&gt;

&lt;p&gt;Assim como o Terraform, o Atlantis trabalha com state locking. Esse processo ocorre toda vez que um &lt;code&gt;atlantis plan&lt;/code&gt; é executado e o state só será liberado quando a Pull Request for mergeada, fechada ou o plan é deletado de forma manual.&lt;/p&gt;

&lt;p&gt;Vale a pena reforçar que esse state locking é do Atlantis e não do Terraform, onde o state do Atlantis é feito para prevenir várias Pull Requests trabalhando no mesmo projeto e o state do Terraform é feito para prevenir mudanças durante um &lt;code&gt;terraform apply&lt;/code&gt;. Mais infos &lt;a href="https://www.terraform.io/docs/language/state/locking.html" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Nessa primeira parte, abordamos o básico do Atlantis, como ele funciona, qual problema ele resolve e os motivos de utilizá-lo.&lt;/p&gt;

&lt;p&gt;Nos próximos posts iremos nos aprofundar nos passos de instalação, configuração e como trabalhar de uma forma inteligente com Terraform.&lt;/p&gt;

&lt;p&gt;Até mais!&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>atlantis</category>
      <category>devops</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Meu primeiro mês com um System76</title>
      <dc:creator>Bruno Padilha</dc:creator>
      <pubDate>Mon, 15 Feb 2021 23:36:52 +0000</pubDate>
      <link>https://forem.com/brunopadz/meu-primeiro-mes-com-um-system76-2f4e</link>
      <guid>https://forem.com/brunopadz/meu-primeiro-mes-com-um-system76-2f4e</guid>
      <description>&lt;p&gt;Esse post reúne informações sobre meu primeiro mês com um notebook da System76.&lt;/p&gt;

&lt;p&gt;Há quem diga que notebooks feitos para rodar Linux são o &lt;a href="https://www.youtube.com/watch?v=bExHfIQGisM" rel="noopener noreferrer"&gt;futuro&lt;/a&gt;. Vejo cada vez mais meus amigos migrando do MacOS para Linux por questões de privacidade, customização do SO e liberdade. Com System76 não é diferente, os caras desenvolveram um sistema de firmware &lt;a href="https://github.com/system76/firmware-open" rel="noopener noreferrer"&gt;open source&lt;/a&gt;, com suporte a desabilitar o &lt;a href="https://securityboulevard.com/2020/03/new-intel-chipset-bug-utter-chaos-will-reign/" rel="noopener noreferrer"&gt;Intel ME&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fui (ainda sou) usuário da Apple desde meados de 2009, quando comprei meu primeiro Macbook. Os anos foram passando, eu troquei de Macbook mais algumas vezes e até então eu estava trabalhando com um &lt;a href="https://padz.xyz/posts/toolset-2020/" rel="noopener noreferrer"&gt;MacbookPro 15" late 2017&lt;/a&gt; e a decisão maior de trocar de notebook foi por justamente o que a Apple permitia fazer e agora não mais, a liberdade de colocar mais um SSD, aumentar a memória e utilizar por muito mais tempo o hardware. Ainda utilizo meu macbook para fins de estudo, parear com a TV usando AirPlay, mas não para trabalhar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escolha e importação
&lt;/h2&gt;

&lt;p&gt;A ideia era ter um notebook leve, pequeno e claro, com uma boa configuração e a escolha foi o &lt;a href="https://system76.com/laptops/lemur" rel="noopener noreferrer"&gt;Lemur Pro&lt;/a&gt;. Vale a pena mencionar que antes de considerar um System76, analisei outras opções como XPS da Dell (o qual não existe nenhuma doc que diz que suporta Linux 100%) e o Thinkpad da Lenovo (que não tinha em estoque em loja alguma).&lt;/p&gt;

&lt;p&gt;A config que escolhi foi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core i5 11th Gen @ 4.2Ghz&lt;/li&gt;
&lt;li&gt;16GB DDR4&lt;/li&gt;
&lt;li&gt;500GB M2 SSD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como o clock da CPU é bem maior do que o meu Macbook Pro com i7, resolvi ir de i5 mesmo e economizar uma boa grana.&lt;/p&gt;

&lt;p&gt;Fiz o pedido no dia 18 de Dezembro e no mesmo dia recebi um e-mail e uma ligação solicitando a confirmação do pedido, pelo que a pessoa me explicou, foi pelo motivo de ter feito a compra com dados brasileiros e com a entrega nos EUA. Pedido feito, era só aguardar.&lt;/p&gt;

&lt;p&gt;Utilizei o &lt;a href="https://myvipbox.com/pt-BR" rel="noopener noreferrer"&gt;MyVipBox&lt;/a&gt; como serviço de redirecionamento, já que a System76 não envia direto para o Brasil. Como os notebooks são fabricados por pedido, levou uns 10 dias pra ser fabricado e enviado pro meu endereço nos EUA.&lt;br&gt;
O legal do MyVipBox, é que eles tem alguns serviços adicionais, como usar embalagens menores e mais reforçadas e ainda conseguir diminuir o valor do frete. Mesmo assim tive que pagar um valor bem salgado de imposto aqui Brasil, ~ R$3000.&lt;/p&gt;

&lt;p&gt;E no dia 19 de Janeiro, o brinquedo chegou.&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkidxmeqs2mztvbvyfa7c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkidxmeqs2mztvbvyfa7c.jpg" alt="Caixa da encomenda" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A minha primeira impressão foi: que notebook leve e compacto! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Focpwiaoge09254dz4udm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Focpwiaoge09254dz4udm.jpg" alt="Diferença com um macbook 15" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Qualidade
&lt;/h3&gt;

&lt;p&gt;Pesando pouco mais de 1kg e com uma carcaça totalmente preta, o notebook é muito bonito e bem fabricado.&lt;br&gt;
Eu esperava ter o logo da System76 na tampa, e de fato era para ter, porém por algum problema na fabricação foi enviado sem. A galera no &lt;a href="https://www.reddit.com/r/system76" rel="noopener noreferrer"&gt;subredit da System76&lt;/a&gt; reclama bastante do controle de qualidade dos caras. Eu realmente curti demais o notebook todo preto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgdtfmk0p6s8m1vfeng16.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fgdtfmk0p6s8m1vfeng16.jpg" alt="O Lemur Pro" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3uh7cw1k5fphnwb7boj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3uh7cw1k5fphnwb7boj.jpg" alt="Comparativo com macbook" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O teclado dele é retroiluminado e muito (mas muito) parecido com os teclados dos primeiros macbooks retina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conectividade e tela
&lt;/h3&gt;

&lt;p&gt;O notebook tem 2x USB 3, 1 USB-C com suporte a DisplayPort, 1 HDMI, entrada P2, Kesington Lock e leitor de MicroSD.&lt;br&gt;
E ainda suporta até 40GB de RAM e ainda tem um slot M2 livre pra outro SSD nvme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F961t2wiytbhdo3w81pmp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F961t2wiytbhdo3w81pmp.jpg" alt="Portas do Lemur Pro" width="800" height="600"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9dhsm7j7z9ecqi0djgq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9dhsm7j7z9ecqi0djgq.jpg" alt="Portas do Lemur Pro" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obviamente a tela dele não se compara as retinas dos macbooks, mas é uma tela bem decente com antiglare de 14" com suporte a 1080p a 120hz. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmj2wncbt3r91t7eu5k3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnmj2wncbt3r91t7eu5k3.png" alt="120Hz!" width="624" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vale a pena?
&lt;/h2&gt;

&lt;p&gt;Se você está disposto a esperar e encarar a cotação do dólar, super vale. Eu queria muito voltar a usar Linux para o trabalho e consegui encontrar um notebook que preza pela privacidade.&lt;/p&gt;

&lt;p&gt;O único ponto negativo até agora foi o conector da tomada da fonte, que obviamente, veio no padrão americano, mas que por R$20 você compra um padrão brasileiro no Mercado Livre.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe84qjbkvga1ozsam5cjk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe84qjbkvga1ozsam5cjk.jpg" alt="Conector da tomada" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E eu acho que é isso, um post bem consumista 🤭 com as minhas impressões iniciais e com mais imagens e informações do que a &lt;a href="https://twitter.com/brunopadz/status/1351655360076111874?s=21" rel="noopener noreferrer"&gt;thread&lt;/a&gt; que eu fiz quando ele chegou.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi47fcgg87mdsgpzqrxgb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi47fcgg87mdsgpzqrxgb.jpg" alt="1" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F816up19jxzzxjtq3z5f2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F816up19jxzzxjtq3z5f2.jpg" alt="2" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>system76</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
