{"id":979,"date":"2022-09-10T01:09:04","date_gmt":"2022-09-10T01:09:04","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=979"},"modified":"2022-09-10T01:09:04","modified_gmt":"2022-09-10T01:09:04","slug":"oci-usando-tags-e-oci-cli-para-automatizar-delecao-de-recursos","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2022\/09\/10\/oci-usando-tags-e-oci-cli-para-automatizar-delecao-de-recursos\/","title":{"rendered":"OCI &#8211; Usando tags e oci-cli para automatizar dele\u00e7\u00e3o de recursos"},"content":{"rendered":"\n<p>Geralmente as tags s\u00e3o utilizadas para tracking de custo, saber \u00e0 qual departamento determinado recurso est\u00e1 vinculado e seguran\u00e7a, nesse post vou demonstrar como montar uma estrutura de tags e um script para automatizar a exclus\u00e3o de recursos baseado no valor de uma tag.<\/p>\n\n\n\n<p>Primeiro devemos conhecer um pouco mais sobre a estrutura de uma tag e como ela pode ser aplicada aos nossos recursos.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"695\" height=\"657\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/oci-cli-tags.gif\" alt=\"\" class=\"wp-image-981\"\/><\/figure>\n\n\n\n<p><strong>Tag Namespace<\/strong><\/p>\n\n\n\n<p>O namespace pode ser considerado como um grupo de tags, aqui irei usar um chamado Controle.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"684\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image.png\" alt=\"\" class=\"wp-image-984\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image.png 605w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-265x300.png 265w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p><strong>Tag Definition<\/strong><\/p>\n\n\n\n<p>Nela vamos especificar a nossa Tag e tamb\u00e9m o seu tipo que pode ser est\u00e1tico(onde o user pode entrar um valor) ou uma lista de valores (valores pr\u00e9-definidos por algu\u00e9m que possua a permiss\u00e3o de gerenciamento de tags), aqui irei criar uma do tipo lista de valores com os valores Y(o que o script vai apagar) e N (o que o script n\u00e3o vai apagar), tamb\u00e9m vou criar uma do tipo est\u00e1tica para caso o usu\u00e1rio queira especificar um motivo do recurso n\u00e3o ser apagado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"593\" height=\"635\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-1.png\" alt=\"\" class=\"wp-image-985\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-1.png 593w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-1-280x300.png 280w\" sizes=\"auto, (max-width: 593px) 100vw, 593px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"493\" height=\"527\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-2.png\" alt=\"\" class=\"wp-image-987\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-2.png 493w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-2-281x300.png 281w\" sizes=\"auto, (max-width: 493px) 100vw, 493px\" \/><\/figure>\n\n\n\n<p>No fim, isso que teremos criado at\u00e9 o momento<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"709\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-3-1024x709.png\" alt=\"\" class=\"wp-image-989\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-3-1024x709.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-3-300x208.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-3-768x531.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-3.png 1081w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Tags Default<\/strong><\/p>\n\n\n\n<p>Esse \u00e9 um recurso muito importante para que se tenha um controle melhor do seu ambiente, usando uma Tag Default ela \u00e9 automaticamente atribu\u00edda a um compartimento, dessa forma o usu\u00e1rio n\u00e3o precisa(ou \u00e9 obrigado) a definir um valor a ela, no nosso caso, vou definir o nosso namespace Controle ao meu compartimento indo em <strong>Identity > Compartments > Compartment details > Tag Defaults<\/strong> como falei anteriormente, o namespace \u00e9 um agrupamento de tags, sendo assim al\u00e9m dele, voc\u00ea pode especificar qual tag dentro dele vai ser aplicada de forma autom\u00e1tica e caso ela seja do tipo lista de valores qual o valor padr\u00e3o, aqui colocarei padr\u00e3o Y (ou seja, apagar), o usu\u00e1rio precisa de forma explicita alterar o valor da tag caso queira preservar o recurso:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"388\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-4.png\" alt=\"\" class=\"wp-image-990\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-4.png 611w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-4-300x191.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n\n\n\n<p>Quanto ao motivo, vou deixar que o usu\u00e1rio especifique o valor:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"317\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-5.png\" alt=\"\" class=\"wp-image-991\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-5.png 630w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-5-300x151.png 300w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Um ponto legal desse recurso, \u00e9 que a tag \u00e9 aplicada a todos os recursos que est\u00e3o sendo criados pelo usu\u00e1rio, mesmo aqueles que n\u00e3o s\u00e3o criado de forma direta por ele, um exemplo disso \u00e9 o disco de boot de uma VM que \u00e9 criado automaticamente pelo processo, ele vai herdar o valor das tags.<\/p>\n\n\n\n<p>No final, esse vai ser o meu compartimento com as tags aplicadas<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"311\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-8-1024x311.png\" alt=\"\" class=\"wp-image-998\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-8-1024x311.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-8-300x91.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-8-768x233.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-8.png 1245w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Uma dica, ainda n\u00e3o \u00e9 poss\u00edvel controlar para que tag defaults sejam exibidas baseadas em condi\u00e7\u00f5es, ent\u00e3o coloque algum texto na Tag Motivo para facilitar a cria\u00e7\u00e3o, caso n\u00e3o fa\u00e7a isso, o usu\u00e1rio vai ser obrigado a colocar algum valor na tag mesmo que ele queira apagar o recurso.<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Validando a tag<\/p>\n\n\n\n<p>Agora vou simular a cria\u00e7\u00e3o de uma VM no meu compartimento que possui a tag aplicada:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1043\" height=\"657\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/create-instance-tag-1.gif\" alt=\"\" class=\"wp-image-999\"\/><\/figure>\n\n\n\n<p>Veja que ele n\u00e3o pediu nenhum valor de tag para o usu\u00e1rio, mas caso voc\u00ea verifique a aba Tag ver\u00e1 que os valores foram definidos automaticamente:<\/p>\n\n\n\n<p> <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"231\" height=\"89\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-9.png\" alt=\"\" class=\"wp-image-1000\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Como disse, a tag \u00e9 aplicada a todos os recursos que foram criados pelo processo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"884\" height=\"360\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-10.png\" alt=\"\" class=\"wp-image-1001\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-10.png 884w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-10-300x122.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-10-768x313.png 768w\" sizes=\"auto, (max-width: 884px) 100vw, 884px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"701\" height=\"360\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-11.png\" alt=\"\" class=\"wp-image-1002\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-11.png 701w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-11-300x154.png 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>oci cli<\/p>\n\n\n\n<p>Quem me conhece, sabe que sou f\u00e3 de recursos de linha de comando e o oci-cli \u00e9 um deles, ele \u00e9 bem completo e vamos usa-lo para uma pequena automa\u00e7\u00e3o para apagar recursos que possuam determinado valor na tag, esse script foi feito para rodar em um bash e irei passar pelas fun\u00e7\u00f5es presentes nele.<\/p>\n\n\n\n<p class=\"has-vivid-red-background-color has-background has-medium-font-size\">Sugiro que n\u00e3o executem esse c\u00f3digo em ambiente produtivo sem entender o que ele faz! N\u00e3o me responsabilizo por nenhum dano<\/p>\n\n\n\n<p>Identificar regi\u00f5es ativas<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>get_regions() {\noci iam region-subscription list --all  --query 'data&#91;*].\"region-name\"' | sed -e 's\/\\&#91;\/\/g ; s\/\\]\/\/g ; s\/\\\"\/\/g ; s\/\\,\/\/g ; \/^$\/d' > regions.txt\n}<\/code><\/pre>\n\n\n\n<p>Essa fun\u00e7\u00e3o recupera todas as regi\u00f5es que sua conta possui ativa e salva em um arquivo chamado regions.txt<\/p>\n\n\n\n<p>Identificar compartimentos<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>get_compartments(){\noci iam compartment list --all  --access-level ANY --compartment-id-in-subtree true --query 'data&#91;*].id' | sed -e 's\/\\&#91;\/\/g ; s\/\\]\/\/g ; s\/\\\"\/\/g ; s\/\\,\/\/g ; s\/\\}\/\/g ; \/^$\/d' | sed  s\/\\{\/\/g > compartments.txt\n}<\/code><\/pre>\n\n\n\n<p>Com essa fun\u00e7\u00e3o, iremos pegar todos os compartimentos que o usu\u00e1rio que esteja fazendo a chamada possui acesso e salvar os ocids em um arquivo chamados compartments.txt<\/p>\n\n\n\n<p>Juntando tudo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>del_inst(){\r\nwhile read -r region &lt;&amp;3; do\r\n  while read -r compartment  &lt;&amp;4; do\r\n   echo \"Listando recursos em $region compartimento $compartment\"\r\n   oci compute instance list -c $compartment --query 'data&#91;*].{\"NOME:\":\"display-name\",\"TAG-DELETE\":\"defined-tags\".\"Controle\".\"Apagar\",\"TAG-MOTIVO\":\"defined-tags\".\"Controle\".\"Motivo\",\"OCID\":\"id\"}' --output table --region $region > control_inst-$region.txt \r\n\techo \"Listando recursos a serem apagados em $region compartimento $compartment\"\r\n\toci compute instance list -c $compartment --query 'data&#91;?\"defined-tags\".\"Controle\".\"Apagar\"==`Y`].\"id\"'  --region $region | sed -e 's\/\\&#91;\/\/g ; s\/\\]\/\/g ; s\/\\\"\/\/g ; s\/\\,\/\/g ; \/^$\/d'  > del_inst-$region.txt 2>\/dev\/null\r\n\techo \"Apagando VMS da regiao $region compartimento $compartment\"\r\n\twhile read -r inst_del &lt;&amp;5; do\r\n\techo $inst_del\r\n\toci compute instance terminate  --instance-id $inst_del  --force --region $region --preserve-boot-volume false \r\n\tdone 5&lt;del_inst-$region.txt\r\n  done 4&lt;compartments.txt\r\ndone 3&lt;regions.txt\r\n}<\/code><\/pre>\n\n\n\n<p><br>Essa \u00e9 a parte feia do c\u00f3digo e ele possui alguns pontos importantes, ele vai executar um loop em cada regi\u00e3o que esteja no arquivo regions.txt, passando por cada compartimento que esteja no arquivo compartments.txt e vai executar duas chamadas, uma para gerar um arquivo de controle chamado control_inst-$region.txt contendo todas as inst\u00e2ncias que ele encontrou na regi\u00e3o\/compartimento e mostrando o valor da tag Apagar:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oci compute instance list -c $compartment --query 'data&#91;*].{\"NOME:\":\"display-name\",\"TAG-DELETE\":\"defined-tags\".\"Controle\".\"Apagar\",\"OCID\":\"id\"}' --output table --region $region &gt; control_inst-$region.txt<\/code><\/pre>\n\n\n\n<p>Dessa forma voc\u00ea vai ter um hist\u00f3rico.<\/p>\n\n\n\n<p>Depois disso ele vai gerar um arquivo(del_inst-$region.txt) contendo somente o OCID das instancias que possuem a tag Apagar=Y <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oci compute instance list -c $compartment --query 'data&#91;?\"defined-tags\".\"Controle\".\"Apagar\"==`Y`].\"id\"'  --region $region | sed -e 's\/\\&#91;\/\/g ; s\/\\]\/\/g ; s\/\\\"\/\/g ; s\/\\,\/\/g ; \/^$\/d'  > del_inst-$region.txt 2>\/dev\/null<\/code><\/pre>\n\n\n\n<p>E finalmente executamos a leitura do arquivo del_inst-$region.txt passando os ocids como par\u00e2metro da seguinte chamada <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oci compute instance terminate --instance-id $inst_del --force --region $region --preserve-boot-volume false<\/code><\/pre>\n\n\n\n<p>Por que dividi o c\u00f3digo dessa forma? Pois gosto de logs e tamb\u00e9m acredito que dessa forma voc\u00ea tenha mais seguran\u00e7a\/controle do que vai ser executado, uma dica \u00e9 que caso n\u00e3o queira rodar para todas a regi\u00f5es\/compartimentos, basta fazer como o exemplo abaixo, colocando o nome a regi\u00e3o\/compartimento em seus respectivos .txt .<\/p>\n\n\n\n<p>Executando<\/p>\n\n\n\n<p>Aqui executarei apenas para a regi\u00e3o de GRU e meu compartimento<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"112\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-12.png\" alt=\"\" class=\"wp-image-1012\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-12.png 852w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-12-300x39.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-12-768x101.png 768w\" sizes=\"auto, (max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1309\" height=\"865\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/delete-instance-cli.gif\" alt=\"\" class=\"wp-image-1014\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>E caso precise verificar um hist\u00f3rico, basta dar um cat no arquivo  control_inst-$region.txt<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"129\" src=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13-1024x129.png\" alt=\"\" class=\"wp-image-1015\" srcset=\"https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13-1024x129.png 1024w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13-300x38.png 300w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13-768x97.png 768w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13-1536x193.png 1536w, https:\/\/adrianotanaka.com.br\/wp-content\/uploads\/2022\/09\/image-13.png 1614w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Espero que tenham gostado dos exemplos, como pr\u00f3ximo passo, vou publicar o script completo com mais op\u00e7\u00f5es de limpeza.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Geralmente as tags s\u00e3o utilizadas para tracking de custo, saber \u00e0 qual departamento determinado recurso est\u00e1 vinculado e seguran\u00e7a, nesse post vou demonstrar como montar uma estrutura de tags e um script para automatizar a exclus\u00e3o de recursos baseado no valor de uma tag. Primeiro devemos conhecer um pouco mais sobre a estrutura de uma [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1015,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[19,8],"tags":[],"class_list":["post-979","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cli","category-oci"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=979"}],"version-history":[{"count":20,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/979\/revisions"}],"predecessor-version":[{"id":1017,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/979\/revisions\/1017"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/1015"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}