<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Ho_use</title>
    <link>https://ho-story.tistory.com/</link>
    <description>#한국정보기술연구원BoB 7기   보안제품개발 트랙 수료생
#Team WYP</description>
    <language>ko</language>
    <pubDate>Sun, 17 May 2026 10:09:21 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>IMyoungho</managingEditor>
    <image>
      <title>Ho_use</title>
      <url>https://tistory1.daumcdn.net/tistory/2820958/attach/5a32c6c953754ebe99df440fcd182a19</url>
      <link>https://ho-story.tistory.com</link>
    </image>
    <item>
      <title>[Kubernetes] Kubestronaut 후기</title>
      <link>https://ho-story.tistory.com/344</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 포스팅을 하네요!&lt;br /&gt;&lt;b&gt;드디어 미루고 미뤘던 Kubernetes 자격증을 모두 취득했습니다. 한국에서는 18번째일 것으로 예상됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;Kubestronaut Program&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;Rocket-power your Kubernetes skills. The Kubestronaut program recognises community leaders who have consistently invested in their ongoing education and grown their skill level with Kubernetes.&quot; data-og-host=&quot;www.cncf.io&quot; data-og-source-url=&quot;https://www.cncf.io/training/kubestronaut/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eS6H1/hyW6FE1Czl/aQl7Tx7xsVyB3Wct9as9kk/img.png?width=1800&amp;amp;height=945&amp;amp;face=0_0_1800_945,https://scrap.kakaocdn.net/dn/e4iUA/hyW6FE1CC2/Vd6LQrdTFJvwVBIcoJNL30/img.png?width=1800&amp;amp;height=945&amp;amp;face=0_0_1800_945,https://scrap.kakaocdn.net/dn/dkx2Hn/hyXaGbcCNH/dmXuTUvPpr7cu0Y2U4lzH1/img.jpg?width=975&amp;amp;height=1024&amp;amp;face=0_0_975_1024&quot; data-og-url=&quot;https://www.cncf.io/training/kubestronaut/&quot;&gt;&lt;a href=&quot;https://www.cncf.io/training/kubestronaut/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.cncf.io/training/kubestronaut/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eS6H1/hyW6FE1Czl/aQl7Tx7xsVyB3Wct9as9kk/img.png?width=1800&amp;amp;height=945&amp;amp;face=0_0_1800_945,https://scrap.kakaocdn.net/dn/e4iUA/hyW6FE1CC2/Vd6LQrdTFJvwVBIcoJNL30/img.png?width=1800&amp;amp;height=945&amp;amp;face=0_0_1800_945,https://scrap.kakaocdn.net/dn/dkx2Hn/hyXaGbcCNH/dmXuTUvPpr7cu0Y2U4lzH1/img.jpg?width=975&amp;amp;height=1024&amp;amp;face=0_0_975_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Kubestronaut Program&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rocket-power your Kubernetes skills. The Kubestronaut program recognises community leaders who have consistently invested in their ongoing education and grown their skill level with Kubernetes.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.cncf.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;단순히 가고 싶었던 회사의 우대사항이어서 처음 알게되고, 찾아보니 마크가 멋진 것 같아서 뭐하는데 쓰는건지 알아봤다가,&lt;br /&gt;오토힐링이나 Desired state를 따르는 형태가 신기하기도 하고 앞으로 많이 사용 할 것 같아서 시작했던 kubernetes 자격증을&lt;br /&gt;모두 취득하다니 감회가 새롭네요ㅎㅎ 원래는 자격증에 대해 거부감도 있었는데 시험의 반이상이 hands on인 것도 한몫을 한 것 같습니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;하나라도 만료되면&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;Kubestronaut가 불가한데 기존에 취득했던 CKA, CKAD, CKS가 모두 올해말부터 만료되어서 추석을 맞아 &lt;span style=&quot;color: #333333;&quot;&gt;급하게&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;진행했습니다. 아깝잖아요..ㅠ&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;이왕 자격증 취득을 시작한거 Kubestronaut로 끝을 봐야겠단 생각을 했는데 올해초에 이직을 하면서 여유가 없었고(핑계)&lt;br /&gt;알아보니 KCNA, KCSA는 필기시험이라고 하길래 준비가 어렵지 않을 것 같아서 바로 질렀습니다..ㅎㅎ&lt;br /&gt;집에 오면 졸려서.. 출퇴근시간에 지하철에서 아이패드로 준비했습니다(기존에 kubernetes를 이것저것 다뤄보셨을수록 난이도는 내려갑니다)&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;* 준비 및 난이도&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 CKA, CKS까지 가지고 계신분들은 영어 해석만 잘하신다면 KCNA는 큰어려움 없이 취득할 수 있을 것 같습니다. 추가적으로 보안을 업으로하고계신분들이라면 KCSA도 어려움없이 취득할 것 같습니다.&lt;br /&gt;&lt;br /&gt;KCNA에서 준비할 내용을 굳이 찝어본다면, CNCF 관련 문제가 나오는데 모르면 그냥 찍어야하는 문제라..(예를 들어 약어에 대한 의미를 모르면..) 한번씩 만이라도 쓰윽 보면서 이런게있구나 하면 좋을 것 같습니다. + 추가적으로는 kubernetes만 써보셨다면 ArgoCD나 &lt;span style=&quot;color: #2d2f31;&quot;&gt;Prometheus, &lt;/span&gt;Grafana, GitOps 등이 언제, 어떠한 필요에 의해 사용되는지라도 알고 가셔야 할 것 같습니다(시간이 있으시다면 직접 구축해보시는 걸 추천합니다. 어처피 이중에 적어도 하나는 실무에서 만나게 되실겁니다ㅎㅎ)&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;KCSA의 경우는 보안쪽으로 집중되어있는 시험이기 때문에 kubernetes 보안 관련 리소스나 정책, 인증과 인가, 그리고 주요 컴포넌트나 Admission Control 등의 동작 순서나 과정 등을 알고 있으면 좋고 추가적으로 기본적인 보안 관련 용어에 대한 알고 있으면 좋을 것 같습니다. 저의 경우에는 보안을 업으로 하고있어서 그런지 많이 들어본 용어들도 있었고, CIS Benchmark 분석(?)도 해봐서 그런지 대부분이 이미 직접 해봤던 것들이라 막상 시험이 엄청 어렵게 느껴지진 않았습니다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;따라서 난이도는 &lt;b&gt;CKAD &amp;lt; (KCNA, CKA, KCSA) &amp;lt; CKS&lt;/b&gt; 인 것 같습니다. 가운데 세 개는 사람마다 체감이 달라서 뭉틍그려놨습니다. 너무 어렵게 생각하실 필요는 없을 것 같아요! &lt;br /&gt;&lt;br /&gt;자격증이 하나도 없으시다면 CKA부터 따시고 바로 CKAD, CKS까지 하신뒤 맘편하게 필기 자격증을 취득하시는게 좋을 것 같습니다. 어처피 자격증이 중요한게 아니라 내 것으로 만드는게 중요하다고 생각하기때문에 hands on 시험이 더 도움이 될 것 같습니다. 필기시험은 그냥 내가 알고 있는 개념을 확인하는 용도(?)로 응시한다 라고 생각하시면 좋을 것 같아요.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;* 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필기 자격증인 KCNA, KCSA는 합격하자마자 메일로 합불을 알려줍니다. 메일을 열기전부터 'Congratulations'가 보이면 합격입니다. 자격증 5개를 모두 합격을 하게되면 마지막 자격증 취득 후, &lt;span style=&quot;color: #333333;&quot;&gt;몇 분내로 &lt;/span&gt;kubestronaut가 되었다고 메일로 알려줍니다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;저의 경우, 이 다음에 어떻게 해야하는지 몰라서 여기저기 뒤적거리다가 cncf github를 발견하고 직접 제 프로필과 사진을 PR로 올려놓고 기다렸는데.. 그렇게하는게 아니더군요.. 뭔가 이상했지만 엔지니어들에게 이정도는 바랄 수 있다고 생각했던 것 같아요;;ㅎ&lt;br /&gt;&lt;br /&gt;그냥 &lt;b&gt;가만히 있으면 며칠내로 안내메일과 함께 구글폼&lt;/b&gt;을 보내줍니다. 메일에서 안내해주는데로 구글 폼을 작성해서 제출하면되고, 이때 &lt;b&gt;자켓 사이즈 선택과 자켓을 받을 주소를 입력&lt;/b&gt;하게됩니다(언제오려나..)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;참고로 구글폼으로 제출한 사진과 프로필은 제일위에 첨부해놓은 사이트에 업로드됩니다(메일 안내상 매주 금요일 또는 주말에 일괄적으로 업데이트를 하시는 것 같아요). &lt;b&gt;제출사진의 용량과 크기를 꼭 맞춰주세요 올리시는 분이 굉장히 강조하시는 것 같더라구요..&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;949&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8vkFc/btsJQydsQB4/EvkC9kt59kdaLaqYd4no6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8vkFc/btsJQydsQB4/EvkC9kt59kdaLaqYd4no6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8vkFc/btsJQydsQB4/EvkC9kt59kdaLaqYd4no6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8vkFc%2FbtsJQydsQB4%2FEvkC9kt59kdaLaqYd4no6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1277&quot; height=&quot;949&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;949&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Kubestronaut 자켓(방수기능도 있는거같아요..ㅎㅎ)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;1686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A9BGH/btsKS5CufK6/D37hySLBHIeWBJXsZxCZQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A9BGH/btsKS5CufK6/D37hySLBHIeWBJXsZxCZQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A9BGH/btsKS5CufK6/D37hySLBHIeWBJXsZxCZQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA9BGH%2FbtsKS5CufK6%2FD37hySLBHIeWBJXsZxCZQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2760&quot; height=&quot;1686&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;1686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;이상으로 후기 끝입니다! 추가적으로 궁금하신게 있으시다면 댓글 부탁드립니다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>Infra/Kubernetes</category>
      <category>CKA</category>
      <category>CKAD</category>
      <category>cks</category>
      <category>KCNA</category>
      <category>KCSA</category>
      <category>Kubernetes</category>
      <category>kubestronaut</category>
      <category>kubestronaut jacket</category>
      <category>kubestronaut 자켓</category>
      <category>security</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/344</guid>
      <comments>https://ho-story.tistory.com/344#entry344comment</comments>
      <pubDate>Fri, 27 Sep 2024 20:43:13 +0900</pubDate>
    </item>
    <item>
      <title>[Ansible] 보안설정/모니터링 자동화, Semaphore (스터디 4주차)</title>
      <link>https://ho-story.tistory.com/342</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;벌써 이번 Gasida Ansible 스터디의 마지막 주차이다. 이번주 주제는 보안설정/모니터링 자동화, Semaphore이다. 보안설정과 관련된 내용은 전직장에서 진행했던 인프라 취약점진단과 연관이 크기때문에 굉장히 친숙했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라 취약점 진단을 업으로 하시거나 취약점을 조치하는 인프라 담당자, 개발자, 보안담당자 등 관련이 있는 분들은 모든 진단 항목에 사용하는 것은 쉽지 않지만 자신이 처한 환경에서 Ansible 활용이 가능한 선까지는 충분히 편리함을 맛볼 수 있을 것이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로는 대부분의 기업이 SSH Port는 mgmt로 열어놓았을 가능성이 있으므로 어느정도 활용이 가능할 것이라고 생각한다. 특히 나의 보안 컨설팅 경험상 보안팀의 규모가 작은 기업일수록 소수의 인원이 반복작업으로 인해 공수를 많이 뺏기기 때문에 조치라던지 보안설정 등의 대비가 미흡한 경우가 많다. 따라서 Ansible를 이용하여 한번만 잘 만들어 놓는다면 큰 시간적 이득을 볼 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Semaphore&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- semaphore란 코드관리와 여러사람이 같이 ansible을 관리할 때 사용할 수 있는 오픈소스이다.&lt;/p&gt;
&lt;figure id=&quot;og_1707824414459&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Introduction - Semaphore Docs&quot; data-og-description=&quot;Semaphore is written in pure Go and available for Windows, macOS and Linux (x64, ARM, ARM64). Semaphore is an open-source project with concise and high-quality code.&quot; data-og-host=&quot;docs.semui.co&quot; data-og-source-url=&quot;https://docs.semui.co/&quot; data-og-url=&quot;https://docs.semui.co/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.semui.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.semui.co/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introduction - Semaphore Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Semaphore is written in pure Go and available for Windows, macOS and Linux (x64, ARM, ARM64). Semaphore is an open-source project with concise and high-quality code.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.semui.co&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- semaphore 구축방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707825099409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://github.com/ansible-semaphore/semaphore/releases/download/v2.9.45/semaphore_2.9.45_linux_amd64.deb
sudo dpkg -i semaphore_2.9.45_linux_amd64.deb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;1290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ygXFw/btsEF3dHRWK/iyWYIVNC4TrPBgFt4CKSD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ygXFw/btsEF3dHRWK/iyWYIVNC4TrPBgFt4CKSD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ygXFw/btsEF3dHRWK/iyWYIVNC4TrPBgFt4CKSD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FygXFw%2FbtsEF3dHRWK%2FiyWYIVNC4TrPBgFt4CKSD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1810&quot; height=&quot;1290&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;1290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o7qHr/btsEHrZsf5n/6SC4IPUCOSqEVFPhRmKedK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o7qHr/btsEHrZsf5n/6SC4IPUCOSqEVFPhRmKedK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o7qHr/btsEHrZsf5n/6SC4IPUCOSqEVFPhRmKedK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo7qHr%2FbtsEHrZsf5n%2F6SC4IPUCOSqEVFPhRmKedK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1294&quot; height=&quot;238&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1707825189190&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How to Get Slack Webhook URL | Svix Resoures&quot; data-og-description=&quot;Webhooks in Slack offer an easy and direct way to communicate real-time information to Slack from third-party applications. By following these steps you will be able to obtain the Webhook URL for Slack notifications. Let's get started!&quot; data-og-host=&quot;www.svix.com&quot; data-og-source-url=&quot;https://www.svix.com/resources/guides/how-to-get-slack-webhook-url/&quot; data-og-url=&quot;https://www.svix.com/resources/guides/how-to-get-slack-webhook-url/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKatdS/hyVjhLQHbd/6zFZQbcFP887dIzXxqKlB0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/cbs8zB/hyVjiRvk5v/TKupkwwXAT5oKKVaQLWpa0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/d07Nfh/hyVi8OTEj1/ihByorVKXshDMpsLgS000K/img.png?width=1896&amp;amp;height=901&amp;amp;face=0_0_1896_901&quot;&gt;&lt;a href=&quot;https://www.svix.com/resources/guides/how-to-get-slack-webhook-url/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.svix.com/resources/guides/how-to-get-slack-webhook-url/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKatdS/hyVjhLQHbd/6zFZQbcFP887dIzXxqKlB0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/cbs8zB/hyVjiRvk5v/TKupkwwXAT5oKKVaQLWpa0/img.png?width=1200&amp;amp;height=627&amp;amp;face=0_0_1200_627,https://scrap.kakaocdn.net/dn/d07Nfh/hyVi8OTEj1/ihByorVKXshDMpsLgS000K/img.png?width=1896&amp;amp;height=901&amp;amp;face=0_0_1896_901');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How to Get Slack Webhook URL | Svix Resoures&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Webhooks in Slack offer an easy and direct way to communicate real-time information to Slack from third-party applications. By following these steps you will be able to obtain the Webhook URL for Slack notifications. Let's get started!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.svix.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 설치 시, Slack 알람과 Slack webhook URL을 등록해주었다. 등록 시, 해당 channel에서 incomming-wehbook이 설정된 것을 확인할 수 있었다(slack wehbook 설정은 위의 URl 참고)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FFPQ7/btsEIQxVMhz/G2HKNkTfg08pJX807fwjwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FFPQ7/btsEIQxVMhz/G2HKNkTfg08pJX807fwjwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FFPQ7/btsEIQxVMhz/G2HKNkTfg08pJX807fwjwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFFPQ7%2FbtsEIQxVMhz%2FG2HKNkTfg08pJX807fwjwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1806&quot; height=&quot;674&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1707825326269&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;semaphore service --config=./config.json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnh7Xc/btsEJc1VouA/F3bZTBWdKSb94gky0219A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnh7Xc/btsEJc1VouA/F3bZTBWdKSb94gky0219A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnh7Xc/btsEJc1VouA/F3bZTBWdKSb94gky0219A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdnh7Xc%2FbtsEJc1VouA%2FF3bZTBWdKSb94gky0219A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1986&quot; height=&quot;264&quot; data-origin-width=&quot;1986&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 또한 설정이 완료되면 config.json 파일이 생성되며 &lt;b&gt;해당 파일을 통해 seamphare를 실행&lt;/b&gt;해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-02-13 오후 8.56.36.png&quot; data-origin-width=&quot;3268&quot; data-origin-height=&quot;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxnN0/btsEMXDg4lD/lPfHhKpunarSHkObVqblt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxnN0/btsEMXDg4lD/lPfHhKpunarSHkObVqblt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxnN0/btsEMXDg4lD/lPfHhKpunarSHkObVqblt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxnN0%2FbtsEMXDg4lD%2FlPfHhKpunarSHkObVqblt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3268&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2024-02-13 오후 8.56.36.png&quot; data-origin-width=&quot;3268&quot; data-origin-height=&quot;282&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcG7Bm/btsELpNuDxC/4sWAVKugPS8YXSq09ZkGoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcG7Bm/btsELpNuDxC/4sWAVKugPS8YXSq09ZkGoK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;504&quot; data-filename=&quot;스크린샷 2024-02-13 오후 8.57.51.png&quot; style=&quot;width: 49.8778%; margin-right: 10px;&quot; data-widthpercent=&quot;50.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcG7Bm/btsELpNuDxC/4sWAVKugPS8YXSq09ZkGoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcG7Bm%2FbtsELpNuDxC%2F4sWAVKugPS8YXSq09ZkGoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WPW3v/btsEGhiDIqp/i84igdvuQln5PLN1Hxu7c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WPW3v/btsEGhiDIqp/i84igdvuQln5PLN1Hxu7c1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;910&quot; data-filename=&quot;스크린샷 2024-02-13 오후 8.57.58.png&quot; style=&quot;width: 48.9594%;&quot; data-widthpercent=&quot;49.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WPW3v/btsEGhiDIqp/i84igdvuQln5PLN1Hxu7c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWPW3v%2FbtsEGhiDIqp%2Fi84igdvuQln5PLN1Hxu7c1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1728&quot; height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 3000번 포트로 semaphore가 실행중인 것을 확인할 수 있었고 위에서 생성한 계정으로 접속하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- project &amp;amp; key 생성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTDYpb/btsEQeYJxOC/NAeOqZmeN6SuhG1SkPKk00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTDYpb/btsEQeYJxOC/NAeOqZmeN6SuhG1SkPKk00/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;519&quot; data-filename=&quot;스크린샷 2024-02-13 오후 9.04.40.png&quot; style=&quot;width: 44.5335%; margin-right: 10px;&quot; data-widthpercent=&quot;45.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTDYpb/btsEQeYJxOC/NAeOqZmeN6SuhG1SkPKk00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTDYpb%2FbtsEQeYJxOC%2FNAeOqZmeN6SuhG1SkPKk00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1183&quot; height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9uRAY/btsEOSocAEO/0XkzFAbswyedcRicU4xCuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9uRAY/btsEOSocAEO/0XkzFAbswyedcRicU4xCuk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1651&quot; data-origin-height=&quot;594&quot; data-filename=&quot;스크린샷 2024-02-13 오후 9.06.15.png&quot; style=&quot;width: 54.3037%;&quot; data-widthpercent=&quot;54.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9uRAY/btsEOSocAEO/0XkzFAbswyedcRicU4xCuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9uRAY%2FbtsEOSocAEO%2F0XkzFAbswyedcRicU4xCuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1651&quot; height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JkZpu/btsEF6VOwVY/KKFWhXcufKNC7JvSDbYPpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JkZpu/btsEF6VOwVY/KKFWhXcufKNC7JvSDbYPpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JkZpu/btsEF6VOwVY/KKFWhXcufKNC7JvSDbYPpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJkZpu%2FbtsEF6VOwVY%2FKKFWhXcufKNC7JvSDbYPpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1656&quot; height=&quot;323&quot; data-origin-width=&quot;1656&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; project를 생성하고 난 뒤 key store에서 key를 생성해준다. ssh key를 이용할 계정명과 private key값을 복사해주면 된다. key생성에는 3가지 종류가 존재하는데 위와같이 SSH key와 login password, 그리고 none type이 존재한다. none type은 보통 public github 등의 주소를 사용할때와 같이 굳이 나의 인증이 필요없는 경우 종종 사용하게되는 type이다. &lt;b&gt;스터디에서 진행한 실습에 추가로 git key도 등록해주었다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- local path뿐만아니라 git repo로도 진행해보고싶어서 별도로 추가를 해주었다. 따라서 git ssh key와 repo를 생성했다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTpBCp/btsERxXO1oo/9CscsiFjWCdK2mk83bTp7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTpBCp/btsERxXO1oo/9CscsiFjWCdK2mk83bTp7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTpBCp/btsERxXO1oo/9CscsiFjWCdK2mk83bTp7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTpBCp%2FbtsERxXO1oo%2F9CscsiFjWCdK2mk83bTp7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;391&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5SweK/btsEQOyNxzY/DwUgvqX86BznYsd2Pfw2xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5SweK/btsEQOyNxzY/DwUgvqX86BznYsd2Pfw2xk/img.png&quot; data-origin-width=&quot;383&quot; data-origin-height=&quot;388&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.8233%; margin-right: 10px;&quot; data-widthpercent=&quot;40.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5SweK/btsEQOyNxzY/DwUgvqX86BznYsd2Pfw2xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5SweK%2FbtsEQOyNxzY%2FDwUgvqX86BznYsd2Pfw2xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02qi6/btsEPLvIoDG/X8oWfNVNkBBJZrRLfhO11k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02qi6/btsEPLvIoDG/X8oWfNVNkBBJZrRLfhO11k/img.png&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;672&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.0139%;&quot; data-widthpercent=&quot;59.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02qi6/btsEPLvIoDG/X8oWfNVNkBBJZrRLfhO11k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02qi6%2FbtsEPLvIoDG%2FX8oWfNVNkBBJZrRLfhO11k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;983&quot; height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx8FQT/btsEPHtkIWd/KZGWhEXPXTKfBKySUyfJ3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx8FQT/btsEPHtkIWd/KZGWhEXPXTKfBKySUyfJ3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx8FQT/btsEPHtkIWd/KZGWhEXPXTKfBKySUyfJ3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx8FQT%2FbtsEPHtkIWd%2FKZGWhEXPXTKfBKySUyfJ3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;620&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2060&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBI1Hi/btsEIOtlUWb/JWkmcmSDu0kKoSvWurSXlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBI1Hi/btsEIOtlUWb/JWkmcmSDu0kKoSvWurSXlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBI1Hi/btsEIOtlUWb/JWkmcmSDu0kKoSvWurSXlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBI1Hi%2FbtsEIOtlUWb%2FJWkmcmSDu0kKoSvWurSXlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2060&quot; height=&quot;668&quot; data-origin-width=&quot;2060&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oyKjK/btsEM0NyxIA/sZcf3HKVHc9vfCjOkY3ykk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oyKjK/btsEM0NyxIA/sZcf3HKVHc9vfCjOkY3ykk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oyKjK/btsEM0NyxIA/sZcf3HKVHc9vfCjOkY3ykk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyKjK%2FbtsEM0NyxIA%2FsZcf3HKVHc9vfCjOkY3ykk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1652&quot; height=&quot;260&quot; data-origin-width=&quot;1652&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; facts와 users Task 모두 정상적으로 성공하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- users task에 변수를 추가해서 진행해보았다(이번엔 local repo 이용)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzgbyh/btsELs4zcXZ/uqpvZnSd81ZkK6dfVBpHw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzgbyh/btsELs4zcXZ/uqpvZnSd81ZkK6dfVBpHw0/img.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;627&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.573%; margin-right: 10px;&quot; data-widthpercent=&quot;35.99&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzgbyh/btsELs4zcXZ/uqpvZnSd81ZkK6dfVBpHw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzgbyh%2FbtsELs4zcXZ%2FuqpvZnSd81ZkK6dfVBpHw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOV7d/btsEHIGQcet/mn98QLny5AT2IaEgnJ3SH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOV7d/btsEHIGQcet/mn98QLny5AT2IaEgnJ3SH1/img.png&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;488&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.2642%;&quot; data-widthpercent=&quot;64.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOV7d/btsEHIGQcet/mn98QLny5AT2IaEgnJ3SH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqOV7d%2FbtsEHIGQcet%2Fmn98QLny5AT2IaEgnJ3SH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drE2gM/btsEQNNsfNe/o2t4DHJokfQFwiC3dHhic0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drE2gM/btsEQNNsfNe/o2t4DHJokfQFwiC3dHhic0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drE2gM/btsEQNNsfNe/o2t4DHJokfQFwiC3dHhic0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrE2gM%2FbtsEQNNsfNe%2Fo2t4DHJokfQFwiC3dHhic0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1904&quot; height=&quot;406&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 기존의 cloudneta 뿐만아니라 aws계정까지 생성된 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;# 스터디 도전과제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[+] 해당 도전과제는 모두 동일한 ansible.cfg와 inventory를 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707814294163&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT&amp;gt; ansible.cfg
[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
EOT

cat &amp;lt;&amp;lt;EOT&amp;gt; inventory
[tnode]
tnode1
tnode2
tnode3
EOT&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제1&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 최신 Linux 보안 가이드를 검색하여 '계정관리 혹은 파일 디렉터리 관리'에 대한 설정확인 및 보안 설정 플레이북을 작성해보자.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ 주요정보통신기반시설 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;U-01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;] root 계정 원격접속제한을 playbook으로 생성&lt;/p&gt;
&lt;pre id=&quot;code_1707803681351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: tnode2
  tasks:
    - name: Check PermitRootLogin Options
      ansible.builtin.shell: cat /etc/ssh/sshd_config | grep -i '^PermitRootLogin' | awk '{print $2}'
      register: permit_root_login_result

    - name: Process based on PermitRootLogin setting
      ansible.builtin.debug:
        msg: &quot;PermitRootLogin is yes&quot;
      when: permit_root_login_result.stdout == &quot;yes&quot;

    - name: Process based on PermitRootLogin setting
      ansible.builtin.debug:
        msg: &quot;PermitRootLogin is no&quot;
      when: permit_root_login_result.stdout == &quot;no&quot;

    - name: Change PermitRootLogin
      ansible.builtin.shell: sed -i 's/^PermitRootLogin yes$/PermitRootLogin no/' /etc/ssh/sshd_config; (cat /etc/ssh/sshd_config | egrep -i '^PermitRootLogin')
      register: result_option
      notify:
        - Print option
        - Service Restart
      when: permit_root_login_result.stdout == &quot;yes&quot; 

  handlers:    
    - name: Print option
      ansible.builtin.debug:
        msg: &quot;After changing option: {{ result_option.stdout_lines }}&quot;

    - name: Service Restart
      ansible.builtin.service:
        name: &quot;sshd&quot;
        state: restarted&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQLBE/btsEGOUByXt/LAxvCJKyouc8nxVN30MUp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQLBE/btsEGOUByXt/LAxvCJKyouc8nxVN30MUp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQLBE/btsEGOUByXt/LAxvCJKyouc8nxVN30MUp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQLBE%2FbtsEGOUByXt%2FLAxvCJKyouc8nxVN30MUp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1842&quot; height=&quot;654&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHd14p/btsEHIfqTl5/z9FLuRRVjZJF6bzsst5QZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHd14p/btsEHIfqTl5/z9FLuRRVjZJF6bzsst5QZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHd14p/btsEHIfqTl5/z9FLuRRVjZJF6bzsst5QZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHd14p%2FbtsEHIfqTl5%2Fz9FLuRRVjZJF6bzsst5QZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1928&quot; height=&quot;92&quot; data-origin-width=&quot;1928&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; PermitRootLogin이 no로 변경되었으며 ssh service가 재시작되어 정상 패스워드를 입력해도 root로 로그인할 수 없게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제2&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 12.1의 수집 결과를 날짜와 시간이 포함된 log 파일 이름으로 저장되게 하고, Crontab을 활용하여 30분 마다 반복 실행 될 수 있게 설정해보자.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[참고] cron의 일정표현을 빠르고 편리하게 확인할 수 있는 페이지&lt;/p&gt;
&lt;figure id=&quot;og_1707829385331&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i6XZC/hyVjd3FVZZ/9KUUipEzWp2aLXs67C2TY0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot; data-og-url=&quot;https://crontab.guru/&quot; data-og-source-url=&quot;https://crontab.guru/&quot; data-og-host=&quot;crontab.guru&quot; data-og-description=&quot;&quot; data-og-title=&quot;Crontab.guru - The cron schedule expression generator&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://crontab.guru/&quot; data-source-url=&quot;https://crontab.guru/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i6XZC/hyVjd3FVZZ/9KUUipEzWp2aLXs67C2TY0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Crontab.guru - The cron schedule expression generator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;crontab.guru&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 12.1 수집용 playbook 내용(monitoring_facts.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707809649496&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode
  become: true 
  vars:
    log_directory: /var/log/daily_check

  tasks:
    - name: Print system info
      ansible.builtin.debug:
        msg:
        - &quot;################ Start #####################&quot;
        - &quot;Date: {{ ansible_facts.date_time.date }} {{ ansible_facts.date_time.time }}&quot; 
        - &quot;HostName: {{ ansible_facts.hostname }}&quot;
        - &quot;OS: {{ ansible_facts.distribution }}&quot;
        - &quot;OS Version: {{ ansible_facts.distribution_version }}&quot;
        - &quot;OS Kernel: {{ ansible_facts.kernel }}&quot;
        - &quot;CPU Cores: {{ ansible_facts.processor_vcpus }}&quot;
        - &quot;Memory: {{ ansible_facts.memory_mb.real }}&quot;
        - &quot;Interfaces: {{ ansible_facts.interfaces }}&quot;
        - &quot;IPv4: {{ ansible_facts.all_ipv4_addresses }}&quot;
        - &quot;Devices: {{ ansible_facts.mounts }}&quot;
        - &quot;################# End #######################&quot; 
      register: result

    - name: Create log directory
      ansible.builtin.file:
        path: &quot;{{ log_directory }}&quot;
        state: directory
        mode: '0755'
    
    - name: Print logs to log file
      ansible.builtin.shell: |
        echo &quot;{{ item }}&quot; &amp;gt;&amp;gt; &quot;{{ log_directory }}&quot;/$(date '+%Y%m%d_%H%M').logs
      loop: &quot;{{ result.msg }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 날짜와 시간이름으로 .log파일 생성되도록 수정 진행&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- crontab 진행용 playbook 생성(test.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707809639738&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- name: Schedule playbook execution with cron
  hosts: localhost
  become: true 
  tasks:
    - name: Add entry to crontab test
      ansible.builtin.cron:
        name: &quot;Run Ansible playbook every 2 minutes&quot;
        minute: &quot;*/1&quot;
        user: &quot;ubuntu&quot;
        job: &quot;ansible-playbook -i /home/ubuntu/my-ansible/test2/inventory /home/ubuntu/my-ansible/test2/monitoring_facts.yml &amp;gt; error.log&quot;
      notify:
        - Service Restart

  handlers:    
    - name: Service Restart
      ansible.builtin.service:
        name: &quot;cron&quot;
        state: restarted&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 테스트를 위해 30분이아닌 1분으로 적용, playbook 진행 시, 로그확인을 위해 error.log에 저장되도록 하여서 디버깅을 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- crontab 파일 확인(vi로 수정하도록 실행)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707811655106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export VISUAL=vim; crontab -e&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvXjuT/btsENShrC3P/AZU3m6DkUreNRmPRcsfCF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvXjuT/btsENShrC3P/AZU3m6DkUreNRmPRcsfCF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvXjuT/btsENShrC3P/AZU3m6DkUreNRmPRcsfCF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvXjuT%2FbtsENShrC3P%2FAZU3m6DkUreNRmPRcsfCF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1598&quot; height=&quot;64&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 상단에 해당내용이 존재하는지 확인, 없다면 작성해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 진행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707812236382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook test.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMNPEJ/btsEINA4AYY/5lLFP74Uqa6VmaDdLxSJd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMNPEJ/btsEINA4AYY/5lLFP74Uqa6VmaDdLxSJd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMNPEJ/btsEINA4AYY/5lLFP74Uqa6VmaDdLxSJd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMNPEJ%2FbtsEINA4AYY%2F5lLFP74Uqa6VmaDdLxSJd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2152&quot; height=&quot;672&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 1분뒤 생성되는 error.log파일을 통해 디버깅이 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 로그파일 생성 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707812300933&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; for i in {1..3}; do echo &quot;&amp;gt;&amp;gt; tnode$i &amp;lt;&amp;lt;&quot;; ssh tnode$i ls /var/log/daily_check; echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVoxT/btsEF6VGzpP/rXz5safOXcksg553LBLXkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVoxT/btsEF6VGzpP/rXz5safOXcksg553LBLXkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVoxT/btsEF6VGzpP/rXz5safOXcksg553LBLXkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVoxT%2FbtsEF6VGzpP%2FrXz5safOXcksg553LBLXkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1842&quot; height=&quot;728&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 잘동작하는 것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제3&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 12.2 플레이북에 대상 노드에 ifconfig ens5 정보를 ifconfig.log 파일로 수집 할수 있게 태스크를 추가해보자.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 생성(monitoring_system.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707813351715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: tnode
  vars_files: vars_packages.yml

  tasks:
    - name: Install packages on RedHat
      ansible.builtin.dnf:
        name: &quot;{{ item }}&quot;
        state: present
      loop: &quot;{{ packages }}&quot;
      when: ansible_facts.os_family == &quot;RedHat&quot;

    - name: Install packages on Ubuntu
      ansible.builtin.apt:
        name: &quot;{{ item }}&quot;
        state: present
      loop: &quot;{{ packages }}&quot;
      when: ansible_facts.os_family == &quot;Debian&quot;

    - name: Create log directory
      ansible.builtin.file:
        path: &quot;{{ log_directory }}&quot;
        state: directory

    - name: Monitoring ifconfig
      ansible.builtin.shell: |
        {{ item }} &amp;gt;&amp;gt; {{ log_directory }}/ifconfig.log
      loop:
        - ifconfig ens5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- var_packages.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707813381836&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

log_directory: /home/ubuntu/logs
packages:
  - net-tools&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; ifconfig의 경우 net-tools에 속해있으므로 해당 package가 설치될 수 있도록 작성한다(둘다 같음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707813457092&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook monitoring_system.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUYJp/btsEGQSvKPd/uMkl4hEu64N5hbxHgdfzkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUYJp/btsEGQSvKPd/uMkl4hEu64N5hbxHgdfzkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUYJp/btsEGQSvKPd/uMkl4hEu64N5hbxHgdfzkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUYJp%2FbtsEGQSvKPd%2FuMkl4hEu64N5hbxHgdfzkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1876&quot; height=&quot;758&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 생성된 로그파일 ifconfig.log 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707813514682&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in {1..3}; do echo &quot;&amp;gt;&amp;gt; tnode$i &amp;lt;&amp;lt;&quot;; ssh tnode$i cat logs/ifconfig.log; echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btvuZO/btsENSBLPNv/tpO0sFp6X6aJAMLYy1j3PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btvuZO/btsENSBLPNv/tpO0sFp6X6aJAMLYy1j3PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btvuZO/btsENSBLPNv/tpO0sFp6X6aJAMLYy1j3PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtvuZO%2FbtsENSBLPNv%2FtpO0sFp6X6aJAMLYy1j3PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1840&quot; height=&quot;924&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제4(수정필요)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;* 12.3 &lt;/span&gt;앤서블 갤럭시에서 &amp;lsquo;elasticsearch&amp;rsquo; 롤을 검색하여 es와 kibana를 tnode2에 설치 후 접속해보자.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707814008206&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ansible Galaxy&quot; data-og-description=&quot;&quot; data-og-host=&quot;galaxy.ansible.com&quot; data-og-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/elasticsearch/install/&quot; data-og-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/elasticsearch/install/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/elasticsearch/install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/elasticsearch/install/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ansible Galaxy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;galaxy.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1707814000688&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role install -p test4/ geerlingguy.java
ansible-galaxy role install -p test4/ geerlingguy.elasticsearch
ansible-galaxy role install -p test4/ geerlingguy.kibana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 우선 원하는 경로에 elasticsearch role을 설치해주자. 해당 role 이용에는 geerlingguy.java도 사용되므로 설치해주자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 정보(test.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707814334126&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- hosts: tnode2
  roles:
    - geerlingguy.java
    - geerlingguy.elasticsearch
    - geerlingguy.kibana&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 외부 접속 허용을 위해 defaults/main.yml의 아래의 내용 수정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5mwY8/btsEQcfq5N9/LwyKrCSat7UWfwa4Gw1jn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5mwY8/btsEQcfq5N9/LwyKrCSat7UWfwa4Gw1jn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5mwY8/btsEQcfq5N9/LwyKrCSat7UWfwa4Gw1jn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5mwY8%2FbtsEQcfq5N9%2FLwyKrCSat7UWfwa4Gw1jn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1878&quot; height=&quot;570&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; localhost -&amp;gt; 0.0.0.0으로 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707814357736&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook test.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTtsG3/btsEJbojURr/NiuvVitnPhoUTdqkoyJfmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTtsG3/btsEJbojURr/NiuvVitnPhoUTdqkoyJfmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTtsG3/btsEJbojURr/NiuvVitnPhoUTdqkoyJfmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTtsG3%2FbtsEJbojURr%2FNiuvVitnPhoUTdqkoyJfmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1796&quot; height=&quot;828&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZjHAp/btsEPIZ0IZ0/256Q1K7GZzNdO4AMF5zImk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZjHAp/btsEPIZ0IZ0/256Q1K7GZzNdO4AMF5zImk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZjHAp/btsEPIZ0IZ0/256Q1K7GZzNdO4AMF5zImk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZjHAp%2FbtsEPIZ0IZ0%2F256Q1K7GZzNdO4AMF5zImk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2172&quot; height=&quot;482&quot; data-origin-width=&quot;2172&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; tnode2에 정상적으로 elasticsearch service가 구동중인 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제5&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;* Ansible로&amp;nbsp;AWS&amp;nbsp;EC2를&amp;nbsp;생성해보자&amp;nbsp;&amp;rarr;&amp;nbsp;책&amp;nbsp;18챕터-4&amp;nbsp;혹은&amp;nbsp;구글링&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span data-token-index=&quot;0&quot;&gt;- Ansible을 통해 AWS 자원에 대해서도 관리가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;- AWS SDK(Software Development Kit) 설치 - boto3(python용)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707816183068&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;company&quot; data-og-title=&quot;개발자 도구 - AWS에서의 구축을 위한 SDK 및 프로그래밍 도구 키트&quot; data-og-description=&quot;닫기 피드백을 제공해 주셔서 감사합니다. 피드백은 AWS 경험을 개선하는 데 도움이 됩니다. 피드백에 대한 자세한 정보를 제공하려면 아래의 피드백 단추를 클릭하세요.&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/developer/tools/&quot; data-og-url=&quot;https://aws.amazon.com/ko/developer/tools/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BKjFE/hyVjjv3kds/kxTxuDlps5DXoBK4Sfn9AK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dnVfjZ/hyVjfNY90z/6S5yfB0mLVjiF3CGzpj8CK/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/developer/tools/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/developer/tools/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BKjFE/hyVjjv3kds/kxTxuDlps5DXoBK4Sfn9AK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dnVfjZ/hyVjfNY90z/6S5yfB0mLVjiF3CGzpj8CK/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자 도구 - AWS에서의 구축을 위한 SDK 및 프로그래밍 도구 키트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;닫기 피드백을 제공해 주셔서 감사합니다. 피드백은 AWS 경험을 개선하는 데 도움이 됩니다. 피드백에 대한 자세한 정보를 제공하려면 아래의 피드백 단추를 클릭하세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1707816201430&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Code Examples - Boto3 1.34.39 documentation&quot; data-og-description=&quot;Previous A Sample Tutorial&quot; data-og-host=&quot;boto3.amazonaws.com&quot; data-og-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/guide/examples.html&quot; data-og-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/guide/examples.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/guide/examples.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://boto3.amazonaws.com/v1/documentation/api/latest/guide/examples.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Code Examples - Boto3 1.34.39 documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Previous A Sample Tutorial&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;boto3.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- python &amp;amp; boto3 설치 진행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707816103456&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install python3-pip &amp;amp;&amp;amp; sudo pip3 install boto3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 변수파일 생성(vars.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1707816585147&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

vm_name: test-server
image_id: ami-0382ac14e5f06eb95
instance_type: t3.medium
key_name: k8s-ho
security_group: sg-0d51cf0c124a82c80
region_name: ap-northeast-2
vpc_subnet_id: subnet-0877b12ded9efc29d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook 파일 생성(test.yml)&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707817869989&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;amazon.aws.ec2_instance module &amp;ndash; Create &amp;amp; manage EC2 instances &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;session_token aliases: aws_session_token, security_token, aws_security_token, access_token string&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_instance_module.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_instance_module.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_instance_module.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_instance_module.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;amazon.aws.ec2_instance module &amp;ndash; Create &amp;amp; manage EC2 instances &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;session_token aliases: aws_session_token, security_token, aws_security_token, access_token string&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1707816511191&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: localhost
  vars_files: vars.yml
  
  tasks:
    - name: Create ec2 vm
      amazon.aws.ec2_instance:
        name: &quot;{{ vm_name }}&quot;
        image_id: &quot;{{ image_id }}&quot;
        instance_type: &quot;{{ instance_type }}&quot;
        key_name: &quot;{{ key_name }}&quot;
        security_group: &quot;{{ security_group }}&quot;
        network:
          assign_public_ip: true
        region: &quot;{{ region_name }}&quot;
        vpc_subnet_id: &quot;{{ vpc_subnet_id }}&quot;
      register: vm_info

    - name: Print vm information
      ansible.builtin.debug:
        var: vm_info&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 기존예제는 실행이 안되어서 ansible 예제를 확인해보니 vpc_subnet_id가 없어 추가해주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible-playbook을 통해 생성된 EC2 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CSKwP/btsEMXccU3R/BbhZ6TKoMHeYskKyfMs7x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CSKwP/btsEMXccU3R/BbhZ6TKoMHeYskKyfMs7x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CSKwP/btsEMXccU3R/BbhZ6TKoMHeYskKyfMs7x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCSKwP%2FbtsEMXccU3R%2FBbhZ6TKoMHeYskKyfMs7x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2238&quot; height=&quot;440&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOUyRM/btsEQdS0lsK/lXXQqr8tfFf3F46Tq4Llh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOUyRM/btsEQdS0lsK/lXXQqr8tfFf3F46Tq4Llh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOUyRM/btsEQdS0lsK/lXXQqr8tfFf3F46Tq4Llh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOUyRM%2FbtsEQdS0lsK%2FlXXQqr8tfFf3F46Tq4Llh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;143&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 위에서 설정한대로 생성된 것을 확인할 수 있었다.&lt;/p&gt;</description>
      <category>Infra/Cloud</category>
      <category>ansible</category>
      <category>Gasida</category>
      <category>semaphore</category>
      <category>가시다</category>
      <category>가시다스터디</category>
      <category>모니터링</category>
      <category>보안</category>
      <category>엔서블</category>
      <category>전금</category>
      <category>주통</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/342</guid>
      <comments>https://ho-story.tistory.com/342#entry342comment</comments>
      <pubDate>Tue, 13 Feb 2024 14:02:42 +0900</pubDate>
    </item>
    <item>
      <title>[Ansible] 시스템 구축 및 환경 설정 자동화(스터디 3주차)</title>
      <link>https://ho-story.tistory.com/341</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;3주차는 지금까지 배운 Ansible의 &lt;b&gt;anisble-galaxy, playbook, role, module&lt;/b&gt; 등을 이용해 직접 환경구축 및 테스트를 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이번 포스팅에서는 별도로 개념이 추가된 것이 아니므로 &lt;b&gt;활용에 관련된 도전과제만 작성&lt;/b&gt;해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제1&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* ansible-vault 사용시, AWS SecretManager를 활용해보기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 우선 ansible-vault&amp;nbsp; create를 통해 암호화할 파일(user_secrert.yml)을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 나의 경우 파일 암호화에 쓰일 패스워드를 &lt;b&gt;'Password123'&lt;/b&gt;으로 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1706672944542&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# user_secret.yml
---

user_info:
  - userid: &quot;ansible&quot;
    userpw: &quot;ansiblePw1&quot;
  - userid: &quot;stack&quot;
    userpw: &quot;stackPw1&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwo6jG/btsD8yLY4Nq/ZiyxWD147hnHWua6VUoJY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwo6jG/btsD8yLY4Nq/ZiyxWD147hnHWua6VUoJY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwo6jG/btsD8yLY4Nq/ZiyxWD147hnHWua6VUoJY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwo6jG%2FbtsD8yLY4Nq%2FZiyxWD147hnHWua6VUoJY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;690&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 파일이 ansible-vault에 의해 암호화 된 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Playbook 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706672864038&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: all

  # vault로 사용자 계정 관련 변수가 정의된 파일을 임포트하여 사용
  vars_files:
    - user_secret.yml

  tasks:
  # loop 문을 사용하여 user_info의 userid와 userpw 사용
  - name: Create user
    ansible.builtin.user:
      name: &quot;{{ item.userid }}&quot;
      password: &quot;{{ item.userpw | password_hash('sha512', 'mysecret') }}&quot;
      state: present
      shell: /bin/bash
    loop: &quot;{{ user_info }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 위에서 암호화한 파일의 user id,pw 정보로 계정을 생성하는 Playbook이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- ansible-vault encrypt 파일 사용 시, playbook 실행방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706673270472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook create-user.yaml --ask-vault-pass&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yI3QK/btsEf2K3QlN/2KZTIgMnOgTK8Y5AWrBPZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yI3QK/btsEf2K3QlN/2KZTIgMnOgTK8Y5AWrBPZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yI3QK/btsEf2K3QlN/2KZTIgMnOgTK8Y5AWrBPZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyI3QK%2FbtsEf2K3QlN%2F2KZTIgMnOgTK8Y5AWrBPZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1676&quot; height=&quot;800&quot; data-origin-width=&quot;1676&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 방법은 파일암호화에 사용된 패스워드를 입력하는 옵션인 &lt;b&gt;'--ask-vault-pass'&lt;/b&gt;를 사용한 것이다. 하지만 이 방법은 파이프라인 구성이나 자동화 스트립트 등에 사용 시에는 제약이 따라온다. 이를 해결하는 방법은 &lt;b&gt;'--vault-password-file'&lt;/b&gt; 옵션을 통해 파일 암호화에 사용된 패스워드를 파일에 작성하여 사용하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;AWS Secret Manager&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;'--vault-password-file' 을&lt;/b&gt; 사용하는 방법 역시,  해당 복호화 키 파일의 유출 가능성이 존재하므로 안전한 저장소에서 관리하는 것이 더욱 좋다. 그래서 사용할 수 있는 방법중 하나가 바로 AWS Secret Manager이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- aws secretmanager를 통한 secret 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706678534466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat  &amp;lt;&amp;lt; EOF &amp;gt; secret.json
{
    &quot;password&quot;: &quot;Password123&quot;
}
EOF&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1706678318169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws secretsmanager create-secret --name  secret-file --secret-string file://secret.json --region ap-northeast-2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ntncx/btsEhIZX8pQ/UfC2XgwJk0oCroX1hwEz6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ntncx/btsEhIZX8pQ/UfC2XgwJk0oCroX1hwEz6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ntncx/btsEhIZX8pQ/UfC2XgwJk0oCroX1hwEz6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fntncx%2FbtsEhIZX8pQ%2FUfC2XgwJk0oCroX1hwEz6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;234&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; secret.json에 암호화에 사용될 Key-value 값을 작성한 뒤 해당파일을 인자로 create-secret을 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 존재하는 Secret name 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706678213437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws secretsmanager list-secrets --region ap-northeast-2 | jq -r .SecretList[].Name&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beJKha/btsEaZCSMXG/qaDUkE5QcSaxx9AYutawL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beJKha/btsEaZCSMXG/qaDUkE5QcSaxx9AYutawL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beJKha/btsEaZCSMXG/qaDUkE5QcSaxx9AYutawL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeJKha%2FbtsEaZCSMXG%2FqaDUkE5QcSaxx9AYutawL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1183&quot; height=&quot;255&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; aws-cli나 GUI를 통해 내가 저장한 Secret value를 확인할 수 있었다. 이제 해당 secret을 암호화키로 사용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- aws secretmanager value 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706679123600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws secretsmanager get-secret-value --secret-id secret-file --region ap-northeast-2 | jq -r '.SecretString | fromjson | .password'&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1706681271473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;gt; get-secret.sh &amp;lt;&amp;lt; EOF
#!/bin/bash
aws secretsmanager get-secret-value --secret-id secret-file --region ap-northeast-2 | jq -r '.SecretString | fromjson | .password'
EOF

chmod +x get-secrets.sh&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1706681315410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook  create-user.yaml --vault-password-file ./get-secret.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kUIR9/btsEa4YmdcE/Du3ySuSK9oMzwi5VPY7rvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kUIR9/btsEa4YmdcE/Du3ySuSK9oMzwi5VPY7rvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kUIR9/btsEa4YmdcE/Du3ySuSK9oMzwi5VPY7rvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkUIR9%2FbtsEa4YmdcE%2FDu3ySuSK9oMzwi5VPY7rvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;776&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; shellscript를 파일로 작성해서 --vault-password-file 인자로 넣어주는 방법 외에 다른 여러 방법으로 시도해보았지만 내가 못하는건지 안되는 것 같다(아시는분 댓글 부탁드립니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 계정 생성 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706681547590&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in {1..3}; do ssh ubuntu@tnode$i tail -n 2 /etc/passwd; echo;done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjGzS/btsEhtaVjK7/Kjvkp9Yunn4G6tw0GCaC3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjGzS/btsEhtaVjK7/Kjvkp9Yunn4G6tw0GCaC3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjGzS/btsEhtaVjK7/Kjvkp9Yunn4G6tw0GCaC3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjGzS%2FbtsEhtaVjK7%2FKjvkp9Yunn4G6tw0GCaC3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1694&quot; height=&quot;266&quot; data-origin-width=&quot;1694&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 정상적으로 생성된 것을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제2&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Lookups 플러그인을 활용한 playbook를 직접 작성&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706682043595&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Lookups &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;Lookups Lookup plugins retrieve data from outside sources such as files, databases, key/value stores, APIs, and other services. Like all templating, lookups execute and are evaluated on the Ansible control machine. Ansible makes the data returned by a look&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_lookups.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_lookups.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_lookups.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_lookups.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Lookups &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Lookups Lookup plugins retrieve data from outside sources such as files, databases, key/value stores, APIs, and other services. Like all templating, lookups execute and are evaluated on the Ansible control machine. Ansible makes the data returned by a look&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1922&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epvJTh/btsEdJlC8Y9/r79VRkinkpYVlpXNe2OG1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epvJTh/btsEdJlC8Y9/r79VRkinkpYVlpXNe2OG1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epvJTh/btsEdJlC8Y9/r79VRkinkpYVlpXNe2OG1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepvJTh%2FbtsEdJlC8Y9%2Fr79VRkinkpYVlpXNe2OG1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1922&quot; height=&quot;624&quot; data-origin-width=&quot;1922&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; lookup 플러그인은 playbook 내에서 외부 소스(file, db, key/value stores, APIs 등)에 접근하여 그 내용을 playbook내로 가져와서 사용할 수 있게 해주는 역할을 한다(Jinja2 템플릿 언어에 대한 Ansible 전용 확장 기능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-&amp;nbsp; 랜덤패스워드(문자,숫자,특수문자 3가지조합 + 10자리)를 가진 계정을 생성하는 playbook&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706685365826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all
  tasks:
    - name: Generate and encrypt password
      set_fact:
        encrypted_password: &quot;{{ lookup('ansible.builtin.password', '/home/ubuntu/my-ansible/pw.txt', chars=['ascii_letters', 'digits', 'punctuation'], length=10) | password_hash('sha512') }}&quot;

    - name: Create user with encrypted password
      ansible.builtin.user:
        name: tmp_user
        comment: temp user
        shell: /bin/bash
        state: present # 삭제시 absent 사용
        password: &quot;{{ encrypted_password }}&quot;
      register: user_creation_result

    - name: Show generated password
      debug:
        var: user_creation_result.ansible_facts.user_password&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5YuW/btsEdSKrZrb/jBbHNXhtri3kVXdY1p3fWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5YuW/btsEdSKrZrb/jBbHNXhtri3kVXdY1p3fWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5YuW/btsEdSKrZrb/jBbHNXhtri3kVXdY1p3fWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5YuW%2FbtsEdSKrZrb%2FjBbHNXhtri3kVXdY1p3fWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;168&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; playbook 내에 작성한 것과 같이 10자리의 랜덤패스워드가로 tmp_user가 생성되었고 해당 패스워드는 pw.txt 파일에서 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제 3&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Ubuntu 와 CentOS에 apache http를 설치하는 playbook을 작성(롤/템플릿 사용은 편한대로)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byUcLl/btsEf4wSCtN/p8JbYfeBkkbDwxhUflRjok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byUcLl/btsEf4wSCtN/p8JbYfeBkkbDwxhUflRjok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byUcLl/btsEf4wSCtN/p8JbYfeBkkbDwxhUflRjok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyUcLl%2FbtsEf4wSCtN%2Fp8JbYfeBkkbDwxhUflRjok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;181&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; centos에도 제대로 동작되는지 확인하기 위해 tnode4를 centos를 생성해주고 /etc/hosts와 inventory 파일에 내용을 추가해주었다. 해당 AMI의 경우 AWS marketplace를 통해 생성했다(실습 후 marketplace 구독취소를 해주었다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;# Roles(apache.http) 생성 및 정보&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1706779900749&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy init --init-path ./roles apache.http&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- handlers/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779431217&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
# handlers file for apache.http

- name: Start httpd 
  ansible.builtin.service:
    name: httpd
    state: started&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- tasks/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779508405&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;---
# tasks file for apache.http

- name: Import playbook
  ansible.builtin.include_tasks:
    file: &quot;{{ ansible_facts.distribution }}.yml&quot;

- name: Copy index file when Ubuntu
  ansible.builtin.template:
    src: modify.html
    dest: /var/www/html/index.html
  when: ansible_facts.distribution == &quot;Ubuntu&quot;

- name: Copy index file when CentOS
  ansible.builtin.template:
    src: modify.html
    dest: /var/www/html/index.html
  when: ansible_facts.distribution == &quot;CentOS&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- tasks/CentOS.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779479140&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- name: Install the latest version of Apache in CentOS
  ansible.builtin.yum:
    name: httpd
    state: present
  notify: Start httpd  
  #when: ansible_facts.distribution == &quot;CentOS&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- tasks/Ubuntu.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779496501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- name: Install the latest version of Apache in Ubuntu
  ansible.builtin.apt:
    name: apache2
    state: present
  #when: ansible_facts.distribution == &quot;Ubuntu&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- templetes/modify.html&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779602606&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt; This is Apache server!! &amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779638676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: tnode
  roles:
    - role: apache.http&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s152S/btsEf6O1p5x/TNzbADAEPblBlVIjfMINbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s152S/btsEf6O1p5x/TNzbADAEPblBlVIjfMINbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s152S/btsEf6O1p5x/TNzbADAEPblBlVIjfMINbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs152S%2FbtsEf6O1p5x%2FTNzbADAEPblBlVIjfMINbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;1202&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; playbook 실행결과 ubuntu, centos에 따라 상이하게 apt, yum으로 apache, httpd package가 설치되었다(해당되지 않는 경우 skip됨을 알 수 있음). 상이하게 적용한 점은 ubuntu의 경우 자동으로 apache service가 실행되었으나 centos의 경우 service를 직접 실행해주어야했으므로 handler를 통해 serivce를 start 시켜주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 서비스 정상 실행 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706779807362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in {1..4}; do ssh tnode$i 'hostname;curl -s 127.0.0.1';echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NGsUW/btsEeJ0Puvz/PNHcSQMvjLcwIUVGUo93Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NGsUW/btsEeJ0Puvz/PNHcSQMvjLcwIUVGUo93Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NGsUW/btsEeJ0Puvz/PNHcSQMvjLcwIUVGUo93Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNGsUW%2FbtsEeJ0Puvz%2FPNHcSQMvjLcwIUVGUo93Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1704&quot; height=&quot;262&quot; data-origin-width=&quot;1704&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 모든 관리노드에서 설정한 templates/modify.html 내용으로 service가 실행중임을 확인할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제4&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Jinja2 템플릿을 활용한 예시 playbook를 구글링하여 실습 환경에 맞게 구성(내용 추가 및 수정 중)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706865896110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role init --init-path ./roles myrole.nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- handlers/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706865995434&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
# handlers file for myrole.nginx

- name: Reload daemon
  systemd:
    daemon_reload: yes
- name: Restart nginx
  service:
    name: nginx
    state: restarted&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- template/nginx.conf.j2&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706865938515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 1024;  
}

http {
    sendfile on;
    #tcp_nopush on;
    #tcp_nodelay on;
    keepalive_timeout 65;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    #gzip on;

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        
        root /var/www/html;
        index index.html index.htm;
        
        server_name _;
        
        location / {
            try_files $uri $uri/ =404;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- var/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706865921473&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
# vars file for myrole.nginx
user: imyoungho&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- tasks/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706865964844&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
# tasks file for myrole.nginx

- name: apt update
  apt:
    update_cache: yes

- name: Add User for Nginx
  user:
    name: &quot;{{ user }}&quot;
    shell: /bin/bash
    home: /home/{{ user }}
    createhome: yes

- name: Install Nginx
  apt:
    name: nginx
    state: present

- name: Copy Nginx Configuration
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify:
    - Reload daemon
    - Restart nginx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook file(install_nginx.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706866132451&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
      
- hosts: tnode3
  vars_files:
    - vars/main.yml
  roles:
    - role: myrole.nginx
      become: yes&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brjJgw/btsEmERQEFB/5vdKx6G5dVzvcqfG4xgzp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brjJgw/btsEmERQEFB/5vdKx6G5dVzvcqfG4xgzp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brjJgw/btsEmERQEFB/5vdKx6G5dVzvcqfG4xgzp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrjJgw%2FbtsEmERQEFB%2F5vdKx6G5dVzvcqfG4xgzp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1978&quot; height=&quot;770&quot; data-origin-width=&quot;1978&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제5&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* file과 lineinfile 모듈을 활용하여 /tmp/test.txt 파일을 생성하고 hello 문자열을 추가하는 playbook 작성&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- work.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706842355852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: all
  vars_files: var.yml

  tasks: 
  - name: Create file
    ansible.builtin.file:
      path: &quot;{{ item.filepath }}&quot;
      owner: &quot;{{ item.own }}&quot;
      group: &quot;{{ item.own }}&quot;
      mode: &quot;{{ item.permit }}&quot;
      state: touch
    loop: &quot;{{ fileinfo }}&quot;

  - name: Write String in file
    ansible.builtin.lineinfile:
      path: &quot;{{ item.filepath }}&quot;
      line: &quot;{{ item.string }}&quot;
    loop: &quot;{{ fileinfo }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- var.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706842382012&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fileinfo:
  - string: hello
    own: ubuntu
    filepath: /tmp/test.txt
    permit: 644
    
  - string: byebye
    own: ubuntu
    filepath: /tmp/test2.txt
    permit: 644&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2202&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJMYrq/btsEkDdBOWf/K3wzuO4s9w6krB6VtSoza0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJMYrq/btsEkDdBOWf/K3wzuO4s9w6krB6VtSoza0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJMYrq/btsEkDdBOWf/K3wzuO4s9w6krB6VtSoza0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJMYrq%2FbtsEkDdBOWf%2FK3wzuO4s9w6krB6VtSoza0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2202&quot; height=&quot;834&quot; data-origin-width=&quot;2202&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1706842590777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in {1..3}; do ssh tnode1 ls /tmp/*.txt;echo; done
for i in {1..3}; do ssh tnode1 cat /tmp/*.txt;echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/owg2G/btsEihbrxnO/bxKOVYy9kCGqbas7KOJ3R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/owg2G/btsEihbrxnO/bxKOVYy9kCGqbas7KOJ3R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/owg2G/btsEihbrxnO/bxKOVYy9kCGqbas7KOJ3R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fowg2G%2FbtsEihbrxnO%2FbxKOVYy9kCGqbas7KOJ3R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;536&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;# 도전과제6&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 앤서블 갤럭시에서 PostgreSQL 설치하는 롤을 검색하여, 해당 롤을 통해 tnode3에 설치&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706843252446&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ansible Galaxy&quot; data-og-description=&quot;&quot; data-og-host=&quot;galaxy.ansible.com&quot; data-og-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/&quot; data-og-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://galaxy.ansible.com/ui/standalone/roles/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ansible Galaxy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;galaxy.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;* postgreSQL role install&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible.cfg file&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706862434444&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false
roles_path = ./roles

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- inventory file&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706862476256&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[db]
tnode3

[tnode]
tnode1
tnode2
tnode3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible-galaxy를 통한 role install&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1706864441637&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ansible Galaxy&quot; data-og-description=&quot;&quot; data-og-host=&quot;galaxy.ansible.com&quot; data-og-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/postgresql/documentation/&quot; data-og-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/postgresql/documentation/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/postgresql/documentation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/postgresql/documentation/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ansible Galaxy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;galaxy.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1706843319645&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role install geerlingguy.postgresql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook file (install_postgresql.yml)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706864498740&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- hosts: tnode3
  vars_files:
    - vars/main.yml
  roles:
    - role: geerlingguy.postgresql
      become: yes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- var/main.yml&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706864580873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;postgresql_databases:
  - name: imyoungho_db
postgresql_users:
  - name: imyoungho
    password: qwe123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;* playbook 실행&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1706864627787&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook install_postgresql.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caz6GQ/btsEjTa6yYt/1hLttYoSmUtHENzqhkG5eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caz6GQ/btsEjTa6yYt/1hLttYoSmUtHENzqhkG5eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caz6GQ/btsEjTa6yYt/1hLttYoSmUtHENzqhkG5eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaz6GQ%2FbtsEjTa6yYt%2F1hLttYoSmUtHENzqhkG5eK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1664&quot; height=&quot;786&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- postgreSQL 접속&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706864918449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;psql -U imyoungho -d imyoungho_db -h localhost -p 5432&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1sTng/btsEmE48FES/RO7axkgv4tBw2Ty2gvdlIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1sTng/btsEmE48FES/RO7axkgv4tBw2Ty2gvdlIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1sTng/btsEmE48FES/RO7axkgv4tBw2Ty2gvdlIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1sTng%2FbtsEmE48FES%2FRO7axkgv4tBw2Ty2gvdlIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1470&quot; height=&quot;206&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; tnode3에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위에서 설정한 var/main.yml 설정으로&lt;span&gt; &lt;/span&gt;&lt;/span&gt;postgresql이 구축되었으며 정상적으로 접속까지 가능한 것을 확인할 수 있었다.&lt;/p&gt;</description>
      <category>Infra/Cloud</category>
      <category>ansible</category>
      <category>AWS</category>
      <category>Gasida</category>
      <category>playbook</category>
      <category>Role</category>
      <category>가시다</category>
      <category>엔서블</category>
      <category>자동화</category>
      <category>클라우드</category>
      <category>편리함</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/341</guid>
      <comments>https://ho-story.tistory.com/341#entry341comment</comments>
      <pubDate>Wed, 31 Jan 2024 12:00:34 +0900</pubDate>
    </item>
    <item>
      <title>[Ansible] 반복문과 조건문, Roles(스터디 2주차)</title>
      <link>https://ho-story.tistory.com/340</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 스터디 2주차로 주제는 &lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;반복문과&lt;/span&gt; 조건문, Roles&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Ansible의 반복문과 조건문은 의미 그대로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;반복이 필요할때 사용하거나 특정조건이 충족되었을 때 사용하도록 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한 Ansible Role의 경우 굉장히 유용하다는 생각이 들었다. &lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;똑같다고 할 수는 없지만 디렉토리 구조로 진행되는 과정이 Terraform Module 사용과 비슷하다는 느낌을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible 반복문&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1705716888166&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;&quot; data-og-url=&quot;https://borosan.gitbook.io/ansible-handbook/variables-conditions-loops&quot; data-og-source-url=&quot;https://borosan.gitbook.io/ansible-handbook/variables-conditions-loops&quot; data-og-host=&quot;borosan.gitbook.io&quot; data-og-description=&quot;Just like any other Scripting or programming language we can use variable in ansible playbooks. Variables could store different values for different items. Variables help us to have shorter and more readable playbooks. Imagine we want to apply patches on h&quot; data-og-title=&quot;Variables, Conditionals, Loops - Ansible Handbook&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://borosan.gitbook.io/ansible-handbook/variables-conditions-loops&quot; data-source-url=&quot;https://borosan.gitbook.io/ansible-handbook/variables-conditions-loops&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Variables, Conditionals, Loops - Ansible Handbook&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Just like any other Scripting or programming language we can use variable in ansible playbooks. Variables could store different values for different items. Variables help us to have shorter and more readable playbooks. Imagine we want to apply patches on h&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;borosan.gitbook.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 자주 활용하는 &lt;/b&gt;&lt;b&gt;module:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ansible.builtin.service&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ansible.builtin.shell&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ansible.builtin.file&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- etc...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 사용 키워드: &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- loop( 반복해야하는 항목의 목록 값을 loop로 사용 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- item( 해당하는 값 사용 시 item 변수 이용 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반복문을 이용해 모든 관리서버의 sshd, rsyslog, httpd의 service가 구동되고있는지 확인해보기로했다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705714059532&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 반복문 사용전
---
- hosts: all
  tasks:
    - name: Check sshd state
      ansible.builtin.service:
        name: sshd
        state: started

    - name: Check rsyslog state
      ansible.builtin.service:
        name: rsyslog
        state: started
        
    - name: Check httpd state
      ansible.builtin.service:
        name: httpd
        state: started&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1705714608744&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 반복문 사용

---
- hosts: all
  tasks:
    - name: Check sshd state
      ansible.builtin.service:
        name: &quot;{{ item }}&quot;
        state: started
      loop:
        - sshd
        - rsyslog
        - httpd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt;&amp;nbsp;단순 반복되는 작업을 해야하는 경우 &lt;b&gt;loop&lt;/b&gt;를 이용하여 이와 같이 반복되는 작업을 줄일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- 결과&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/toRGp/btsDHqUNyUp/0x2KoUL6apyXkB4g4mKgz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/toRGp/btsDHqUNyUp/0x2KoUL6apyXkB4g4mKgz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/toRGp/btsDHqUNyUp/0x2KoUL6apyXkB4g4mKgz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtoRGp%2FbtsDHqUNyUp%2F0x2KoUL6apyXkB4g4mKgz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2222&quot; height=&quot;562&quot; data-origin-width=&quot;2222&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 현재 나의 관리서버 환경에는 http daemon이 구동되고 있지 않으므로 다음과 같은 결과를 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[ 도전과제1 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- linux &lt;span data-token-index=&quot;1&quot;&gt;user1~10&lt;/span&gt;(10명) 를 &lt;span data-token-index=&quot;3&quot;&gt;반복문&lt;/span&gt;을 통해서 &lt;span data-token-index=&quot;5&quot;&gt;생성&lt;/span&gt; 후 확인 후 &lt;span data-token-index=&quot;7&quot;&gt;삭제&lt;/span&gt;를 해보자&lt;/p&gt;
&lt;pre id=&quot;code_1705716337791&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all
  tasks:
    # 생성 시, 사용
    - name: Add user
      ansible.builtin.user: 
        name: &quot;{{ 'test' + item | string }}&quot;
      loop: &quot;{{ range(1, 11) | list }}&quot;
    
    # 삭제 시, 사용
    - name: Delete user
      ansible.builtin.user: 
        name: &quot;{{ 'test' + item | string }}&quot;
        state: absent
      loop: &quot;{{ range(1, 11) | list }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nwrHs/btsDEQGsDuh/bZ9Dg7HNF0686sQRwQCUV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nwrHs/btsDEQGsDuh/bZ9Dg7HNF0686sQRwQCUV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nwrHs/btsDEQGsDuh/bZ9Dg7HNF0686sQRwQCUV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnwrHs%2FbtsDEQGsDuh%2FbZ9Dg7HNF0686sQRwQCUV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1622&quot; height=&quot;968&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1705717541199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible -m shell -a &quot;tail -n 10 /etc/passwd&quot; all&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 playbook 사용 시 test계정 10개가 생성 후 삭제된다(캡쳐화면은 삭제부분 주석처리 후 실행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[도전과제 2]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- loop &lt;span data-token-index=&quot;1&quot;&gt;반복문&lt;/span&gt; 중 &lt;span data-token-index=&quot;3&quot;&gt;sequence&lt;/span&gt; 를 이용하여 /var/log/&lt;span data-token-index=&quot;5&quot;&gt;test1 &lt;/span&gt;~ /var/log/&lt;span data-token-index=&quot;7&quot;&gt;test100&lt;/span&gt; &lt;span data-token-index=&quot;9&quot;&gt;100개 파일&lt;/span&gt;(file 모듈)을 &lt;span data-token-index=&quot;11&quot;&gt;생성&lt;/span&gt; 확인 후 &lt;span data-token-index=&quot;13&quot;&gt;삭제&lt;/span&gt;를 해보자&lt;/p&gt;
&lt;pre id=&quot;code_1705717393625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all
  tasks:
   - name: show file(s) contents
     ansible.builtin.file:
      path: /var/log/test{{ item }}.log
      mode: '0600'
      state: touch
     with_sequence: start=1 end=100

   # 삭제 시, 사용
   - name: show file(s) contents
     ansible.builtin.file:
      path: /var/log/test{{ item }}.log
      state: absent
     with_sequence: start=1 end=100&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg13SW/btsDGKMtBWj/goMXXrXBM1EgMhbht0K8K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg13SW/btsDGKMtBWj/goMXXrXBM1EgMhbht0K8K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg13SW/btsDGKMtBWj/goMXXrXBM1EgMhbht0K8K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg13SW%2FbtsDGKMtBWj%2FgoMXXrXBM1EgMhbht0K8K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2452&quot; height=&quot;734&quot; data-origin-width=&quot;2452&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 100개의 로그파일이 '600'권한으로 생성되었다(위의 playbook 진행 시, 생성 후 삭제됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible 조건문&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1705718236321&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Conditionals &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;In a playbook, you may want to execute different tasks or have different goals, depending on the value of a fact (data about the remote system), a variable, or the result of a previous task. You may want the value of some variables to depend on the value o&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Conditionals &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In a playbook, you may want to execute different tasks or have different goals, depending on the value of a fact (data about the remote system), a variable, or the result of a previous task. You may want the value of some variables to depend on the value o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 사용 키워드:&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- when&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 조건 연산자:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;!=&lt;/b&gt; : 값이 같지 않을 때 &lt;b&gt;참&lt;/b&gt; true&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;gt;, &amp;gt;=, &amp;lt;=, &amp;lt;&lt;/b&gt; : &amp;lsquo;초과, &amp;lsquo; 이상&amp;rsquo;, &amp;lsquo;이하&amp;rsquo;, &amp;lsquo;미만&amp;rsquo; 일 때에 &lt;b&gt;참&lt;/b&gt; true&lt;/li&gt;
&lt;li&gt;&lt;b&gt;not&lt;/b&gt; : 조건의 부정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;and, or&lt;/b&gt; : &amp;lsquo;그리고&amp;rsquo;, &amp;lsquo;또는&amp;rsquo;의 의미로 여러 조건의 조합 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;in&lt;/b&gt; : 값이 포함된 경우에 &lt;b&gt;참&lt;/b&gt; true. 예를 들어 2 in &amp;ldquo;1, 2, 3&amp;rdquo; 은 &lt;b&gt;참&lt;/b&gt; true&lt;/li&gt;
&lt;li&gt;&lt;b&gt;is defined&lt;/b&gt; : 변수가 정의된 경우 &lt;b&gt;참&lt;/b&gt; true&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 358px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 28px;&quot;&gt;
&lt;td style=&quot;height: 28px;&quot;&gt;연산예시&lt;/td&gt;
&lt;td style=&quot;height: 28px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;ansible_facts[&amp;rsquo;machine&amp;rsquo;] == &amp;ldquo;x86_64&amp;rdquo;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;ansible_facts[&amp;rsquo;machine&amp;rsquo;] 값이 x86_64와 같으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;max_memory == 512&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;max_memory 값이 512와 같다면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 36px;&quot;&gt;
&lt;td style=&quot;height: 36px;&quot;&gt;min_memory &lt;a href=&quot;https://www.youtube.com/watch?v=u17SmSSQ9rE&quot;&gt;https://www.youtube.com/watch?v=u17SmSSQ9rE&lt;/a&gt; 128&lt;/td&gt;
&lt;td style=&quot;height: 36px;&quot;&gt;min_memory 값이 128보다 작으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory &amp;gt; 256&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 값이 256보다 크면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory &amp;lt;= 256&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 값이 256보다 작거나 같으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory &amp;gt;= 512&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 값이 512보다 크거나 같으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory != 512&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 값이 512와 같지 않으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory is defined&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 라는 변수가 있으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory is not defined&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;min_memory 라는 변수가 없으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;height: 38px;&quot;&gt;memory_available&lt;/td&gt;
&lt;td style=&quot;height: 38px;&quot;&gt;memory 값이 true이며 true, 이때 해당 값이 1이거나 True 또는 yes면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;height: 38px;&quot;&gt;not memory_available&lt;/td&gt;
&lt;td style=&quot;height: 38px;&quot;&gt;memory 값이 false이며 true, 이때 해당 값이 0이거나 False 또는 no면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;ansible_facts[&amp;rsquo;distribution&amp;rsquo;] in supported_distros&lt;/td&gt;
&lt;td style=&quot;height: 40px;&quot;&gt;ansible_facts[&amp;rsquo;distribution&amp;rsquo;]의 값이 supported_distros 라는 변수에 있으면 true&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- run_my_task 변수의 값이 true일 때만 task가 실행되도록 확인해보았다.&lt;/p&gt;
&lt;pre id=&quot;code_1705718337070&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: localhost
  vars:
    run_my_task: true

  tasks:
  - name: echo message
    ansible.builtin.shell: &quot;echo test&quot;
    when: run_my_task
    register: result

  - name: Show result
    ansible.builtin.debug:
      var: result&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgauuX/btsDGLdzdSe/m32w6eA5U5PhHwyt7yOVkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgauuX/btsDGLdzdSe/m32w6eA5U5PhHwyt7yOVkK/img.png&quot; data-alt=&quot;run_my_task 값이 true 인 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgauuX/btsDGLdzdSe/m32w6eA5U5PhHwyt7yOVkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgauuX%2FbtsDGLdzdSe%2Fm32w6eA5U5PhHwyt7yOVkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1660&quot; height=&quot;824&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;run_my_task 값이 true 인 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr3rDU/btsDJjtOSvO/HOHDFIJ6mAsavIU01MLQk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr3rDU/btsDJjtOSvO/HOHDFIJ6mAsavIU01MLQk0/img.png&quot; data-alt=&quot;run_my_task 값이 false 인 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr3rDU/btsDJjtOSvO/HOHDFIJ6mAsavIU01MLQk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr3rDU%2FbtsDJjtOSvO%2FHOHDFIJ6mAsavIU01MLQk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1810&quot; height=&quot;560&quot; data-origin-width=&quot;1810&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;run_my_task 값이 false 인 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 복수조건문 예시 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- and나 or을 사용할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705718692213&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all

  tasks:
    - name: Print os type
      ansible.builtin.debug:
        msg: &amp;gt;-
             OS Type: {{ ansible_facts['distribution'] }}
             Bios_vendor: {{ ansible_facts['bios_vendor'] }}
      when: 
        ( ansible_facts['distribution'] == &quot;Ubuntu&quot; and
          ansible_facts['bios_vendor'] == &quot;Amazon EC2&quot;)
       or
        ( ansible_facts['distribution'] == &quot;CentOS&quot; and
          ansible_facts['distribution_version'] == &quot;22.04&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OOi4/btsDKQRWd9y/7knFnQDQaHLtGqekT9todk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OOi4/btsDKQRWd9y/7knFnQDQaHLtGqekT9todk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OOi4/btsDKQRWd9y/7knFnQDQaHLtGqekT9todk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7OOi4%2FbtsDKQRWd9y%2F7knFnQDQaHLtGqekT9todk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;418&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[도전과제 3]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span data-token-index=&quot;0&quot;&gt;Ubuntu&lt;/span&gt; OS이면서 fqdn으로 &lt;span data-token-index=&quot;2&quot;&gt;tnode1&lt;/span&gt; 인 경우, &lt;span data-token-index=&quot;4&quot;&gt;debug&lt;/span&gt; 모듈을 사용하여 &lt;span data-token-index=&quot;6&quot;&gt;OS 정보&lt;/span&gt;와&lt;span data-token-index=&quot;8&quot;&gt; fqdn 정보&lt;/span&gt;를 출력해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1705719504510&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all
  tasks:
    - name: Node info
      ansible.builtin.debug:
        msg: &amp;gt;-
             fqdn info: {{ ansible_facts['fqdn'] }}
             hostname: {{ ansible_facts['hostname'] }}
             OS Type: {{ ansible_facts['distribution'] }}
      when: 
        - ansible_facts['fqdn'] == &quot;ip-10-10-1-11.ap-northeast-2.compute.internal&quot;
        - ansible_facts['distribution'] == &quot;Ubuntu&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqP77v/btsDGl0sNPb/N41uLaFKK5Oz5ciiBGBmFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqP77v/btsDGl0sNPb/N41uLaFKK5Oz5ciiBGBmFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqP77v/btsDGl0sNPb/N41uLaFKK5Oz5ciiBGBmFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqP77v%2FbtsDGl0sNPb%2FN41uLaFKK5Oz5ciiBGBmFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1790&quot; height=&quot;446&quot; data-origin-width=&quot;1790&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[도전과제 4]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 반복문+조건문을 함께 사용해보자&lt;/p&gt;
&lt;figure id=&quot;og_1705719828767&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Conditionals &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;In a playbook, you may want to execute different tasks or have different goals, depending on the value of a fact (data about the remote system), a variable, or the result of a previous task. You may want the value of some variables to depend on the value o&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html#using-conditionals-in-loops&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html#using-conditionals-in-loops&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html#using-conditionals-in-loops&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html#using-conditionals-in-loops&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Conditionals &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In a playbook, you may want to execute different tasks or have different goals, depending on the value of a fact (data about the remote system), a variable, or the result of a previous task. You may want the value of some variables to depend on the value o&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1706335124633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: all
  tasks:
    - name: Node info
      ansible.builtin.debug:
        msg: &amp;gt;-
             information: {{ ansible_facts[item] }}
      loop:
        - hostname
        - distribution
      when: ansible_facts['distribution'] == &quot;Ubuntu&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;핸들러 및 작업 실패 처리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일부 task시, 시스템 변경 후 추가작업이 필요한 상황이 존재(예를 들어, 서비스 구성 파일 변경 후 변경내용 저장을 위한 서비스 재기동)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이때 사용할 수 있는 것이 Handler이며 다른 작업에서 트리거한 알림에 응답하는 작업.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 host에서 작업이 변경될 때만 핸들러에 통지함&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp; notify문을 이용하여 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rsyslog 재시작 task 실행 시, notify 키워드를 통해 print msg라는 handler 호출&lt;/p&gt;
&lt;pre id=&quot;code_1705720644149&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode2
  tasks:
    - name: restart rsyslog
      ansible.builtin.service:
        name: &quot;rsyslog&quot;
        state: restarted
      notify:
        - print msg

  handlers:
    - name: print msg
      ansible.builtin.debug:
        msg: &quot;rsyslog is restarted&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTnaub/btsDGJte6UZ/MXk61kghMSjI06pK759uGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTnaub/btsDGJte6UZ/MXk61kghMSjI06pK759uGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTnaub/btsDGJte6UZ/MXk61kghMSjI06pK759uGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTnaub%2FbtsDGJte6UZ%2FMXk61kghMSjI06pK759uGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1742&quot; height=&quot;424&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[도전과제 5]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- apache2 패키지를 apt 모듈을 통해서 설치 시, &lt;span data-token-index=&quot;1&quot;&gt;핸들러&lt;/span&gt;를 호출하여 service 모듈로 apache2를 재시작 해보자&lt;/p&gt;
&lt;pre id=&quot;code_1705720824493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode3
  tasks:
    - name: Install apache httpd  (state=present is optional)
      ansible.builtin.apt:
        name: apache2
        state: present
      notify:
      - restart apache

  handlers:
    - name: restart apache
      ansible.builtin.service:
        name: &quot;apache2&quot;
        state: restarted&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AFu3g/btsDGW7svdY/Yk2su1rxvK4jjGEK71OnlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AFu3g/btsDGW7svdY/Yk2su1rxvK4jjGEK71OnlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AFu3g/btsDGW7svdY/Yk2su1rxvK4jjGEK71OnlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAFu3g%2FbtsDGW7svdY%2FYk2su1rxvK4jjGEK71OnlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1972&quot; height=&quot;356&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705720989338&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible -m shell -a &quot;systemctl status apache2&quot; tnode3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sATVO/btsDGYRIS2Q/D0DoI48706jk9U4z5xqy91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sATVO/btsDGYRIS2Q/D0DoI48706jk9U4z5xqy91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sATVO/btsDGYRIS2Q/D0DoI48706jk9U4z5xqy91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsATVO%2FbtsDGYRIS2Q%2FD0DoI48706jk9U4z5xqy91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1836&quot; height=&quot;518&quot; data-origin-width=&quot;1836&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;작업 실패 무시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적으로 Ansible은 task가 실패하면 이후의 모든 task를 건너뛴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작업이 실패한경우에도 다음 task를 실행하기위해 사용하는 것이 바로 &lt;b&gt;'ignore_errors' 키워드&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1705721128904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts : tnode1

  tasks:
    - name: Install apache3
      ansible.builtin.apt:
        name: apache3
        state: latest

    - name: Print msg
      ansible.builtin.debug:
        msg: &quot;Before task is ignored&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wcjzW/btsDKLQD7Jm/oQI3iZriRDIO3A3ebGetzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wcjzW/btsDKLQD7Jm/oQI3iZriRDIO3A3ebGetzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wcjzW/btsDKLQD7Jm/oQI3iZriRDIO3A3ebGetzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwcjzW%2FbtsDKLQD7Jm%2FoQI3iZriRDIO3A3ebGetzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1690&quot; height=&quot;268&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 'Install apache3' task 실패로 다음의 'Print msg'가 실행되지 않은 것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Ignore_errors 키워드 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705721170882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts : tnode1

  tasks:
    - name: Install apache3
      ansible.builtin.apt:
        name: apache3
        state: latest
      ignore_errors: yes

    - name: Print msg
      ansible.builtin.debug:
        msg: &quot;Before task is ignored&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U5wR5/btsDGJfK4yR/hKa3MDd7FpHhTMwVmzfkvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U5wR5/btsDGJfK4yR/hKa3MDd7FpHhTMwVmzfkvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U5wR5/btsDGJfK4yR/hKa3MDd7FpHhTMwVmzfkvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU5wR5%2FbtsDGJfK4yR%2FhKa3MDd7FpHhTMwVmzfkvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1678&quot; height=&quot;446&quot; data-origin-width=&quot;1678&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;'Install apache3' task가 실패했지만 다음 task가 정상적으로 동작함을 알 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;작업 실패 후 Handler 실행&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 일반적으로 작업이 실패하고 해당 호스트에서 Play가 중단되면 이전 작업에서 알림받은 모든 Handler 역시 실행되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 작업이 실패하여 Play가 중단되더라도 알림받은 Handler를 호출하는 키워드가 바로&lt;b&gt; 'forece_handlers: yes'&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1705721378020&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode2

  tasks:
    - name: restart rsyslog
      ansible.builtin.service:
        name: &quot;rsyslog&quot;
        state: restarted
      notify:
        - print msg

    - name: install apache3
      ansible.builtin.apt:
        name: &quot;apache3&quot;
        state: latest

  handlers:
    - name: print msg
      ansible.builtin.debug:
        msg: &quot;rsyslog is restarted&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ly3x3/btsDKv1kz2i/ogRgsRbj9EhnGpk39K3L4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ly3x3/btsDKv1kz2i/ogRgsRbj9EhnGpk39K3L4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ly3x3/btsDKv1kz2i/ogRgsRbj9EhnGpk39K3L4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLy3x3%2FbtsDKv1kz2i%2FogRgsRbj9EhnGpk39K3L4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1756&quot; height=&quot;358&quot; data-origin-width=&quot;1756&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 'forece_handlers: yes' 키워드 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705721423454&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode2
  force_handlers: yes

  tasks:
    - name: restart rsyslog
      ansible.builtin.service:
        name: &quot;rsyslog&quot;
        state: restarted
      notify:
        - print msg

    - name: install apache3
      ansible.builtin.apt:
        name: &quot;apache3&quot;
        state: latest

  handlers:
    - name: print msg
      ansible.builtin.debug:
        msg: &quot;rsyslog is restarted&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HR47M/btsDGJfK5L9/6b1aQGeYApYF6kBiMIGDz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HR47M/btsDGJfK5L9/6b1aQGeYApYF6kBiMIGDz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HR47M/btsDGJfK5L9/6b1aQGeYApYF6kBiMIGDz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHR47M%2FbtsDGJfK5L9%2F6b1aQGeYApYF6kBiMIGDz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;502&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 실패하였음에도 알림(notify)을 받은 handler가 정상적으로 호출된 것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Ansible 블록 및 오류처리&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- block 문법을 통해 오류를 제어할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- block은 작업을 논리적으로 그룹화해주며 block을 통해 작업 실행방법을 제어할 수 있음&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;block&lt;/b&gt; : 실행할 기본 작업을 정의함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rescure&lt;/b&gt; : block 절에 정의된 작업이 실패할 경우 실행할 작업을 정의함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;always&lt;/b&gt; : block 및 rescue 절에 정의된 작업의 성공 또는 실패 여부와 관계 없이 항상 실행되는 작업을 정의함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[예제]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1705722951163&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode2
  vars:
    logdir: /var/log/daily_log
    logfile: todays.log

  tasks:
    - name: Configure Log Env
      block:
        - name: Find Directory
          ansible.builtin.find:
            paths: &quot;{{ logdir }}&quot;
          register: result
          failed_when: &quot;'Not all paths' in result.msg&quot;

      rescue:
        - name: Make Directory when Not found Directory
          ansible.builtin.file:
            path: &quot;{{ logdir }}&quot;
            state: directory
            mode: '0755'

      always:
        - name: Create File
          ansible.builtin.file:
            path: &quot;{{ logdir }}/{{ logfile }}&quot;
            state: touch
            mode: '0644'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; block구문 내의 failed_when 구문을 통해 result.msg에서 &quot;Not all paths&quot;가 발견되면 실패로 처리하게되고 실패로 처리시, rescue 구문이 실행됨, 예제에서는 해당 디렉터리가 없는 경우 생성하게됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; always구문의 경우 이름그대로 항상 실행되며 예제에서는 로그파일을 생헝함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[도전과제 6]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span data-token-index=&quot;1&quot;&gt;block rescure always&lt;/span&gt; 키워드를 사용한 플레이북을 작성하여 테스트 해보자&lt;/p&gt;
&lt;figure id=&quot;og_1705722805924&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Blocks &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;All tasks in a block inherit directives applied at the block level. Most of what you can apply to a single task (with the exception of loops) can be applied at the block level, so blocks make it much easier to set data or directives common to the tasks. Th&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_blocks.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Blocks &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;All tasks in a block inherit directives applied at the block level. Most of what you can apply to a single task (with the exception of loops) can be applied at the block level, so blocks make it much easier to set data or directives common to the tasks. Th&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1705723521823&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---
- hosts: tnode2
  tasks:
    - name: Mangement user
      block:
        - name: Find user
          ansible.builtin.shell: &quot;cat /etc/passwd | grep test1&quot;
          register: result
          failed_when: '&quot;&quot; in result.msg'

      rescue:
        - name: Add user
          ansible.builtin.user:
            name: test1

      always:
        - name: Create manager user
          ansible.builtin.user:
            name: testuser-manager

        - name: Show result
          ansible.builtin.debug:
            var: result&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvOAuo/btsDI7UGbzE/xkhFVnTOhAdNOxtkmkzca0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvOAuo/btsDI7UGbzE/xkhFVnTOhAdNOxtkmkzca0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvOAuo/btsDI7UGbzE/xkhFVnTOhAdNOxtkmkzca0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvOAuo%2FbtsDI7UGbzE%2FxkhFVnTOhAdNOxtkmkzca0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2504&quot; height=&quot;1012&quot; data-origin-width=&quot;2504&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 'test1' 계정이 존재하지않아 block 구문이 실패하였고 failed_when 설정을 통해 rescue 구문이 실행되었다. 따라서 'test1' 계정이 생성되었으며 항상 실행되는 always로 인해 testuser-manager 계정도 생성된 것을 볼 수 있었다(멱등성으로 기존상태 그대로 진행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible Roles&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Playbook 내용을 기능단위로 나누어 공통 부품으로 관리/재사용하기위한 구조를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대규모 프로젝트를 쉽게 관리할 수 있으며 다른 사용자와 동시 개발도 가능해서 굉장히 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 잘 만들어진 Role의 경우 엔서블 갤럭시를 통해 공유하여 다른 사람이 공유한 Role을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Playbook에 전달된 변수를 사용할 수 있다(변수 미설정 시 기본값을 Role의 해당 변수에 설정하기도 한다)&lt;/p&gt;
&lt;figure id=&quot;og_1705721674512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Roles &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;The classic (original) way to use roles is with the roles option for a given play: When you use the roles option at the play level, Ansible treats the roles as static imports and processes them during playbook parsing. Ansible executes each play in this or&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_reuse_roles.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Roles &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The classic (original) way to use roles is with the roles option for a given play: When you use the roles option at the play level, Ansible treats the roles as static imports and processes them during playbook parsing. Ansible executes each play in this or&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Role의 구조는 다음과 같다.&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #37352f; text-align: start; border-collapse: collapse; width: 100%; height: 240px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;하위 디렉터리&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;기능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;defaults&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리의 main.yml 파일에는 롤이 사용될 때 덮어쓸 수 있는 롤 변수의 기본값이 포함되어 있습니다. 이러한 변수는 우선순위가 낮으며 플레이에서 변경할 수 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;files&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리에는 롤 작업에서 참조한 정적 파일이 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;handlers&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리의 main.yml 파일에는 롤의 핸들러 정의가 포함되어 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;meta&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리의 main.yml 파일에는 작성자, 라이센스, 플랫폼 및 옵션, 롤 종속성을 포함한 롤에 대한 정보가 들어 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;tasks&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리의 main.yml 파일에는 롤의 작업 정의가 포함되어 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;templates&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리에는 롤 작업에서 참조할 Jinja2 템플릿이 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;tests&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 20px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리에는 롤을 테스트하는 데 사용할 수 있는 인벤토리와 test.yml 플레이북이 포함될 수 있습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 15.6977%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;vars&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;color: #000000; text-align: start; width: 84.186%; height: 40px;&quot;&gt;
&lt;div&gt;
&lt;div data-content-editable-leaf=&quot;true&quot;&gt;이 디렉터리의 main.yml 파일은 롤의 변수 값을 정의합니다. 종종 이러한 변수는 롤 내에서 내부 목적으로 사용됩니다. 또한 우선순위가 높으며, 플레이북에서 사용될 때 변경되지 않습니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Ansible Role 생성하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible-galaxy를 통해 role을 생성할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705721956497&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role init my-role&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG1qCk/btsDJgRpkUN/AkGZVVzRpeLkJwAWEMSXK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG1qCk/btsDJgRpkUN/AkGZVVzRpeLkJwAWEMSXK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG1qCk/btsDJgRpkUN/AkGZVVzRpeLkJwAWEMSXK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG1qCk%2FbtsDJgRpkUN%2FAkGZVVzRpeLkJwAWEMSXK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1860&quot; height=&quot;568&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; role 생성 시, 위에서 설명한 role 구조대로 디렉터리와 main.yml 파일들이 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 다른사람이 만들어놓은 Role Search 및 상세보기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705722476738&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role search postgresql --platforms Ubuntu
ansible-galaxy role info geerlingguy.postgresql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz8ZxC/btsDJacOXrb/wi0kL3PAeUz5KOzOu10upK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz8ZxC/btsDJacOXrb/wi0kL3PAeUz5KOzOu10upK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz8ZxC/btsDJacOXrb/wi0kL3PAeUz5KOzOu10upK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz8ZxC%2FbtsDJacOXrb%2Fwi0kL3PAeUz5KOzOu10upK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1954&quot; height=&quot;376&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Role Install&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705722622753&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-galaxy role install -p roles geerlingguy.postgresql
tree roles&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/Cloud</category>
      <category>Agentless</category>
      <category>ansible</category>
      <category>Cloud</category>
      <category>Gasida</category>
      <category>security</category>
      <category>보안</category>
      <category>앤서블</category>
      <category>엔서블</category>
      <category>자동화</category>
      <category>클라우드</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/340</guid>
      <comments>https://ho-story.tistory.com/340#entry340comment</comments>
      <pubDate>Fri, 19 Jan 2024 17:13:22 +0900</pubDate>
    </item>
    <item>
      <title>[Ansible] 환경구축 및 기본사용(스터디 1주차)</title>
      <link>https://ho-story.tistory.com/338</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 돌아온 &lt;b&gt;Gasida님 스터디!!&lt;/b&gt; 이번에는 Ansible이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용해보니 굉장히 편리하고 활용도를 높게 사용할 수 있을 거 같단 생각이 들었다(뭔가 이득본 기분...??)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인프라를 구축하는 분들 뿐만 아니라 보안업무 측면에서도 활용도가 높을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(예를 들어 굳이 힘들게 서버를 일일이 들어가서 제어하는 것이 아닌 한번에 제어가 가능하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible이란??&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IT 자동화 도구로Ansible과 Python만 설치할 수 있다면 플레이북(yaml 형식) 작성을 통해&amp;nbsp; IT업무를 여러 환경에서 동일하게 적용 및 실행 할 수 있는 오픈소스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible의 특징&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Agentless:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ansible의 경우 &lt;b&gt;관리노드에 Agent를 설치할 필요가 없으며&lt;/b&gt; &lt;b&gt;SSH를 통해 관리노드에 명령&lt;/b&gt;을 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Idempotent:&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멱등성을 가지기 때문에 여러번 시도해도 항상 같은 결과를 낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Ansible 환경 구축&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Requirement:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python, Ansible&lt;/p&gt;
&lt;pre id=&quot;code_1705018778498&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install ansible -y
apt install python3 -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Options:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amazon EC2, VScode&lt;/p&gt;
&lt;figure id=&quot;og_1705018802095&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;company&quot; data-og-title=&quot;AWS Management Console&quot; data-og-description=&quot;AWS Support 플랜은 AWS로 성공하는 데 도움이 되는 다양한 도구, 프로그램 및 전문 지식에 대한 액세스의 조합을 제공합니다.&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/console/&quot; data-og-url=&quot;https://aws.amazon.com/ko/console/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lNVR1/hyU2iSrB4O/vwyZ2w0KSWp0cfFRKgclv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/P1Jl0/hyU2qiDLnv/CYcTMNpugerC7nybxDlD81/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/console/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/console/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lNVR1/hyU2iSrB4O/vwyZ2w0KSWp0cfFRKgclv1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/P1Jl0/hyU2qiDLnv/CYcTMNpugerC7nybxDlD81/img.png?width=179&amp;amp;height=109&amp;amp;face=0_0_179_109');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AWS Management Console&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AWS Support 플랜은 AWS로 성공하는 데 도움이 되는 다양한 도구, 프로그램 및 전문 지식에 대한 액세스의 조합을 제공합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1705018821412&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Download Visual Studio Code - Mac, Linux, Windows&quot; data-og-description=&quot;Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.&quot; data-og-host=&quot;code.visualstudio.com&quot; data-og-source-url=&quot;https://code.visualstudio.com/download&quot; data-og-url=&quot;https://code.visualstudio.com/Download&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFoVEq/hyU2qCWPck/VPOM4QjqN86RLTlnG0fkZ0/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506&quot;&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.visualstudio.com/download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFoVEq/hyU2qCWPck/VPOM4QjqN86RLTlnG0fkZ0/img.png?width=1012&amp;amp;height=506&amp;amp;face=0_0_1012_506');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Download Visual Studio Code - Mac, Linux, Windows&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows. Download Visual Studio Code to experience a redefined code editor, optimized for building and debugging modern web and cloud applications.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.visualstudio.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IM1LF/btsDnxyChzF/sP8tDoNBiolp3Ov1NNKxQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IM1LF/btsDnxyChzF/sP8tDoNBiolp3Ov1NNKxQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IM1LF/btsDnxyChzF/sP8tDoNBiolp3Ov1NNKxQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIM1LF%2FbtsDnxyChzF%2FsP8tDoNBiolp3Ov1NNKxQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1408&quot; height=&quot;862&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 스터디에서는 추가적으로 VScode를 통해 코드작성 환경을 구축했으며 Node의 경우 Amazon EC2 Instance를 사용했다(자신이 편한 환경으로 구축해서 사용하면 될 것 같다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;위의 그림에도 존재하지만 사용 시, 중요하게(?) 알아둬야할 것들이 몇 가지 존재한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- SSH&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Inventory&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible.cfg(Ansible 환경설정)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- etc..&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SSH(&lt;span style=&quot;color: #000000;&quot;&gt;Se&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;cure Shell Protocol&lt;/span&gt;&lt;/span&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1704978269953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Create SSH Keypair
ssh-keygen -t rsa -N &quot;&quot; -f /root/.ssh/id_rsa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 사실 SSH에 대해서는 대부분 알고 있고 많이 사용중이겠지만 환경 구축 시에 미리 설정해주는게 좋기 때문에 먼저 언급하기로 했다. 많은 분들이 이미 SSH를 사용하고 있기 때문에 어느정도 사용법은 알고 있을 것이다. SSH 사용에는 크게 ID/Passwd based와 패스워드를 굳이 입력하지 않는 방법으로 많이 알려진 Key based 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- KeyPair 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.23.03.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IXNvo/btsDpcHwjPE/COyt3aIEhZok6m6aMk8S80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IXNvo/btsDpcHwjPE/COyt3aIEhZok6m6aMk8S80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IXNvo/btsDpcHwjPE/COyt3aIEhZok6m6aMk8S80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIXNvo%2FbtsDpcHwjPE%2FCOyt3aIEhZok6m6aMk8S80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;504&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.23.03.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.23.28.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY1FhO/btsDnbo2OwR/1tvnK7Vlj6e1315s2MFiG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY1FhO/btsDnbo2OwR/1tvnK7Vlj6e1315s2MFiG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY1FhO/btsDnbo2OwR/1tvnK7Vlj6e1315s2MFiG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY1FhO%2FbtsDnbo2OwR%2F1tvnK7Vlj6e1315s2MFiG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2128&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.23.28.png&quot; data-origin-width=&quot;2128&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 위와 같이 keypair를 생성하고 id_rsa.pub 내용을 Ansible 명령을 받을 Managed node의 authorized_keys 파일 내에 해당 값을 추가해주면 된다. 이는 명령어를 통해 복사를 수행해주었다. 참고로 id_rsa.pub 값의 끝에는 해당 명령이 실행된 &quot;계정&quot;@&quot;hostname&quot; 형식이 작성되어있다.&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- 각 node의 root 의 .ssh/authorized_keys 복사&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.30.24.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clcAKf/btsDkNCuz5t/6EFUA4scZsg8kiwuuojKNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clcAKf/btsDkNCuz5t/6EFUA4scZsg8kiwuuojKNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clcAKf/btsDkNCuz5t/6EFUA4scZsg8kiwuuojKNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclcAKf%2FbtsDkNCuz5t%2F6EFUA4scZsg8kiwuuojKNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;518&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.30.24.png&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 각 node의 authorized_keys파일에 정상적으로 id_rsa.pub 값이 복사된 것을 볼 수 있었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;[참고] ubuntu 계정으로 ping module 명령이 실패한 이유&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1704980666704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible -m ping web -u ubuntu&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.32.10.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5VvwJ/btsDkwA0XQe/NjjEH9IySRGfU119PVITak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5VvwJ/btsDkwA0XQe/NjjEH9IySRGfU119PVITak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5VvwJ/btsDkwA0XQe/NjjEH9IySRGfU119PVITak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5VvwJ%2FbtsDkwA0XQe%2FNjjEH9IySRGfU119PVITak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;636&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.32.10.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이유는 ubuntu 계정의 /home/ubuntu/.ssh/authorized_keys 파일 내에 위에서 생성한 root의 id_rsa.pub값이 존재하지 않기때문이다. 때문에 ubuntu 계정으로 명령을 진행해 SSH 연결을 시도했으나 public key 값이 등록되지 않았으므로 connect에 실패하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;=&amp;gt; SSH 관련 확인이 필요한 부분이 발견되어서 확인되는데로 추가예정(--ask-pass 옵션 시, 패스워드 미입력에도 접속됨)&lt;/b&gt;&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- root의 id_rsa.pub 값을 ubuntu 계정의 /home/ubuntu/.ssh/authorized_keys 파일에 복사&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결방법은 당연히 간단하다. &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1704981296616&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for i in {1..3}; do ssh-copy-id ubuntu@tnode$i; done
for i in {1..3}; do echo &quot;&amp;gt;&amp;gt; tnode$i &amp;lt;&amp;lt;&quot;; ssh tnode$i cat /home/ubuntu/.ssh/authorized_keys; echo; done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.58.41.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7Wa1/btsDlpnRiXg/FeP6z1p5S1XzROhpsW2iik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7Wa1/btsDlpnRiXg/FeP6z1p5S1XzROhpsW2iik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7Wa1/btsDlpnRiXg/FeP6z1p5S1XzROhpsW2iik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7Wa1%2FbtsDlpnRiXg%2FFeP6z1p5S1XzROhpsW2iik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1856&quot; height=&quot;960&quot; data-filename=&quot;스크린샷 2024-01-11 오후 10.58.41.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 실패했던 &quot;ansible -m ping web -u ubuntu&quot; 명령이 정상적으로 성공한 것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Inventory&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 텍스트 파일로 Ansible이 자동화 대상으로 하는 Host를 지정&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- /etc/hosts 파일에 IP와 Domain이 mapping되어있다면 Domain명으로도 지정이 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 그 밖에도 inventory는 다양한 형태로 그룹을 설정할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1705017611386&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOT &amp;gt; inventory
10.10.1.11
10.10.1.12
10.10.1.13
EOT

---

cat &amp;lt;&amp;lt;EOT &amp;gt; inventory
tnode1
tnode2
tnode3
EOT

---

cat &amp;lt;&amp;lt;EOT &amp;gt; inventory
[web]
tnode1
tnode2

[db]
tnode3

[all:children]
web
db
EOT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Inventory 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 그룹별&lt;/b&gt;: &quot;[ ]&quot; 내에 그룹명을 작성한 뒤 해당 그룹에 속하는 Host명이나 IP를 작성(하나의 Host가 여러 그룹에 속해도 무방)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 중첩 그룹&lt;/b&gt;: 기존에 정의한 Host 그룹을 다른 Host 그룹에 포함시킬 수 있으며 이때 &quot;:children&quot;이라는 접미사를 추가&lt;/p&gt;
&lt;pre id=&quot;code_1705019548625&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[default]
# 아래의 내용을 범위로 지정 가능 -&amp;gt; 192.168.1.[1:3]
192.168.1.1
192.168.1.2
192.168.1.3

[dns]
[a:c].dns.example.com # a.dns.example.com , b.dns.example.com , c.dns.example.com 을 의미함

[dev]
# 아래의 내용을 범위로 지정 가능 -&amp;gt; hi[01:02].exmple.com
hi01.example.com
hi02.example.com

[stage]
sleep01.example.com
sleep02.example.com

[qa]
bye01.example.com
bye02.example.com

[prod]
hi01.example.com
bye02.example.com
sleep01.example.com

[test:children]
dev
qa
stage&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Inventory 검증&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705017689362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-inventory -i ./inventory --list | jq
ansible-inventory -i ./inventory --graph&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEmJT/btsDkQFYlAX/HE8oU5tAFP0o9lT2HF8fXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEmJT/btsDkQFYlAX/HE8oU5tAFP0o9lT2HF8fXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEmJT/btsDkQFYlAX/HE8oU5tAFP0o9lT2HF8fXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEmJT%2FbtsDkQFYlAX%2FHE8oU5tAFP0o9lT2HF8fXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;416&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;ansbile.cfg&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매번 위의 방법처럼 -i 옵션을 이용하는 것은 불편함. 그래서 사용하는 것이 ansible.cfg라는 Ansible 환경설정 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 밖에도 ansible config를 적용하는 방법은 다양하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- key : value 타입으로 구성됨&lt;/p&gt;
&lt;pre id=&quot;code_1705020055873&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ansible.cfg 파일 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; ansible.cfg
[defaults]
inventory = ./inventory
EOT

# inventory 목록 확인
ansible-inventory --list | jq&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[참고] ansible config 적용 방법 및 우선 순위&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705020109904&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Ansible Configuration Settings &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant', 'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep', 'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes',&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/reference_appendices/config.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/reference_appendices/config.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/reference_appendices/config.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/reference_appendices/config.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ansible Configuration Settings &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant', 'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep', 'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes',&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ANSIBLE_CONFIG&amp;nbsp;(environment variable if set)&lt;/li&gt;
&lt;li&gt;ansible.cfg&amp;nbsp;(in the current directory)&lt;/li&gt;
&lt;li&gt;~/.ansible.cfg&amp;nbsp;(in the home directory)&lt;/li&gt;
&lt;li&gt;/etc/ansible/ansible.cfg&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 스터디에서는 아래와 같이 ansible.cfg를 구성해서 사용했다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705020510096&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible module을 통한 명령&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ping 모듈&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705021934871&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible -m ping all
ansible -m ping web
ansible -m ping web -u ubuntu
ansible -m ping web -u ubuntu --ask-pass&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCDaAx/btsDpbPxu7v/S4YrJoBLKk63tLmBkjpPo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCDaAx/btsDpbPxu7v/S4YrJoBLKk63tLmBkjpPo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCDaAx/btsDpbPxu7v/S4YrJoBLKk63tLmBkjpPo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCDaAx%2FbtsDpbPxu7v%2FS4YrJoBLKk63tLmBkjpPo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;381&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;381&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- shell 모듈&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705022137352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible -m shell -a 'hostname' all
ansible -m shell -a 'pwd' all&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LJ9iy/btsDnEq2odS/qjlqHa7miB2WMWO4QLaErK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LJ9iy/btsDnEq2odS/qjlqHa7miB2WMWO4QLaErK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LJ9iy/btsDnEq2odS/qjlqHa7miB2WMWO4QLaErK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLJ9iy%2FbtsDnEq2odS%2FqjlqHa7miB2WMWO4QLaErK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;124&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Playbook&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 위의 방법처럼 module을 이용한 명령어 실행으로 각각의 node들을 제어할 수 도 있지만 yml 형식의 파일을 미리 작성해 사용할 수 있다. 각각의 명령 실행을 play라고 한다면 이를 책처럼 묶어서 사용하는 의미가 playbook이라고 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 참고로 &lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;ansible cli를 사용하여 하나 이상의 managed node에 대한 단일 작업을 자동화 명령을 '&lt;/span&gt;ad-hoc' &lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용법은 ansible-playbook 명령어를 통해 작성된 playbook yml 파일 내용을 실행한다.&lt;/p&gt;
&lt;figure id=&quot;og_1705023112415&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Creating a playbook &amp;mdash; Ansible Documentation&quot; data-og-description=&quot;&amp;copy; Copyright Ansible project contributors. Last updated on Jan 11, 2024.&quot; data-og-host=&quot;docs.ansible.com&quot; data-og-source-url=&quot;https://docs.ansible.com/ansible/latest/getting_started/get_started_playbook.html&quot; data-og-url=&quot;https://docs.ansible.com/ansible/latest/getting_started/get_started_playbook.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/getting_started/get_started_playbook.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.ansible.com/ansible/latest/getting_started/get_started_playbook.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Creating a playbook &amp;mdash; Ansible Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;copy; Copyright Ansible project contributors. Last updated on Jan 11, 2024.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.ansible.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1705023136801&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# first-playbook.yml
---
- hosts: all
  tasks:
    - name: Print message
      debug:
        msg: Hello CloudNet@ Ansible Study&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 스터디에서 진행한 기본예제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705023156607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook first-playbook.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpTYp0/btsDkxNzuWp/eMPKuvdEULPKJ2zqS7OVOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpTYp0/btsDkxNzuWp/eMPKuvdEULPKJ2zqS7OVOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpTYp0/btsDkxNzuWp/eMPKuvdEULPKJ2zqS7OVOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpTYp0%2FbtsDkxNzuWp%2FeMPKuvdEULPKJ2zqS7OVOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;411&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Playbook 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 종류: 호스트, 그룹, 플레이, 추가, 작업 변수 등이 존재&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 우선순위: &lt;span style=&quot;color: #006dd7;&quot;&gt;추가변수(실행 시 파라미터) &amp;gt; 플레이 변수 &amp;gt; 호스트 변수 &amp;gt; 그룹 변수 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033246030&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[web]
tnode1
tnode2

[db]
tnode3 user=ansible1

[all:children]
web
db

[all:vars]
user=ansible&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 그룹변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- inventory 파일에 선언. 현재 예시로는 all 그룹에서 user라는 변수를 사용할 수 있게됨&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033258448&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[all:vars]
user=ansible&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbool yml 파일에서 변수 사용(띄어쓰기 주의)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705032664457&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: all
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: &quot;{{ user }}&quot;
      state: present&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;b&gt;멱등성 특징&lt;/b&gt;으로인해 만약 해당 계정(ansible)이 이미 존재하더라도 에러가 아닌 &lt;b&gt;최종형태가 동일한 결과&lt;/b&gt;로 나타남.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 호스트 변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- inventory 파일내 호스트 옆에 변수 선언&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033319912&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[db]
tnode3 user=ansible1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp; 사용 시,&amp;nbsp; 해당 호스트가 포함된 그룹 또는 호스트로 작성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033383881&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: db # &amp;lt;- 이 부분에 그룹 또는 호스트 
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: &quot;{{ user }}&quot;
      state: present&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 플레이변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook yml 내 hosts 아래에 &quot;vars&quot;를 추가해서 사용(file로도 가능하며 아래의 도전과제1 참고)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033688488&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: all
  vars:
    user: ansible_test
    
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: &quot;{{ user }}&quot;
      state: present&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 추가변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- ansible-playbook 실행 시, parameter로 전달하는 변수( extra의 의미인 &quot;-e&quot;&amp;nbsp; 옵션을 이용)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705033899792&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook -e user=ansible create-user.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 작업변수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- playbook의 수행결과를 저장할 수 있는 변수로 특정 작업 후, 그 결과를 이용하여 후속작업 시, 주로 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- &quot;register: &quot; 문구를 이용하여 사용함&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705034017856&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: db
  tasks:
  - name: Create User {{ user }}
    ansible.builtin.user:
      name: &quot;{{ user }}&quot;
      state: present
    register: result
  
  - ansible.builtin.debug:
      var: result&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ansible Vault&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Password, API key 등 중요한 정보 및 Credential 값이 ansible-playbook에는 text로 저장되며 접근권한이 있다면 누구나 확인이 가능함. 때문에 이를 통한 유출을 막기위해&lt;/b&gt;&lt;b&gt; 데이터 파일을 암/복호화 할 수 있는 기능을 제공함&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705034451016&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-vault create secret.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXRlt/btsDkCuR30t/jMpILQCRdwIx1SK8kc1Rxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXRlt/btsDkCuR30t/jMpILQCRdwIx1SK8kc1Rxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXRlt/btsDkCuR30t/jMpILQCRdwIx1SK8kc1Rxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXRlt%2FbtsDkCuR30t%2FjMpILQCRdwIx1SK8kc1Rxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;190&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 명령 진행 시, 해당 파일을 암호화할 때 사용할 passwd를 입력받으며, 입력이 끝나면 yml 파일 내용을 작성할 수 있음. 작성된 내용은 &quot;cat&quot; 명령어로는 암호화되어 확인이 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;암호화된 파일 보기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705034627936&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-vault view secret.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL4Vew/btsDloQvB6s/U0K6PNW9CYHoCeGcvLxvSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL4Vew/btsDloQvB6s/U0K6PNW9CYHoCeGcvLxvSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL4Vew/btsDloQvB6s/U0K6PNW9CYHoCeGcvLxvSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL4Vew%2FbtsDloQvB6s%2FU0K6PNW9CYHoCeGcvLxvSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;84&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 위에서 암호화한 파일의 내용을 해당 명령과 Vault 패스워드를 통해 확인할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일을 이용한 암복호화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 패스워드 파일을 만들어서 암복호화를 진행할 수도 있다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705035004568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;echo 'my-passwd' &amp;gt; vault-pass

ansible-vault create --vault-pass-file ./vault-pass secret.yml
ansible-vault view --vault-pass-file ./vault-pass secret.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;b&gt;패스워드가 작성된 파일을 잘 관리해줘야 한다는 번거로운 점&lt;/b&gt;이 있을 수 있겠으나 대량의 중요파일들에 대해 패스워드를 설정하거나 변경할 때 편리할 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존파일 암호화&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존에 만들어놓은 파일에 대해 암호화 및 복호화가 가능&lt;/p&gt;
&lt;pre id=&quot;code_1705035208520&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-vault encrypt original_file.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 명령 진행 시, 패스워드를 입력해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705035404440&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-vault decrypt var_file.yml --output=var_decrypted.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 복호화 시, 암호화된 파일은 그대로 두고 복호화한 파일만 따로 생성할 수 도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패스워드 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 직접 입력해서 변경이 가능하며 파일로도 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1705035555472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-vault rekey mysecret.yml
ansible-vault rekey --new-vault-password-file=./vault-pass mysecret.yml&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;playbook 진행 시, 암호화된 파일 사용법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 일반적인 ansible-playbook으로는 에러가 발생한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- '--vault-id @promt' 옵션을 추가해주고 패스워드를 입력하면 정상적으로 동작한다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705035998767&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook --vault-id @prompt create-user.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 에러발생&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/84liS/btsDofE7Ut8/iMoGL6kwz33jWIMu1lET3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/84liS/btsDofE7Ut8/iMoGL6kwz33jWIMu1lET3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/84liS/btsDofE7Ut8/iMoGL6kwz33jWIMu1lET3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F84liS%2FbtsDofE7Ut8%2FiMoGL6kwz33jWIMu1lET3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1031&quot; height=&quot;50&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 정상동작&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/taQO9/btsDofE77O5/ymR8DN3og1c0dsj5PDuup1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/taQO9/btsDofE77O5/ymR8DN3og1c0dsj5PDuup1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/taQO9/btsDofE77O5/ymR8DN3og1c0dsj5PDuup1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtaQO9%2FbtsDofE77O5%2FymR8DN3og1c0dsj5PDuup1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;501&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Facts&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Ansible이 관리 호스트에서 자동으로 검색한 변수(자동 예약 변수)를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Facts에는 아래와 같은 호스트별 정보가 담겨있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용 표기법은 많이 알아두면 좋지만 ansible_facts 전체를 출력해서 보고 사용해도 무방할 것 같음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ansible_facts.* 네임스페이스 표기법 사용을 권장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 지정 fact도 만들 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호스트 명, 커널 버전, 네트워크 인터페이스 명, 운영체제 버전, CPU 개수, 사용 가능한 메모리, 스토리지 장치의 크기 및 여유 공간 etc...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuM52p/btsDqmQ25qT/8kXcUlUZoufGczhM7IDr80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuM52p/btsDqmQ25qT/8kXcUlUZoufGczhM7IDr80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuM52p/btsDqmQ25qT/8kXcUlUZoufGczhM7IDr80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuM52p%2FbtsDqmQ25qT%2F8kXcUlUZoufGczhM7IDr80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1079&quot; height=&quot;627&quot; data-origin-width=&quot;1079&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 화면에는 다보이지 않지만 굉장히 많은 정보를 json 형식으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 구버전 fact 문법 비활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 구버전 사용은 권장하지 않으며 ansible.cfg 파일에 옵션을 추가하여 비활성화가 가능하다&lt;/b&gt;&lt;b&gt;(infect_facts_as_vars=false)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705110345164&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[defaults]
inventory = ./inventory
remote_user = root
ask_pass = false
inject_facts_as_vars = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;facts 수집 비활성화&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- fact 수집으로 인한 호스트 부하를 줄이고 싶거나 굳이 fact 수집이 필요하지 않은 경우 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 참고로 facts 수집을 비활성화 한상태에서 해당 facts를 사용하려하면 당연히 에러가 난다)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705111363147&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: db
  gather_facts: no # &amp;lt;- 수집 비활성

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      msg: &amp;gt;
        The default IPv4 address of {{ ansible_facts.hostname }}
        is {{ ansible_facts.default_ipv4.address }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Manual 하게 facts 수집 비활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- hosts 레벨에서 facts를 비활성화하되 tasks 레벨에서 수집할 수 있게 설정도 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705111627686&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;- hosts: db
  gather_facts: no

  tasks:
  - name: Manually gather facts
    ansible.builtin.setup:

  - name: Print all facts
    ansible.builtin.debug:
      msg: &amp;gt;
        The default IPv4 address of {{ ansible_facts.hostname }}
        is {{ ansible_facts.default_ipv4.address }}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;사용자 지정 fact 만들기 &amp;amp; 수집&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- host의 /etc/ansible/facts.d 디렉터리 내에 *.fact 형식의 파일을 생성하여 수집하고 싶은 facts를 정의하고 수집이 가능하다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705111850760&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 관리 호스트에 facts.d 디렉터리 생성
mkdir /etc/ansible/facts.d

# my-custom.fact 파일 생성
cat &amp;lt;&amp;lt;EOT &amp;gt; /etc/ansible/facts.d/my-custom.fact
[packages]
web_package = httpd
db_package = mariadb-server

[users]
user1 = ansible
user2 = k8s-ho
EOT&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Playbook 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1705111884927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---

- hosts: localhost

  tasks:
  - name: Print all facts
    ansible.builtin.debug:
      var: ansible_local&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도전과제1&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 생성된 user를 ansible.builtin.user 모듈을 통해 제거해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 참고로 Ansible의 변수선언은 다양하게 가능하며 아래와 같은 우선순위를 가진다.&lt;/p&gt;
&lt;pre id=&quot;code_1705025404006&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;추가변수(실행 시 파라미터) &amp;gt; 플레이 변수 &amp;gt; 호스트 변수 &amp;gt; 그룹 변수&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 도전과제1에서 나의 경우 &lt;b&gt;별도 파일을 분리한 플레이 변수를 사용&lt;/b&gt;하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 계정 생성&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1705024622143&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook create-user.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1705024548751&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# var_file.yml
user1: ansible1
user2: ansible2
user3: ansible3


# create_user.yml
---

- hosts: all
  vars_files:
    - var_file.yml

  tasks:
    - name: Create User {{ user1 }}
      ansible.builtin.user:
        name: &quot;{{ user1 }}&quot;
        state: present
    - name: Create User {{ user2 }}
      ansible.builtin.user:
        name: &quot;{{ user2 }}&quot;
        state: present
    - name: Create User {{ user3 }}
      ansible.builtin.user:
        name: &quot;{{ user3 }}&quot;
        state: present&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvFIhc/btsDitSlWQW/fDSMMBOy9yOWOBn9zghdK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvFIhc/btsDitSlWQW/fDSMMBOy9yOWOBn9zghdK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvFIhc/btsDitSlWQW/fDSMMBOy9yOWOBn9zghdK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvFIhc%2FbtsDitSlWQW%2FfDSMMBOy9yOWOBn9zghdK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;493&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 삭제를 위해 우선 계정을 생성해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* 계정삭제&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수는 이미 작성되어있으므로 삭제로만 수정진행&lt;/p&gt;
&lt;pre id=&quot;code_1705024786726&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook remove-user.yml&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1705024755990&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# remove-user.yml
---

- hosts: all
  vars_files:
    - var_file.yml

  tasks:
    - name: Remove User {{ user1 }}
      ansible.builtin.user:
        name: &quot;{{ user1 }}&quot;
        state: absent
    - name: Remove User {{ user2 }}
      ansible.builtin.user:
        name: &quot;{{ user2 }}&quot;
        state: absent
    - name: Remove User {{ user3 }}
      ansible.builtin.user:
        name: &quot;{{ user3 }}&quot;
        state: absent&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw4c9j/btsDngcXvGQ/TH73ppPNu4DkhqKom1ZEkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw4c9j/btsDngcXvGQ/TH73ppPNu4DkhqKom1ZEkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw4c9j/btsDngcXvGQ/TH73ppPNu4DkhqKom1ZEkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw4c9j%2FbtsDngcXvGQ%2FTH73ppPNu4DkhqKom1ZEkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;484&quot; data-filename=&quot;제목 없음.png&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 깔끔하게 삭제가 완료되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도전과제2&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관리대상에 uptime을 ansible.builtin.debug 모듈을 통해 확인해보자&lt;/p&gt;
&lt;pre id=&quot;code_1705025227174&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# uptime.yml
---
- hosts: all
  tasks:
    - name: Get uptime to Node
      ansible.builtin.shell: /usr/bin/uptime
      register: result

    - name: Show uptime
      ansible.builtin.debug:
        msg: &quot;{{ result.stdout }}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1gjc/btsDoeyYgpI/pWIqhFfsDZq5zGgo4dEBrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1gjc/btsDoeyYgpI/pWIqhFfsDZq5zGgo4dEBrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1gjc/btsDoeyYgpI/pWIqhFfsDZq5zGgo4dEBrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1gjc%2FbtsDoeyYgpI%2FpWIqhFfsDZq5zGgo4dEBrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;865&quot; height=&quot;469&quot; data-origin-width=&quot;865&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 관리 node별 uptime을 확인할 수 있었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;도전과제3&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 팩트를 사용하여 3개의 EC2 '커널버전'과 '운영체제 종류'를 출력해보자.&lt;/p&gt;
&lt;pre id=&quot;code_1705036800919&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# fact.yml
---

- hosts: all
  tasks:
    - name: facts data collecting
      ansible.builtin.debug:
        #var: ansible_facts
        msg: &amp;gt;
          The OS of this VM is {{ ansible_facts.distribution }} {{ ansible_facts.distribution_version  }}
          and the Kernel version is {{ ansible_facts.kernel }}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1705036822902&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ansible-playbook fact.yml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bidY8y/btsDnxTFRPg/IgTgrwSXtV6kgPcBEtNlt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bidY8y/btsDnxTFRPg/IgTgrwSXtV6kgPcBEtNlt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bidY8y/btsDnxTFRPg/IgTgrwSXtV6kgPcBEtNlt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbidY8y%2FbtsDnxTFRPg%2FIgTgrwSXtV6kgPcBEtNlt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1124&quot; height=&quot;423&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 각각 VM별 OS 종류와 Kernel version을 볼 수 있었다. ansible_facts가 수집된 내용을 확인한 뒤에 필요한 데이터만 파싱해서 사용하면 된다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/Cloud</category>
      <category>A101</category>
      <category>ansible</category>
      <category>Cloud</category>
      <category>Gasida</category>
      <category>security</category>
      <category>가시다스터디</category>
      <category>보안</category>
      <category>오픈소스</category>
      <category>자동화</category>
      <category>클라우드</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/338</guid>
      <comments>https://ho-story.tistory.com/338#entry338comment</comments>
      <pubDate>Wed, 10 Jan 2024 21:37:44 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] LocalStack이란?</title>
      <link>https://ho-story.tistory.com/336</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;LocalStack이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이름 그대로 로컬에서 AWS 서비스를 구축/개발 테스트해볼 수 있는 &lt;b&gt;AWS 클라우드 서비스 에뮬레이터&lt;/b&gt;이다. 얼마전에 알게되어 정보공유차원에서 작성해보았다.&lt;/p&gt;
&lt;figure id=&quot;og_1701655394938&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;LocalStack&quot; data-og-description=&quot;Use LocalStack as a drop-in replacement for AWS in your dev and testing environments.&quot; data-og-host=&quot;www.localstack.cloud&quot; data-og-source-url=&quot;https://www.localstack.cloud/&quot; data-og-url=&quot;https://www.localstack.cloud/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.localstack.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.localstack.cloud/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LocalStack&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Use LocalStack as a drop-in replacement for AWS in your dev and testing environments.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.localstack.cloud&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-12-04 오전 10.52.51.png&quot; data-origin-width=&quot;2956&quot; data-origin-height=&quot;1722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba5mlj/btsBj7WCcRF/Qx8ScATCVJUgBh0RlCMAkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba5mlj/btsBj7WCcRF/Qx8ScATCVJUgBh0RlCMAkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba5mlj/btsBj7WCcRF/Qx8ScATCVJUgBh0RlCMAkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba5mlj%2FbtsBj7WCcRF%2FQx8ScATCVJUgBh0RlCMAkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2956&quot; height=&quot;1722&quot; data-filename=&quot;스크린샷 2023-12-04 오전 10.52.51.png&quot; data-origin-width=&quot;2956&quot; data-origin-height=&quot;1722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 생각보다 다양한 AWS 서비스를 사용해볼 수 있다. 기업이나 개발팀에서 보통 클라우드 비용을 고려해 테스트용도로 구축해서 많이 사용한다고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 하지만 개인적인 용도(공부 등)로 사용하는거라면 그냥 AWS를 사용하는 것을 추천한다. 아무리 로컬에서 AWS 서비스를 사용할 수 있다고 하더라도 둘의 차이는 분명히 존재하기때문에 어처피 AWS를 위해 사용해보는거라면 조금의 과금이 발생하더라도 AWS와 친숙해지면서 자신의 과금 정도를 체크해보는 것이 더 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 로컬스택에 대해 잘정리되어있는 블로그(인프랩)&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1701655208159&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Localstack 을 활용한 AWS 인프라 통합테스트&quot; data-og-description=&quot;안녕하세요. 인프랩에서 백엔드 개발을 담당하고 있는 인트라고합니다. 저는 최근 오픈한 채용 서비스 랠릿 프로젝트에 참여하였습니다. 기존 인프런 서비스와는 다른 스택과 환경에서 개&amp;hellip;&quot; data-og-host=&quot;tech.inflab.com&quot; data-og-source-url=&quot;https://tech.inflab.com/202202-integration-test-with-localstack/&quot; data-og-url=&quot;https://tech.inflab.com/202202-integration-test-with-localstack/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cM1hqN/hyUFfoqbBN/sfotmtbj6nV2lqQpLkyIv0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/bJEHNz/hyUE8iuzZv/wTQOi5Pg6PVm2344gp5OO1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/dnkzFE/hyUIGdymBE/zdODlZKWkXvVjeQqomcxJK/img.png?width=720&amp;amp;height=370&amp;amp;face=0_0_720_370&quot;&gt;&lt;a href=&quot;https://tech.inflab.com/202202-integration-test-with-localstack/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tech.inflab.com/202202-integration-test-with-localstack/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cM1hqN/hyUFfoqbBN/sfotmtbj6nV2lqQpLkyIv0/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/bJEHNz/hyUE8iuzZv/wTQOi5Pg6PVm2344gp5OO1/img.png?width=800&amp;amp;height=400&amp;amp;face=0_0_800_400,https://scrap.kakaocdn.net/dn/dnkzFE/hyUIGdymBE/zdODlZKWkXvVjeQqomcxJK/img.png?width=720&amp;amp;height=370&amp;amp;face=0_0_720_370');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Localstack 을 활용한 AWS 인프라 통합테스트&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 인프랩에서 백엔드 개발을 담당하고 있는 인트라고합니다. 저는 최근 오픈한 채용 서비스 랠릿 프로젝트에 참여하였습니다. 기존 인프런 서비스와는 다른 스택과 환경에서 개&amp;hellip;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tech.inflab.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/Cloud</category>
      <category>AWS</category>
      <category>AWS resource</category>
      <category>Cloud</category>
      <category>Localstack</category>
      <category>로컬스택</category>
      <category>아마존</category>
      <category>클라우드</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/336</guid>
      <comments>https://ho-story.tistory.com/336#entry336comment</comments>
      <pubDate>Mon, 4 Dec 2023 11:01:29 +0900</pubDate>
    </item>
    <item>
      <title>[Istio] 환경 구축(feat. Minikube)</title>
      <link>https://ho-story.tistory.com/333</link>
      <description>&lt;figure id=&quot;og_1700980950089&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Istio&quot; data-og-description=&quot;A service mesh for observability, security in depth, and management that speeds deployment cycles.&quot; data-og-host=&quot;istio.io&quot; data-og-source-url=&quot;https://istio.io/latest/&quot; data-og-url=&quot;https://istio.io/latest/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zSutz/hyUFdI2KJm/hfkvbpEL9DgKLjAmcGfVo1/img.png?width=1167&amp;amp;height=279&amp;amp;face=0_0_1167_279&quot;&gt;&lt;a href=&quot;https://istio.io/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://istio.io/latest/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zSutz/hyUFdI2KJm/hfkvbpEL9DgKLjAmcGfVo1/img.png?width=1167&amp;amp;height=279&amp;amp;face=0_0_1167_279');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Istio&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A service mesh for observability, security in depth, and management that speeds deployment cycles.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;istio.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유 목적을 위해 istio 관련 포스팅을 진행해보려고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;나의 환경의 경우 mac os(M2 pro)에 minikube를 설치해서 진행&lt;/b&gt;하였으며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;istio는 1.20, kubernetes 버전은 1.28&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Istio 사용이유&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Istio는 ServiceMash로 MSA  구조상 규모가 커져감에 따라 점점 복잡해지고 상호동작에 대한 이해가 어려워지면서 관리의 어려움이 발생하게되는데 이를 어느정도 해소해줄 수 있는 오픈소스이다. 사용자는 sidecar를 injection하는 것만으로 software 레벨이 아닌 인프라 레벨에서 트래픽을 관리하고 제어할 수 있다는 점이 장점이다. 그 밖에 서킷브레이킹이나 Service 라우팅을 통한 트래픽 흐름제어와 배포 관리, 가시성 확보, 분산추적, MTLS 보안 통신 등 다양한 기능을 활용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;minikube 설치&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1700973177185&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;minikube start&quot; data-og-description=&quot;minikube is local Kubernetes&quot; data-og-host=&quot;minikube.sigs.k8s.io&quot; data-og-source-url=&quot;https://minikube.sigs.k8s.io/docs/start/&quot; data-og-url=&quot;https://minikube.sigs.k8s.io/docs/start/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://minikube.sigs.k8s.io/docs/start/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://minikube.sigs.k8s.io/docs/start/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;minikube start&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;minikube is local Kubernetes&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;minikube.sigs.k8s.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1700973159688&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube
minikube start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;kubectl 설치 &amp;amp; 자동완성설정&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1700973302060&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;리눅스에 kubectl 설치 및 설정&quot; data-og-description=&quot;시작하기 전에 클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 한다. 예를 들어, v1.28 클라이언트는 v1.27, v1.28, v1.29의 컨트롤 플레인과 연동될 수 있다. 호환되는 최신 버전&quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/&quot; data-og-url=&quot;https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/esJvgf/hyUB5Z9573/1RJIsv0a9WKXYKm4RjzHgK/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/HHM4b/hyUB2WIMgA/xGSACm33PkoS69KYITwxi0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-linux/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/esJvgf/hyUB5Z9573/1RJIsv0a9WKXYKm4RjzHgK/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/HHM4b/hyUB2WIMgA/xGSACm33PkoS69KYITwxi0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;리눅스에 kubectl 설치 및 설정&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;시작하기 전에 클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 한다. 예를 들어, v1.28 클라이언트는 v1.27, v1.28, v1.29의 컨트롤 플레인과 연동될 수 있다. 호환되는 최신 버전&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1700973191008&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;kubectl Cheat Sheet&quot; data-og-description=&quot;This page contains a list of commonly used kubectl commands and flags. Note: These instructions are for Kubernetes v1.28. To check the version, use the kubectl version command. Kubectl autocomplete BASH source &amp;lt;(kubectl completion bash) # set up autocomple&quot; data-og-host=&quot;kubernetes.io&quot; data-og-source-url=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; data-og-url=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dbGgPc/hyUB2bkP1y/CBzyd0WhBuclhiJYYIluf1/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/O1OmZ/hyUE5RLg5V/DNvQ8pozgNPLv9I4vDHeT0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://kubernetes.io/docs/reference/kubectl/cheatsheet/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dbGgPc/hyUB2bkP1y/CBzyd0WhBuclhiJYYIluf1/img.png?width=1727&amp;amp;height=373&amp;amp;face=0_0_1727_373,https://scrap.kakaocdn.net/dn/O1OmZ/hyUE5RLg5V/DNvQ8pozgNPLv9I4vDHeT0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;kubectl Cheat Sheet&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This page contains a list of commonly used kubectl commands and flags. Note: These instructions are for Kubernetes v1.28. To check the version, use the kubectl version command. Kubectl autocomplete BASH source &amp;lt;(kubectl completion bash) # set up autocomple&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;kubernetes.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1700973130477&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install kubectl
또는
brew install kubernetes-cli

alias k=kubectl
complete -o default -F __start_kubectl k

source &amp;lt;(kubectl completion zsh)  
echo '[[ $commands[kubectl] ]] &amp;amp;&amp;amp; source &amp;lt;(kubectl completion zsh)' &amp;gt;&amp;gt; ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;istioctl 설치&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1700972903103&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Getting Started&quot; data-og-description=&quot;Try Istio&amp;rsquo;s features quickly and easily.&quot; data-og-host=&quot;istio.io&quot; data-og-source-url=&quot;https://istio.io/latest/docs/setup/getting-started/#download&quot; data-og-url=&quot;https://istio.io/latest/docs/setup/getting-started/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://istio.io/latest/docs/setup/getting-started/#download&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://istio.io/latest/docs/setup/getting-started/#download&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Getting Started&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Try Istio&amp;rsquo;s features quickly and easily.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;istio.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1700972895785&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -L https://istio.io/downloadIstio | sh -
cd istio-1.20.0
export PATH=$PWD/bin:$PATH&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;helm 설치 및 Kubernetes istio 구축&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1700973805234&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Install with Helm&quot; data-og-description=&quot;Instructions to install and configure Istio in a Kubernetes cluster using Helm.&quot; data-og-host=&quot;istio.io&quot; data-og-source-url=&quot;https://istio.io/latest/docs/setup/install/helm/&quot; data-og-url=&quot;https://istio.io/latest/docs/setup/install/helm/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://istio.io/latest/docs/setup/install/helm/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://istio.io/latest/docs/setup/install/helm/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Install with Helm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Instructions to install and configure Istio in a Kubernetes cluster using Helm.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;istio.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1700973060668&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install helm
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

kubectl create namespace istio-system
helm install istio-base istio/base -n istio-system --set defaultRevision=default
helm ls -n istio-system

helm install istiod istio/istiod -n istio-system --wait
helm ls -n istio-system
kubectl get deployments -n istio-system --output wide

kubectl create namespace istio-ingress
helm install istio-ingress istio/gateway -n istio-ingress --wait&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다른방법의 istio 구축&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1700974447898&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone https://github.com/DickChesterwood/istio-fleetman
cd istio-fleetman/_course_files/arm64/warmup-exercise
k apply -f 1-istio-init.yaml
k apply -f 2-istio-minikube.yaml
..
..&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이후 나머지 yaml도 실행시켜주면 테스트 환경을 확인할 수 있다. 아래는 &lt;b&gt;Istio를 통해 구성된 service mesh를 모니터링할 수 있는 툴 kiali Dashboard&lt;/b&gt;의 화면이다. 참고로 해당 dashboard에 보여지려면 당연히 pod내에 envoy proxy를 &lt;b&gt;sidecar형태로 injection&lt;/b&gt;해야하며 이는 namespace의 labeling을 통해 가능하다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;원하는 namespace에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;istio-injection=enabled&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;label을 적용하면된다. &lt;/span&gt;정상적으로 injection이 되었다면 pod 생성 시(Pod내에 1개의 container를 생성했을경우) 2개의 container가 존재하는 것을 확인할 수 있으며 그중 하나는&lt;b&gt; istio-proxy(envoy proxy)&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Kiali Dashboard 접근&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3452&quot; data-origin-height=&quot;1892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5PAGx/btsAULznLnL/yx8nkkV5dKlp84Ks88gyZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5PAGx/btsAULznLnL/yx8nkkV5dKlp84Ks88gyZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5PAGx/btsAULznLnL/yx8nkkV5dKlp84Ks88gyZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5PAGx%2FbtsAULznLnL%2Fyx8nkkV5dKlp84Ks88gyZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3452&quot; height=&quot;1892&quot; data-origin-width=&quot;3452&quot; data-origin-height=&quot;1892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 하단의 Legend를 클릭하면 해당 map에 대한 정보를 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;[참고] MacOS(M1, M2) minikube service type NodePort 접근이 안되는 이슈&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1700977849916&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Vj8xF/hyUE3sS1jb/hk90eXzssZ298oKJplE4P0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/8W7hJ/hyUFeVt5Gg/MT2KiKHmOK6T76wAuiOhk0/img.png?width=1826&amp;amp;height=767&amp;amp;face=0_0_1826_767,https://scrap.kakaocdn.net/dn/oLlgZ/hyUB6dIYau/GkKhXT3y3pEsQ6bBdXA1R0/img.png?width=1275&amp;amp;height=754&amp;amp;face=0_0_1275_754&quot; data-og-url=&quot;https://stackoverflow.com/questions/60710171/minikube-ip-is-not-reachable&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/60710171/minikube-ip-is-not-reachable&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-description=&quot;I have created one service called fleetman-webapp: apiVersion: v1 kind: Service metadata: name: fleetman-webapp spec: selector: app: webapp ports: - name: http port: 80 nodePort: ...&quot; data-og-title=&quot;minikube ip is not reachable&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://stackoverflow.com/questions/60710171/minikube-ip-is-not-reachable&quot; data-source-url=&quot;https://stackoverflow.com/questions/60710171/minikube-ip-is-not-reachable&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Vj8xF/hyUE3sS1jb/hk90eXzssZ298oKJplE4P0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/8W7hJ/hyUFeVt5Gg/MT2KiKHmOK6T76wAuiOhk0/img.png?width=1826&amp;amp;height=767&amp;amp;face=0_0_1826_767,https://scrap.kakaocdn.net/dn/oLlgZ/hyUB6dIYau/GkKhXT3y3pEsQ6bBdXA1R0/img.png?width=1275&amp;amp;height=754&amp;amp;face=0_0_1275_754');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;minikube ip is not reachable&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;I have created one service called fleetman-webapp: apiVersion: v1 kind: Service metadata: name: fleetman-webapp spec: selector: app: webapp ports: - name: http port: 80 nodePort: ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1700977849917&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/02E5L/hyUCcE0U7K/3hsssc9M8haTOiwxwbJIRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=999_129_1042_177&quot; data-og-url=&quot;https://github.com/kubernetes/minikube/issues/11193&quot; data-og-source-url=&quot;https://github.com/kubernetes/minikube/issues/11193&quot; data-og-host=&quot;github.com&quot; data-og-description=&quot;Hello, I am facing issues accessing services via node port on Mac OS. System information: ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69 Ninikube version: minikube version: v1.19.0 com...&quot; data-og-title=&quot;Cannoot access services via NodePort on MacOS with Docker driver &amp;middot; Issue #11193 &amp;middot; kubernetes/minikube&quot; data-og-type=&quot;object&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://github.com/kubernetes/minikube/issues/11193&quot; data-source-url=&quot;https://github.com/kubernetes/minikube/issues/11193&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/02E5L/hyUCcE0U7K/3hsssc9M8haTOiwxwbJIRk/img.png?width=1200&amp;amp;height=600&amp;amp;face=999_129_1042_177');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Cannoot access services via NodePort on MacOS with Docker driver &amp;middot; Issue #11193 &amp;middot; kubernetes/minikube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Hello, I am facing issues accessing services via node port on Mac OS. System information: ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69 Ninikube version: minikube version: v1.19.0 com...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 nodePort를 통해 Pod를 노출시키는경우&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;minikube ip&lt;/span&gt;로 접근이 안되는 이슈가 발생할 수 있다. 이는 docker를 driver로 사용하기 때문이라는 말도 있는데 어찌되었던&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;minikube service&lt;/span&gt;를 통해 간단하게 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Infra/ServiceMash</category>
      <category>helm</category>
      <category>istio</category>
      <category>istioctl</category>
      <category>Kubernetes</category>
      <category>M1</category>
      <category>M2</category>
      <category>MacOS</category>
      <category>minikube</category>
      <category>nodeport</category>
      <category>service</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/333</guid>
      <comments>https://ho-story.tistory.com/333#entry333comment</comments>
      <pubDate>Sun, 26 Nov 2023 13:27:31 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] AHSS 1주차 - S3 취약점 및 보안(feat. s3game)</title>
      <link>https://ho-story.tistory.com/326</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 &lt;b&gt;Gasida님 스터디에 참가&lt;/b&gt;하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gasida님의 테라폼 스터디도 참가하고 싶었지만.. 요즘 프로젝트가 너무 바빠져서..ㅠ(다음기회에 꼭!!..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 스터디의 주제는 드디어&amp;nbsp;&lt;b&gt;클라우드 Security&lt;/b&gt;이다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1주차 주제는 s3 취약점 및 보안으로 스터디 공백기간 동안 클라우드 관련 wargame들을 풀어본적이 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(BigIAMchallange, flAWS 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서인지 훨씬 수월했고 &lt;u&gt;&lt;b&gt;1주차 과제는 스터디에서 배운 것들을 활용할 수 있는 s3game writeup을 진행&lt;/b&gt;&lt;/u&gt;하였다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;s3game Writeup&lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1693570294602&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;_ _______ _______ _ __ ( \ ( ____ \|\ /|( ____ \( \ / \ | ( | ( \/| ) ( || ( \/| ( \/) ) | | | (__ | | | || (__ | | | | | | | __) ( ( ) )| __) | | | | | | | ( \ \_/ / | ( | | | | | (____/\| (____/\ \ / | (____/\| (____/\ __) (_ (_______/(_______/ \_/ (____&quot; data-og-host=&quot;s3game-level1.s3-website.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;http://s3game-level1.s3-website.us-east-2.amazonaws.com/level1.html&quot; data-og-url=&quot;http://s3game-level1.s3-website.us-east-2.amazonaws.com/level1.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://s3game-level1.s3-website.us-east-2.amazonaws.com/level1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://s3game-level1.s3-website.us-east-2.amazonaws.com/level1.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;_ _______ _______ _ __ ( \ ( ____ \|\ /|( ____ \( \ / \ | ( | ( \/| ) ( || ( \/| ( \/) ) | | | (__ | | | || (__ | | | | | | | __) ( ( ) )| __) | | | | | | | ( \ \_/ / | ( | | | | | (____/\| (____/\ \ / | (____/\| (____/\ __) (_ (_______/(_______/ \_/ (____&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level1.s3-website.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level1 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.11.50.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzPNbw/btssTgHK4f5/a3psh6UAf3g9piH4RfIUt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzPNbw/btssTgHK4f5/a3psh6UAf3g9piH4RfIUt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzPNbw/btssTgHK4f5/a3psh6UAf3g9piH4RfIUt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzPNbw%2FbtssTgHK4f5%2Fa3psh6UAf3g9piH4RfIUt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;689&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.11.50.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 1번 문제는 그저 s3 URL의 구조에 대해서 설명을 해주고 bucket name이 뭔지만 알 수 있으면 풀 수 있는 문제였다. 대놓고 bucket name이 &lt;b&gt;s3game-level1&lt;/b&gt;이기 때문에 aws-cli를 통해 접근해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693570448229&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3 ls s3://s3game-level1
aws s3 cp s3://s3game-level1/tresure1 -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.14.37.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwYdXO/btssMHGBRUM/KCUiOI0o0ijDtswOxExiHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwYdXO/btssMHGBRUM/KCUiOI0o0ijDtswOxExiHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwYdXO/btssMHGBRUM/KCUiOI0o0ijDtswOxExiHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwYdXO%2FbtssMHGBRUM%2FKCUiOI0o0ijDtswOxExiHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1734&quot; height=&quot;544&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.14.37.png&quot; data-origin-width=&quot;1734&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 s3는 public으로 공개되어있었고 treasure1라는 object가 누가봐도 다음 Level로 갈 수 있게 도와줄 것 같이 생겼다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= &amp;gt;해당 파일을 확인해보니 &lt;b&gt;secret code라는 숫자+영문 조합&lt;/b&gt;과 &lt;b&gt;다음 Level로가는 링크&lt;/b&gt;를 알려주었다. 1번은 쉽게 클리어~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level2 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693570650236&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level2.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level2.s3.us-east-2.amazonaws.com/level2-748l6b6xwzl6.html&quot; data-og-url=&quot;https://s3game-level2.s3.us-east-2.amazonaws.com/level2-748l6b6xwzl6.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level2.s3.us-east-2.amazonaws.com/level2-748l6b6xwzl6.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level2.s3.us-east-2.amazonaws.com/level2-748l6b6xwzl6.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level2.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PBiRP/btssSBZGOk1/XmfURSkfsPjxdZeLMl2u6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PBiRP/btssSBZGOk1/XmfURSkfsPjxdZeLMl2u6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PBiRP/btssSBZGOk1/XmfURSkfsPjxdZeLMl2u6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPBiRP%2FbtssSBZGOk1%2FXmfURSkfsPjxdZeLMl2u6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;867&quot; height=&quot;666&quot; data-origin-width=&quot;867&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 2번문제의 내용은 Virtual Hosted Style URL format에 대한 내용을 가르쳐주면서 &lt;b&gt;이 게임에서는 Path Style의 접근은 사용하지 않으며&lt;/b&gt; &lt;b&gt;2020년 09월 30일 이후 생성된 bucket은 Virtual Hosted Style만 지원&lt;/b&gt;한다고 하며&amp;nbsp;&lt;b&gt;해당 날짜보다 이전에 생성된 s3는 두 가지 Style을 모두 지원&lt;/b&gt;한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;'Old' vs 'New' 참고&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693570933742&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Amazon S3 Path Deprecation Plan &amp;ndash; The Rest of the Story | Amazon Web Services&quot; data-og-description=&quot;Update (September 23, 2020) &amp;ndash; Over the last year, we&amp;rsquo;ve heard feedback from many customers who have asked us to extend the deprecation date. Based on this feedback we have decided to delay the deprecation of path-style URLs to ensure that customers hav&quot; data-og-host=&quot;aws.amazon.com&quot; data-og-source-url=&quot;https://aws.amazon.com/ko/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; data-og-url=&quot;https://aws.amazon.com/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KP5ja/hyTPIDpfAS/eMEWbt9QsE5s9EV05Z74Vk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312,https://scrap.kakaocdn.net/dn/fPZQ6/hyTPBqKsXo/M4W3UnhapleE1kGLEZXtSk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312,https://scrap.kakaocdn.net/dn/AHzWC/hyTPI4tBt4/1NJPoELuNk2XTv8jLCR0wk/img.jpg?width=1825&amp;amp;height=1825&amp;amp;face=558_630_1327_1471&quot;&gt;&lt;a href=&quot;https://aws.amazon.com/ko/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aws.amazon.com/ko/blogs/aws/amazon-s3-path-deprecation-plan-the-rest-of-the-story/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KP5ja/hyTPIDpfAS/eMEWbt9QsE5s9EV05Z74Vk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312,https://scrap.kakaocdn.net/dn/fPZQ6/hyTPBqKsXo/M4W3UnhapleE1kGLEZXtSk/img.jpg?width=390&amp;amp;height=312&amp;amp;face=0_0_390_312,https://scrap.kakaocdn.net/dn/AHzWC/hyTPI4tBt4/1NJPoELuNk2XTv8jLCR0wk/img.jpg?width=1825&amp;amp;height=1825&amp;amp;face=558_630_1327_1471');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Amazon S3 Path Deprecation Plan &amp;ndash; The Rest of the Story | Amazon Web Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Update (September 23, 2020) &amp;ndash; Over the last year, we&amp;rsquo;ve heard feedback from many customers who have asked us to extend the deprecation date. Based on this feedback we have decided to delay the deprecation of path-style URLs to ensure that customers hav&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.21.47.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCXT1R/btssT9nOLRR/VjZRNoACaoBygAo7y1eLD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCXT1R/btssT9nOLRR/VjZRNoACaoBygAo7y1eLD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCXT1R/btssT9nOLRR/VjZRNoACaoBygAo7y1eLD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCXT1R%2FbtssT9nOLRR%2FVjZRNoACaoBygAo7y1eLD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;290&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.21.47.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 문제에서 제공하는 또하나의 링크를 들어가면 Path-style과 Virtual-hosted style의 예시를 제공하고 있다. 문제에서 보여주었던 URL은 Virtual-hosted style인 것으로 보여진다. 그렇다면 두 가지 모두 접근해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Path-style &amp;amp; Virtual-hosted style Request&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693571105394&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl http://s3game-level2.s3.us-east-2.amazonaws.com/treasure2
curl https://s3-us-east-2.amazonaws.com/s3game-level2/treasure2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.33.22.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMx8fK/btssMIlcsKd/k0A6fxofZBg68LopCHY2e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMx8fK/btssMIlcsKd/k0A6fxofZBg68LopCHY2e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMx8fK/btssMIlcsKd/k0A6fxofZBg68LopCHY2e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMx8fK%2FbtssMIlcsKd%2Fk0A6fxofZBg68LopCHY2e0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1856&quot; height=&quot;694&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.33.22.png&quot; data-origin-width=&quot;1856&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 문제에서 제공한 &lt;b&gt;bucket-name은 s3game-level2&lt;/b&gt;이며 treasure2를 얻을 수 있을 것이라고 했으니&lt;b&gt; object 명은 treasure2&lt;/b&gt;를 사용해주었고 나머지는 제공하는 style의 format에 맞게 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 결과는 똑같이 나왔고 웹에서 해당 URL로 접근하면 treasure2 파일이 자동으로 Download 되었다. 파일 내용은 &lt;b&gt;aws credential로 보여지는 내용&lt;/b&gt;과 &lt;b&gt;Level3으로 가는 URL&lt;/b&gt;을 알려주었다. credential은 다음 문제에서 쓰이지 않을까 싶다. 2번도 어렵지 않게 클리어~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level3 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693571793769&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level3.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level3.s3.us-east-2.amazonaws.com/level3-76qp7mlpzyg1.html&quot; data-og-url=&quot;https://s3game-level3.s3.us-east-2.amazonaws.com/level3-76qp7mlpzyg1.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level3.s3.us-east-2.amazonaws.com/level3-76qp7mlpzyg1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level3.s3.us-east-2.amazonaws.com/level3-76qp7mlpzyg1.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level3.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.35.13.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnvjiu/btssVTSiRI4/m4REO8NsQAymeoxJ9rGv6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnvjiu/btssVTSiRI4/m4REO8NsQAymeoxJ9rGv6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnvjiu/btssVTSiRI4/m4REO8NsQAymeoxJ9rGv6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbnvjiu%2FbtssVTSiRI4%2Fm4REO8NsQAymeoxJ9rGv6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;611&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.35.13.png&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Level2에서 줍줍한 credential을 사용해야한다는 것을 직감했다. 해당 credential만이 문제에서 제공하는 bucket에 접근할 수 있을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;aws configure&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693571925168&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile test
aws --profile test sts get-caller-identity

# Credential 정보
Access Key ID: AKIAZBIEGK7G53TU2K4L  
Secret Access Key: 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
region name: us-east-2&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.42.54.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9Bepe/btssUIQ2OkS/vVYwtJaL2KbrQNwzUtpdR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9Bepe/btssUIQ2OkS/vVYwtJaL2KbrQNwzUtpdR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9Bepe/btssUIQ2OkS/vVYwtJaL2KbrQNwzUtpdR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9Bepe%2FbtssUIQ2OkS%2FvVYwtJaL2KbrQNwzUtpdR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;214&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.42.54.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 참고로 등록된 credential에 대한 파일은 .aws/credential과 .aws/config 파일에서 확인할 수 있다. 문제에서 제공하는 credential외에 나의 계정의 credential이 있어서 --profile 옵션을 사용해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 등록이 완료되면 Security Token Service의 get caller identity로 제대로 된건지 확인해보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;aws-cli를 통한 s3 접근&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693572318829&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level3
aws --profile test s3 cp s3://s3game-level3/treasure3_has_no_secret_code -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.44.47.png&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sp7Nu/btssTp5vved/n4nks1naStshHdIhUkupYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sp7Nu/btssTp5vved/n4nks1naStshHdIhUkupYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sp7Nu/btssTp5vved/n4nks1naStshHdIhUkupYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsp7Nu%2FbtssTp5vved%2Fn4nks1naStshHdIhUkupYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1864&quot; height=&quot;600&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.44.47.png&quot; data-origin-width=&quot;1864&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 credential로 s3 bucket 이름을 추측해서 접근해보았다. 기존에 &lt;b&gt;s3game-&amp;lt;LEVEL NAME&amp;gt;&lt;/b&gt; format이였기 때문에 &lt;b&gt;s3game-level3 bucket이 존재한다면 Object Listing이 될 것이라고 생각했고 예상대로 존재&lt;/b&gt;했다. object 중에는 &lt;b&gt;treasure3가 존재&lt;/b&gt;했고 내용을 확인해보니 &lt;b&gt;Level4로 가는 URL이 확인되었으나 중간에 &amp;lt;THE CODE&amp;gt;를 비우고 줘서.. 접근이 불가&lt;/b&gt;했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;aws-cli의&amp;nbsp; s3api 명령을 통한 접근&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693572677191&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;get-object &amp;mdash; AWS CLI 1.29.39 Command Reference&quot; data-og-description=&quot;Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html#synopsis&quot; data-og-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html#synopsis&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html#synopsis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html#synopsis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;get-object &amp;mdash; AWS CLI 1.29.39 Command Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1693572623961&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3api --profile test get-object --bucket s3game-level3 --key treasure3_has_no_secret_code  outfile

https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/level4.html&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.57.30.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsLjqE/btssNt9c0gQ/HBdBvbWKtGnisEVdjKneFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsLjqE/btssNt9c0gQ/HBdBvbWKtGnisEVdjKneFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsLjqE/btssNt9c0gQ/HBdBvbWKtGnisEVdjKneFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsLjqE%2FbtssNt9c0gQ%2FHBdBvbWKtGnisEVdjKneFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;420&quot; data-filename=&quot;스크린샷 2023-09-01 오후 9.57.30.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 스터디에서도 언급되었던 내용으로&lt;b&gt; aws-cli 명령어 중 s3 관련 명령어는 &lt;u&gt;s3와 s3api&lt;/u&gt;가 존재&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 둘의 차이는 &lt;b&gt;s3 명령의 경우 일반적인 bucket 관련 작업이나 object 관련 작업을 쉽게 수행하기 위한 용도&lt;/b&gt;이며 &lt;b&gt;s3api명령어는 s3 명령어 보다 좀더 많은 작업이 가능한 &lt;u&gt;s3 API 요청관련&lt;/u&gt; 명령어&lt;/b&gt;이다. 즉, 명령어 그대로 &lt;b&gt;s3의 API를 사용하는 것&lt;/b&gt;이라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 때문에 두 명령어는 위처럼 응답도 다르게 온다. 위에서처럼 s3api 명령어를 통해 secret code를 확인할 수 있었다. 결과적으로 이번문제에서는 s3, s3api 명령어 둘 다 사용해야 문제를 풀 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level4 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693573183078&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;_ _______ _______ _ ___ ( \ ( ____ \|\ /|( ____ \( \ / ) | ( | ( \/| ) ( || ( \/| ( / /) | | | | (__ | | | || (__ | | / (_) (_ | | | __) ( ( ) )| __) | | (____ _) | | | ( \ \_/ / | ( | | ) ( | (____/\| (____/\ \ / | (____/\| (____/\ | | (_______/(_______/ &quot; data-og-host=&quot;s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/level4.html&quot; data-og-url=&quot;https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/level4.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/level4.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/level4.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;_ _______ _______ _ ___ ( \ ( ____ \|\ /|( ____ \( \ / ) | ( | ( \/| ) ( || ( \/| ( / /) | | | | (__ | | | || (__ | | / (_) (_ | | | __) ( ( ) )| __) | | (____ _) | | | ( \ \_/ / | ( | | ) ( | (____/\| (____/\ \ / | (____/\| (____/\ | | (_______/(_______/&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.00.33.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4win7/btssVXtDTN5/jdQ1ifQYzLlUvKINlZv5bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4win7/btssVXtDTN5/jdQ1ifQYzLlUvKINlZv5bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4win7/btssVXtDTN5/jdQ1ifQYzLlUvKINlZv5bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4win7%2FbtssVXtDTN5%2FjdQ1ifQYzLlUvKINlZv5bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1670&quot; height=&quot;1288&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.00.33.png&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;사악하다...&lt;/span&gt;힌트 없다고 한다. 한 가지 신경쓰이는 부분은 이번 Level의 bucket name을 더블 체크하라고 한다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;일단 s3 bucket에 접근해보자&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693573642225&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level4-k73045aztqln
aws --profile test s3 cp s3://s3game-level4-k73045aztqln/treasure4_also_has_no_secret_code -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.08.25.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKKb3D/btssVUDHfev/dfZv9SArCs08yJoo9EWI4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKKb3D/btssVUDHfev/dfZv9SArCs08yJoo9EWI4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKKb3D/btssVUDHfev/dfZv9SArCs08yJoo9EWI4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKKb3D%2FbtssVUDHfev%2FdfZv9SArCs08yJoo9EWI4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2334&quot; height=&quot;524&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.08.25.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 오잉? 그냥 바로 실마리가 나왔다. 이번에도 이전문제와 동일하게 다음 Level로 가는 URL에서 비어있는 부분을 찾기만 하면 될 것 같다. metadata를 언급하는 걸로 봐서는 s3api를 한번 더 사용해보는 것이 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3api 명령어 get-object 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693573897809&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3api --profile test get-object --bucket s3game-level4-k73045aztqln --key treasure4_also_has_no_secret_code outfile
https://s3game-level4-k73045aztqln.s3.us-east-2.amazonaws.com/treasure4_also_has_no_secret_code&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.12.03.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2AXgR/btssNtg4AxP/MfMNRQRbYKIVek7GthiND1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2AXgR/btssNtg4AxP/MfMNRQRbYKIVek7GthiND1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2AXgR/btssNtg4AxP/MfMNRQRbYKIVek7GthiND1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2AXgR%2FbtssNtg4AxP%2FMfMNRQRbYKIVek7GthiND1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1614&quot; height=&quot;376&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.12.03.png&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 음.. Metadata가 빈 값으로 나왔다.. 하지만 TagCount가 1로 존재했다. 그렇다면 Tag 관련 정보를 보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3api 명령어 get-object-tagging 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693575692493&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws s3api --profile test get-object-tagging --bucket s3game-level4-k73045aztqln --key treasure4_also_has_no_secret_code

# secret-code를 넣은 다음 Level로 가는 URL
https://s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com/level5.html&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.42.16.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cV3hcG/btssNtuD3G6/KIhZWAbVloWLnIMv7Q4Rg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cV3hcG/btssNtuD3G6/KIhZWAbVloWLnIMv7Q4Rg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cV3hcG/btssNtuD3G6/KIhZWAbVloWLnIMv7Q4Rg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcV3hcG%2FbtssNtuD3G6%2FKIhZWAbVloWLnIMv7Q4Rg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;382&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.42.16.png&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 객체의 Tag 정보를 반환하는 명령을 통해 확인을 해보니 secret_code가 확인되었다. 이를 통해 다음 Level로 가는 URL의 비어진 부분을 알 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level5 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693581314290&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;_ _______ _______ _ _______ ( \ ( ____ \|\ /|( ____ \( \ ( ____ \ | ( | ( \/| ) ( || ( \/| ( | ( \/ | | | (__ | | | || (__ | | | (____ | | | __) ( ( ) )| __) | | (_____ \ | | | ( \ \_/ / | ( | | ) ) | (____/\| (____/\ \ / | (____/\| (____/\ /\____) ) (____&quot; data-og-host=&quot;s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com/level5.html&quot; data-og-url=&quot;https://s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com/level5.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com/level5.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com/level5.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;_ _______ _______ _ _______ ( \ ( ____ \|\ /|( ____ \( \ ( ____ \ | ( | ( \/| ) ( || ( \/| ( | ( \/ | | | (__ | | | || (__ | | | (____ | | | __) ( ( ) )| __) | | (_____ \ | | | ( \ \_/ / | ( | | ) ) | (____/\| (____/\ \ / | (____/\| (____/\ /\____) ) (____&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level5-8v95e5rv7z4i.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.47.41.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bePRL5/btssSqRqmw5/i1qoAVS3UeBCZgsaMqZ5PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bePRL5/btssSqRqmw5/i1qoAVS3UeBCZgsaMqZ5PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bePRL5/btssSqRqmw5/i1qoAVS3UeBCZgsaMqZ5PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbePRL5%2FbtssSqRqmw5%2Fi1qoAVS3UeBCZgsaMqZ5PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1684&quot; height=&quot;1256&quot; data-filename=&quot;스크린샷 2023-09-01 오후 10.47.41.png&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;1256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 보이지 않는 것을 볼필요가 있다는 말만 남기고 다른 힌트는 없었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 ListObject&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693583352112&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level5-8v95e5rv7z4i&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 12.48.37.png&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG3YqT/btssTfa4bnJ/QWke1mHlJNVUnyikpC1wD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG3YqT/btssTfa4bnJ/QWke1mHlJNVUnyikpC1wD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG3YqT/btssTfa4bnJ/QWke1mHlJNVUnyikpC1wD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG3YqT%2FbtssTfa4bnJ%2FQWke1mHlJNVUnyikpC1wD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1784&quot; height=&quot;216&quot; data-filename=&quot;스크린샷 2023-09-02 오전 12.48.37.png&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 우리가 찾는 실마리가 될만한 object는 보이지 않았다. 이전에 클라우드나 컨테이너 관련 취약점 공부를 했을 때 &lt;b&gt;git, docker image의&amp;nbsp; 과거 데이터에 정보가 남겨져 있어 취약했던 경험&lt;/b&gt;이 있어서 &lt;b&gt;s3도 history를 확인&lt;/b&gt;해야 겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 object version 정보 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693583704818&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3api list-object-versions --bucket s3game-level5-8v95e5rv7z4i&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 12.43.16.png&quot; data-origin-width=&quot;3004&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wz4IU/btssT32gt2o/3jOUhq0cCepNz6HtOz3G11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wz4IU/btssT32gt2o/3jOUhq0cCepNz6HtOz3G11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wz4IU/btssT32gt2o/3jOUhq0cCepNz6HtOz3G11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwz4IU%2FbtssT32gt2o%2F3jOUhq0cCepNz6HtOz3G11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3004&quot; height=&quot;1660&quot; data-filename=&quot;스크린샷 2023-09-02 오전 12.43.16.png&quot; data-origin-width=&quot;3004&quot; data-origin-height=&quot;1660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 과거의 기록에서 &quot;treasure5_is_deleted&quot;라는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;객체명이&lt;span&gt;&amp;nbsp;확인되었다.&lt;/span&gt;&lt;/span&gt; 해당 객체는 DeleteMarkers가 설정되어있어 드디어 실마리를 찾았고&amp;nbsp; 복구를 하거나 해당 내용을 볼 수 있는 방법을 찾아보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Version 옵션값을 s3 object 조회&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693585278254&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;삭제된 Amazon S3 객체 검색&quot; data-og-description=&quot;버전 관리가 활성화된 Amazon Simple Storage Service(S3) 버킷에서 삭제된 객체를 검색하려고 합니다. 어떻게 해야 하나요?&quot; data-og-host=&quot;repost.aws&quot; data-og-source-url=&quot;https://repost.aws/ko/knowledge-center/s3-undelete-configuration&quot; data-og-url=&quot;https://repost.aws/ko/knowledge-center/s3-undelete-configuration&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/WnLk7/hyTL5Ah7o9/gOyN8QVfIpYOwvBSjPsP90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://repost.aws/ko/knowledge-center/s3-undelete-configuration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://repost.aws/ko/knowledge-center/s3-undelete-configuration&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/WnLk7/hyTL5Ah7o9/gOyN8QVfIpYOwvBSjPsP90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;삭제된 Amazon S3 객체 검색&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;버전 관리가 활성화된 Amazon Simple Storage Service(S3) 버킷에서 삭제된 객체를 검색하려고 합니다. 어떻게 해야 하나요?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;repost.aws&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1693585071768&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3api get-object --bucket s3game-level5-8v95e5rv7z4i --key treasure5_is_deleted --version-id 344PQOyFqocF0TI66MbLynNNdQqHfBz3 outfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_스크린샷 2023-09-02 오전 1.08.10.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo8lcq/btssUL78DSJ/yxxKQul7UiTF82BOBsglDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo8lcq/btssUL78DSJ/yxxKQul7UiTF82BOBsglDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo8lcq/btssUL78DSJ/yxxKQul7UiTF82BOBsglDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo8lcq%2FbtssUL78DSJ%2FyxxKQul7UiTF82BOBsglDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1778&quot; height=&quot;360&quot; data-filename=&quot;edited_스크린샷 2023-09-02 오전 1.08.10.png&quot; data-origin-width=&quot;1778&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.22.25.png&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnENAg/btssPwxCXXo/Kb5puykWCXTa0wJ5FILL51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnENAg/btssPwxCXXo/Kb5puykWCXTa0wJ5FILL51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnENAg/btssPwxCXXo/Kb5puykWCXTa0wJ5FILL51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnENAg%2FbtssPwxCXXo%2FKb5puykWCXTa0wJ5FILL51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2256&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.22.25.png&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;삭제되었던 객체의 Version-Id를 옵션값으로&amp;nbsp;&lt;/span&gt;get-object 명령을 통해 객체를 다운로드 했다. 내가 설정한 파일명인 &quot;outfile&quot;을 확인할 수 있었으며 해당 객체에는 역시 다음 Level로 가는 URL이 존재했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bucket Version 관리 활성화 여부 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693585898935&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3api get-bucket-versioning --bucket s3game-level5-8v95e5rv7z4i&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.31.49.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbkpu/btssNsib8PE/j2JzXvNCLLLJGf9lji25RK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbkpu/btssNsib8PE/j2JzXvNCLLLJGf9lji25RK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbkpu/btssNsib8PE/j2JzXvNCLLLJGf9lji25RK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftbkpu%2FbtssNsib8PE%2Fj2JzXvNCLLLJGf9lji25RK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;118&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.31.49.png&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 다 풀고 나서 다른사람의 풀이를 보고 알게된 것은 나의 경우 &lt;b&gt;&quot;Bucket의 버전관리가 활성화되어있는지&quot;&lt;/b&gt;에 대한 확인과정 없이 풀이를 진행했다는 것이다. 사실 그냥 문제풀 때는 해당 과정 없이 시도해보면 되긴하지만 나중에 공격 관련 자동화 스크립트를 만든다면 버전관리 활성화 여부 확인 시, 필요할 것 같아서 작성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level6 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693585533130&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com/level6.html&quot; data-og-url=&quot;https://s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com/level6.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com/level6.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com/level6.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level6-vjv45x1gux81.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.25.57.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K1g72/btssPumhEtm/KbJRmNfOk1bz5KPByNvzi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K1g72/btssPumhEtm/KbJRmNfOk1bz5KPByNvzi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K1g72/btssPumhEtm/KbJRmNfOk1bz5KPByNvzi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK1g72%2FbtssPumhEtm%2FKbJRmNfOk1bz5KPByNvzi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1800&quot; height=&quot;1316&quot; data-filename=&quot;스크린샷 2023-09-02 오전 1.25.57.png&quot; data-origin-width=&quot;1800&quot; data-origin-height=&quot;1316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1693586629706&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;select-object-content &amp;mdash; AWS CLI 1.29.39 Command Reference&quot; data-og-description=&quot;select-object-content Description This action filters the contents of an Amazon S3 object based on a simple structured query language (SQL) statement. In the request, along with the SQL expression, you must also specify a data serialization format (JSON, C&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;select-object-content &amp;mdash; AWS CLI 1.29.39 Command Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;select-object-content Description This action filters the contents of an Amazon S3 object based on a simple structured query language (SQL) statement. In the request, along with the SQL expression, you must also specify a data serialization format (JSON, C&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이번 문제는 &lt;b&gt;객체에서 필요한 데이터만 추출하여 비용을 절감할 수 있는 S3 Select&lt;/b&gt;에 관련된 문제라는 것을 대놓고 알려주고 있다. 심지어 문제에서 &lt;b&gt;s3의 select-object-content를 사용&lt;/b&gt;하라고 까지 말해주는 것으로 보아, 해당 명령을 통해 문제를 풀며 사용법을 익히라는 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 Object 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693620784360&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level6-vjv45x1gux81
aws --profile test s3 cp s3://s3game-level6-vjv45x1gux81/s3select.csv.gz .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오전 11.14.00.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vG8vV/btssS1w78O9/KJOvVOsjX2qBRbNSrHUhC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vG8vV/btssS1w78O9/KJOvVOsjX2qBRbNSrHUhC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vG8vV/btssS1w78O9/KJOvVOsjX2qBRbNSrHUhC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvG8vV%2FbtssS1w78O9%2FKJOvVOsjX2qBRbNSrHUhC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2022&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2023-09-02 오전 11.14.00.png&quot; data-origin-width=&quot;2022&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; s3game-level6-vjv45x1gux81 bucket의 object를 확인해보니 s3select.csv.gz라는 압축파일이 존재했고 확인을 위해 우선 Download하였다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3select.csv.gz 파일 살펴보기&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.46.48.png&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYUcle/btssS39Lwru/3kZbbbginEMO3KzBblMSJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYUcle/btssS39Lwru/3kZbbbginEMO3KzBblMSJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYUcle/btssS39Lwru/3kZbbbginEMO3KzBblMSJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYUcle%2FbtssS39Lwru%2F3kZbbbginEMO3KzBblMSJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1688&quot; height=&quot;278&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.46.48.png&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.44.57.png&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmJE7/btssSrwip0V/cMskByKbPBvwD78rNDcFOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmJE7/btssSrwip0V/cMskByKbPBvwD78rNDcFOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmJE7/btssSrwip0V/cMskByKbPBvwD78rNDcFOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmJE7%2FbtssSrwip0V%2FcMskByKbPBvwD78rNDcFOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1994&quot; height=&quot;428&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.44.57.png&quot; data-origin-width=&quot;1994&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 파일과 문제에서 제공한 query를 비교해보면 첫 번째줄이 컬럼이라는 것을 알 수 있었고 우리가 찾는 데이터는 Answer 컬럼에 존재한다는 것을 추측해볼 수 있다. 또한 해당 칼럼내의 &quot;TREASURE&quot;인 부분만 반환하도록 쿼리를 작성한 것도 알 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 즉, &lt;b&gt;s3 객체 내에서&amp;nbsp;Category 컬럼의 값이 &quot;TREASURE&quot;일 때 Answer 컬럼의 값을 출력해내면 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.48.52.png&quot; data-origin-width=&quot;3450&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E4lJl/btssThNL3WT/8yoXBKScbzU9zhpXyjJX7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E4lJl/btssThNL3WT/8yoXBKScbzU9zhpXyjJX7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E4lJl/btssThNL3WT/8yoXBKScbzU9zhpXyjJX7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE4lJl%2FbtssThNL3WT%2F8yoXBKScbzU9zhpXyjJX7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3450&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.48.52.png&quot; data-origin-width=&quot;3450&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 때문에 해당 파일에 유추를 통해 grep을 여러번 이용하더라도 문제는 풀 수 있었다. 하지만 이번문제의 출제의도는 select-object-content를 통해 깔끔하게 필요한 추출하는 것일 것이기 때문에 s3 select-object-content를 사용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 select-object-content 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.55.42.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEyQGA/btssS4njSTc/jVnP1pMzwp5d8hQWsEDFO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEyQGA/btssS4njSTc/jVnP1pMzwp5d8hQWsEDFO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEyQGA/btssS4njSTc/jVnP1pMzwp5d8hQWsEDFO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEyQGA%2FbtssS4njSTc%2FjVnP1pMzwp5d8hQWsEDFO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;298&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.55.42.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.56.01.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl0VlE/btssPwLpjZE/jGygyPzIWL2nkNseDagALk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl0VlE/btssPwLpjZE/jGygyPzIWL2nkNseDagALk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl0VlE/btssPwLpjZE/jGygyPzIWL2nkNseDagALk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl0VlE%2FbtssPwLpjZE%2FjGygyPzIWL2nkNseDagALk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;106&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.56.01.png&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1693586533991&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# FileHeaderInfo&quot;: &quot;USE&quot; 사용 시
aws --profile test s3api select-object-content \
--bucket s3game-level6-vjv45x1gux81 \
--key s3select.csv.gz \
--expression &quot;SELECT Answer FROM s3object WHERE Category = 'TREASURE'&quot; \
--expression-type 'SQL'  \
--input-serialization '{&quot;CSV&quot;: {&quot;FileHeaderInfo&quot;: &quot;USE&quot;, &quot;FieldDelimiter&quot;: &quot;;&quot;}, &quot;CompressionType&quot;: &quot;GZIP&quot;}' \
--output-serialization '{&quot;CSV&quot;: {}}' &quot;output.csv&quot;


# FileHeaderInfo&quot;: &quot;IGNORE&quot; 사용 시
aws --profile test s3api select-object-content \
--bucket s3game-level6-vjv45x1gux81 \
--key s3select.csv.gz \
--expression &quot;SELECT s._8 FROM s3object s WHERE s._5 = 'TREASURE'&quot; \
--expression-type 'SQL'  \
--input-serialization '{&quot;CSV&quot;: {&quot;FileHeaderInfo&quot;: &quot;IGNORE&quot;, &quot;FieldDelimiter&quot;: &quot;;&quot;}, &quot;CompressionType&quot;: &quot;GZIP&quot;}' \
--output-serialization '{&quot;CSV&quot;: {}}' &quot;output2.csv&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.56.44.png&quot; data-origin-width=&quot;2262&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI1hn7/btssPwLpkAF/NWjZqWA9JVPuej1kYGUNC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI1hn7/btssPwLpkAF/NWjZqWA9JVPuej1kYGUNC1/img.png&quot; data-alt=&quot;다음 Level로 ~&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI1hn7/btssPwLpkAF/NWjZqWA9JVPuej1kYGUNC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI1hn7%2FbtssPwLpkAF%2FNWjZqWA9JVPuej1kYGUNC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2262&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2023-09-02 오후 10.56.44.png&quot; data-origin-width=&quot;2262&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다음 Level로 ~&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 나머지 옵션은 사용법이 어렵지 않기 때문에 핵심 옵션만 설명하자면 --expression과 --input-serialization만 잘 넣어주면 된다. --expression의 경우 우리가 흔히 사용하는 SQL query이며 s3 객체 자체를 대상으로 데이터를 선택하는 것이기 때문에 FROM 다음에 &quot;s3object&quot; 키워드를 사용하면 된다.&amp;nbsp; 또한 --input-serialization을 통해 &lt;b&gt;FileHeaderInfo를 &quot;USE&quot; 나 &quot;IGNORE&quot;로 주어서 첫 번째 줄이 헤더임을 인식&lt;/b&gt;시켜주고 FieldDelimiter를 통해 &lt;b&gt;레코드를 &quot;;&quot;로 구별할 수 있도록 작성&lt;/b&gt;해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 위의 방법대로 명령을 진행하게되면 깔끔하게 다음 Level로 갈 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level7 &amp;gt;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693586719615&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com/level7.html&quot; data-og-url=&quot;https://s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com/level7.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com/level7.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com/level7.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level7-zhovpo4j8588.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.18.52.png&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;1436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RI2SL/btssYSeRuUj/ylkuvWgyVwSHqQi0uUWcB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RI2SL/btssYSeRuUj/ylkuvWgyVwSHqQi0uUWcB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RI2SL/btssYSeRuUj/ylkuvWgyVwSHqQi0uUWcB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRI2SL%2FbtssYSeRuUj%2FylkuvWgyVwSHqQi0uUWcB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1726&quot; height=&quot;1436&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.18.52.png&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;1436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이번 문제의 s3의 모든 객체가 private라고 한다. 그리고 해당 object owner만이 접근 권한이 있다고 한다. 하지만 다른 사용자들에게 share가 가능하다며 presigned URL이라는 것을 통해 시간 제한으로 object를 다운로드 할 수 있는 권한을 부여할 수 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 기능 관련해서는 스터디 시간에도 실습했기 때문에 어렵지 않게 풀 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 presigned URL&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693664587872&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 presign s3://s3game-level7-zhovpo4j8588/treasure7 --expires-in 3600&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.33.40.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0O6NS/btssN00hdrq/TvPBKSKk7YQ7pK468LYBh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0O6NS/btssN00hdrq/TvPBKSKk7YQ7pK468LYBh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0O6NS/btssN00hdrq/TvPBKSKk7YQ7pK468LYBh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0O6NS%2FbtssN00hdrq%2FTvPBKSKk7YQ7pK468LYBh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3456&quot; height=&quot;124&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.33.40.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 다음과 같이 해당 s3의 presigned url을 획득했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;presigned URL로 접근&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.34.17.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H4b7K/btssVU44vkM/XUvbqBxgXKhBN0o3KcU7J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H4b7K/btssVU44vkM/XUvbqBxgXKhBN0o3KcU7J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H4b7K/btssVU44vkM/XUvbqBxgXKhBN0o3KcU7J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH4b7K%2FbtssVU44vkM%2FXUvbqBxgXKhBN0o3KcU7J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1834&quot; height=&quot;428&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.34.17.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 URL로 접근했지만 Access Denied 당했다.. 그렇다면 object명이 잘못된 것이 아닌가 싶다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1693665718875&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl $(curl $(aws --profile test s3 presign s3://s3game-level7-zhovpo4j8588/somethingstrange --expires-in 3600))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.41.19.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVFunA/btssSDpZtFk/zFbAlkD91ftUz7kguVi9o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVFunA/btssSDpZtFk/zFbAlkD91ftUz7kguVi9o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVFunA/btssSDpZtFk/zFbAlkD91ftUz7kguVi9o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVFunA%2FbtssSDpZtFk%2FzFbAlkD91ftUz7kguVi9o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1658&quot; height=&quot;206&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.41.19.png&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.42.46.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9D3OE/btssUK9tdBd/vc4cqalDf3Gm4rIYcIYP00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9D3OE/btssUK9tdBd/vc4cqalDf3Gm4rIYcIYP00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9D3OE/btssUK9tdBd/vc4cqalDf3Gm4rIYcIYP00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9D3OE%2FbtssUK9tdBd%2Fvc4cqalDf3Gm4rIYcIYP00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3456&quot; height=&quot;948&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.42.46.png&quot; data-origin-width=&quot;3456&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 문제를 제대로 안봤다.. object명을 문제에서 제공한 somethingstrange로 다시 시도해 보았고 다음 Level로 가는 URL을 만날 수 있었다. 문제 잘 읽자...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level8 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693665865604&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com/level8.html&quot; data-og-url=&quot;https://s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com/level8.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com/level8.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com/level8.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level8-v6g8tp7ra2ld.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.44.38.png&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q5hXp/btssPufKBfl/BAo6sQfcLUAI0c3Ku4BbvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q5hXp/btssPufKBfl/BAo6sQfcLUAI0c3Ku4BbvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q5hXp/btssPufKBfl/BAo6sQfcLUAI0c3Ku4BbvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ5hXp%2FbtssPufKBfl%2FBAo6sQfcLUAI0c3Ku4BbvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1700&quot; height=&quot;1450&quot; data-filename=&quot;스크린샷 2023-09-02 오후 11.44.38.png&quot; data-origin-width=&quot;1700&quot; data-origin-height=&quot;1450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 문제는 CloudFront에 관련된 문제이며 Hint로 Bucket에 대한 IAM policy를 보여주고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 IAM 정책은 CloudFront의 경우 모든 s3 bucket에 대해&amp;nbsp; GetObject가 가능하다는 의미이다. 간략하게 말해서 &lt;b&gt;CloudFront만이 s3 bucket의 object에 접근이 가능한 것이다. &lt;/b&gt;이를 가능하게 하기위해 &lt;b&gt;문제에서는 CloudFront distribution URL도 제공&lt;/b&gt;해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 사용자는 접근하지 못하는 S3 bucket에 대해 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;CloudFront를 A서버&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #8a3db6;&quot;&gt;&lt;b&gt;S3 bucket object를 B서버&lt;/b&gt;&lt;/span&gt;라고 한다면 A서버인&amp;nbsp;&lt;b&gt;CloudFront의 권한을 이용하여 B서버인 s3 bucket object에 접근하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;SSRF&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라고 볼 수 있다(예시가 애매할 순 있지만 이해를 위해..ㅎㅎ) &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;=&amp;gt; 어쨌든 특히 클라우드에서는 이러한 취약점이 발생하지 않도록 IAM policy를 잘 생각하고 구성해야한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 object Listing&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693667166215&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level8-v6g8tp7ra2ld&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.06.58.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciMVMy/btssZgNyLb9/R4hJwGEpk5MFayNVXyfSck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciMVMy/btssZgNyLb9/R4hJwGEpk5MFayNVXyfSck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciMVMy/btssZgNyLb9/R4hJwGEpk5MFayNVXyfSck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciMVMy%2FbtssZgNyLb9%2FR4hJwGEpk5MFayNVXyfSck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1764&quot; height=&quot;128&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.06.58.png&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 우선 Level8의 bucket object를 확인해보니 &quot;treasure8_CDN&quot;이라는 object가 보였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 문제에서 말한 &lt;b&gt;&quot;bucket에 대해 직접 접근을 막았다면 object를 Listing하는 것도 허용하지 말라고&quot;&lt;/b&gt; 한 이유가 여기 있었다. 결국에 해당 bucket은 Cloudfront를 통해 서비스 중이므로 object명을 Listing을 통해 알게 되었으니&lt;b&gt; Cloudfront URL을 통해 object에 접근이 가능&lt;/b&gt;하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CloudFront URL을 통해 S3 object 접근&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693667380870&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl d2suiw06vujwz3.cloudfront.net/treasure8_CDN&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.09.55.png&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQ9TW/btssNjMw7dO/IjgKkoPKgGldX9xGhNTauk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQ9TW/btssNjMw7dO/IjgKkoPKgGldX9xGhNTauk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQ9TW/btssNjMw7dO/IjgKkoPKgGldX9xGhNTauk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQ9TW%2FbtssNjMw7dO%2FIjgKkoPKgGldX9xGhNTauk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1840&quot; height=&quot;240&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.09.55.png&quot; data-origin-width=&quot;1840&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 아주 손쉽게 CloudFront URL로 해당 object에 접근하여 다음 Level로 갈 수 있게 되었다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level9 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693667951328&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/level9.html&quot; data-og-url=&quot;https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/level9.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/level9.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/level9.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.23.17.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfPHSu/btssThAdFMw/sa8ozkbn9q7iq3eT5Vfjh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfPHSu/btssThAdFMw/sa8ozkbn9q7iq3eT5Vfjh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfPHSu/btssThAdFMw/sa8ozkbn9q7iq3eT5Vfjh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfPHSu%2FbtssThAdFMw%2Fsa8ozkbn9q7iq3eT5Vfjh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;1466&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.23.17.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;1466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이번 문제는 referer에 관련된 문제로 IAM policy를 보면 &lt;b&gt;aws:Referer가 &quot;http://s3game.treasure&quot;이여야 &quot;s3game-level9-781xtls2quvy/treasure9_referer&quot;를 GetObject 할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;curl 명령어의 referer 옵션을 통한 요청&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693669279456&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -e &quot;http://s3game.treasure&quot; https://s3game-level9-781xtls2quvy.s3.us-east-2.amazonaws.com/treasure9_referer&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.42.07.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/weDpk/btssUatQOOv/MJSe32URWD8F2vSIHxLYt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/weDpk/btssUatQOOv/MJSe32URWD8F2vSIHxLYt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/weDpk/btssUatQOOv/MJSe32URWD8F2vSIHxLYt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FweDpk%2FbtssUatQOOv%2FMJSe32URWD8F2vSIHxLYt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1834&quot; height=&quot;212&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.42.07.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 문제에서 제공한 IAM Policy를 allow하기 위해 curl에 -e 옵션을 통해 referer값을 &quot;http://s3game.treasure&quot;로 맞춰주고 s3 bucket을 URL 형식으로 변환하여 요청하면 다음 Level로 갈 수 있게 된다 ~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level10 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693669516314&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;_ _______ _______ _ __ _______ ( \ ( ____ \|\ /|( ____ \( \ / \ ( __ ) | ( | ( \/| ) ( || ( \/| ( \/) ) | ( ) | | | | (__ | | | || (__ | | | | | | / | | | | __) ( ( ) )| __) | | | | | (/ /) | | | | ( \ \_/ / | ( | | | | | / | | | (____/\| (____/\ \ / | (__&quot; data-og-host=&quot;s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com/level10.html&quot; data-og-url=&quot;https://s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com/level10.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com/level10.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com/level10.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;_ _______ _______ _ __ _______ ( \ ( ____ \|\ /|( ____ \( \ / \ ( __ ) | ( | ( \/| ) ( || ( \/| ( \/) ) | ( ) | | | | (__ | | | || (__ | | | | | | / | | | | __) ( ( ) )| __) | | | | | (/ /) | | | | ( \ \_/ / | ( | | | | | / | | | (____/\| (____/\ \ / | (__&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level10-gac6tf83erp6.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.44.59.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;1266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTQPb/btssUKuStJ8/gHcDqy0EXSh45QeyrmbxY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTQPb/btssUKuStJ8/gHcDqy0EXSh45QeyrmbxY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTQPb/btssUKuStJ8/gHcDqy0EXSh45QeyrmbxY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTQPb%2FbtssUKuStJ8%2FgHcDqy0EXSh45QeyrmbxY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1708&quot; height=&quot;1266&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.44.59.png&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;1266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Amazon S3는 용도에 따라 사용할 수 있게 다양한&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;storage classes를&lt;/span&gt; 제공하고 있다고 하며 대략적인 설명을 함께 제공하고 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 bucket sync 이용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693670248507&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 sync s3://s3game-level10-gac6tf83erp6 .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.56.14.png&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIzL3J/btssTnmFeqA/KWzY40bkcON37m5kEk0QN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIzL3J/btssTnmFeqA/KWzY40bkcON37m5kEk0QN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIzL3J/btssTnmFeqA/KWzY40bkcON37m5kEk0QN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIzL3J%2FbtssTnmFeqA%2FKWzY40bkcON37m5kEk0QN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1954&quot; height=&quot;598&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.56.14.png&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 음.. 우선은 sync 명령을 통해 다운로드 하였더니 해당 bucket에서 2개의 파일만이 다운로드 되었다. 그 중 하나는 문제 페이지이고 나머지하나가 바로 우리가 찾던 다음 Level로 가는 정보가 들어있는 object 였다. 근데 풀고나서 드는 생각은 &lt;b&gt;&quot;문제의 힌트는 하나도 사용하지 않았는데 이렇게 푸는게 맞나???&quot;&lt;/b&gt; 였는데.. &lt;b&gt;아니나 다를까 출제 의도는 이렇게 푸는게 아니였다&lt;/b&gt;.. 크흠...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3api list-object에 --query 사용&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693670709458&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3api list-objects --bucket s3game-level10-gac6tf83erp6 --query 'Contents[?StorageClass == `STANDARD_IA`]'
aws --profile test s3 cp s3://s3game-level10-gac6tf83erp6/djq30a807iyq -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.05.26.png&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/enRpTg/btssSpZBjiC/0skPKOK10wD2M1cy0RBka0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/enRpTg/btssSpZBjiC/0skPKOK10wD2M1cy0RBka0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/enRpTg/btssSpZBjiC/0skPKOK10wD2M1cy0RBka0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FenRpTg%2FbtssSpZBjiC%2F0skPKOK10wD2M1cy0RBka0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;382&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.05.26.png&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; s3api의 list-object에 StorageClass가 &quot;STANDARD_IA&quot;인 것을 조회하였더니 하나의 object만 확인할 수 있었다. 출제자의 의도는 이렇게 푸는 것이 맞는 것 같다...ㅎㅎ 출제자는 아마도 수많은 object를 다 확인하지 않을거라고 생각한 것 같지만 하나의 object만 접근이 가능해서 아주 쉽게 날로 풀었다.. 아니면 문제를 위해서 알면서도 뒀을지도..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level11 마지막 문제 &amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693670396521&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com/level11.html&quot; data-og-url=&quot;https://s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com/level11.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com/level11.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com/level11.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level11-djq30a807iyq.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.59.32.png&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;1430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEqaSw/btssPuUnYIk/fPn3MikgY7vVIN4HJZKq20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEqaSw/btssPuUnYIk/fPn3MikgY7vVIN4HJZKq20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEqaSw/btssPuUnYIk/fPn3MikgY7vVIN4HJZKq20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEqaSw%2FbtssPuUnYIk%2FfPn3MikgY7vVIN4HJZKq20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1738&quot; height=&quot;1430&quot; data-filename=&quot;스크린샷 2023-09-03 오전 12.59.32.png&quot; data-origin-width=&quot;1738&quot; data-origin-height=&quot;1430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이번 문제에서는&lt;b&gt; 평문파일의 object를 안전하게 지키기위해 암호화하는 기능인 SSE(Server-Side Encryption)&lt;/b&gt;에 대해서 말하고 있다. 참고로 &lt;b&gt;AWS에서는 S3 암호화 옵션을 활성화하면 자동으로 수행&lt;/b&gt;해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;=&amp;gt; 문제에서는 암호화에 사용된 Server-Side Encryption Key 값을 알려주고 있기 때문에 GetObject 시, 옵션으로 사용하면 --sse-c-key를 통해 object를 복호화하여 다운로드 할 수 있다. SSE는 &lt;b&gt;SSE-S3 또는 SSE-KMS 키를 암호화 옵션을 지정&lt;/b&gt;할 수 있으며 둘다 &lt;b&gt;AES256 알고리즘을 사용하여 데이터를 암호화&lt;/b&gt; 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;s3 bucket object Listing &amp;amp; get object&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693671167294&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 ls s3://s3game-level11-djq30a807iyq
aws --profile test s3 cp s3://s3game-level11-djq30a807iyq/treasure11_encryption -&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.12.21.png&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xOWJK/btssVURyxFh/nfYQkCbfrROrRUzkaDx3xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xOWJK/btssVURyxFh/nfYQkCbfrROrRUzkaDx3xK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xOWJK/btssVURyxFh/nfYQkCbfrROrRUzkaDx3xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxOWJK%2FbtssVURyxFh%2FnfYQkCbfrROrRUzkaDx3xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;122&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.12.21.png&quot; data-origin-width=&quot;1868&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.13.41.png&quot; data-origin-width=&quot;2754&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUTfD/btssTmuwa3m/uYk1eucmUmz4RKM42so0bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUTfD/btssTmuwa3m/uYk1eucmUmz4RKM42so0bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUTfD/btssTmuwa3m/uYk1eucmUmz4RKM42so0bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUTfD%2FbtssTmuwa3m%2FuYk1eucmUmz4RKM42so0bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2754&quot; height=&quot;96&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.13.41.png&quot; data-origin-width=&quot;2754&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 bucket에는 treasure11_encrpytion이라는 의심스러운 object가 존재했다. 내용을 보고 싶었지만 400 Error로 (이렇게 간단하게 풀릴리가 없기 때문에) 당연히 실패했다. 그렇다면 문제에서 제공한 --sse-c랑 --sse-c-key 옵션을 통해 Server-side key값을 사용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Server-side key 값을 이용하여&amp;nbsp; s3 get object 진행&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1693671838353&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws --profile test s3 cp s3://s3game-level11-djq30a807iyq/treasure11_encryption - --sse-c AES256 --sse-c-key &quot;UkXp2s5v8y/B?E(H+MbPeShVmYq3t6w9&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.25.05.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nL7rh/btssPwdCyZX/O980teKBQUYYyOyvKGGDZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nL7rh/btssPwdCyZX/O980teKBQUYYyOyvKGGDZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nL7rh/btssPwdCyZX/O980teKBQUYYyOyvKGGDZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnL7rh%2FbtssPwdCyZX%2FO980teKBQUYYyOyvKGGDZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;274&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.25.05.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 마지막으로 가는 URL까지 알아낼 수 있었다. 마지막 문제는 생각보다 쉽게 끝났다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt; Level12&amp;nbsp; 모든 Treasure을 다모았다&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1693671923168&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;S3 Game&quot; data-og-description=&quot;&quot; data-og-host=&quot;s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;https://s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com/level12.html&quot; data-og-url=&quot;https://s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com/level12.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com/level12.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com/level12.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;S3 Game&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;s3game-level12-bk0m5ax5n92o.s3.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.26.24.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;983&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmFCTH/btssSBFLoRV/jUk0RFVKgjufmFeF75Ol51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmFCTH/btssSBFLoRV/jUk0RFVKgjufmFeF75Ol51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmFCTH/btssSBFLoRV/jUk0RFVKgjufmFeF75Ol51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmFCTH%2FbtssSBFLoRV%2FjUk0RFVKgjufmFeF75Ol51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;806&quot; height=&quot;983&quot; data-filename=&quot;스크린샷 2023-09-03 오전 1.26.24.png&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;983&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이렇게 해당 &lt;b&gt;s3game 11문제를&amp;nbsp;ALL Clear&lt;/b&gt; 했다~ s3에 전반적인 부분들을 익힐 수 있는 좋은 문제들이였다~&lt;/p&gt;</description>
      <category>Infra/CloudSecurity</category>
      <category>AHSS</category>
      <category>AWS</category>
      <category>AWS Security</category>
      <category>Kubernetes</category>
      <category>s3game</category>
      <category>가시다</category>
      <category>가시다 스터디</category>
      <category>보안</category>
      <category>클라우드</category>
      <category>클라우드보안</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/326</guid>
      <comments>https://ho-story.tistory.com/326#entry326comment</comments>
      <pubDate>Fri, 1 Sep 2023 21:08:55 +0900</pubDate>
    </item>
    <item>
      <title>[Openshift] OCP구축하기(feat. Assisted Installer)</title>
      <link>https://ho-story.tistory.com/325</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;OCP란&amp;nbsp;&lt;/h2&gt;
&lt;figure id=&quot;og_1691839623940&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Product Documentation for OpenShift Container Platform 4.13 | Red Hat Customer Portal&quot; data-og-description=&quot;Access Red Hat&amp;rsquo;s knowledge, guidance, and support through your subscription.&quot; data-og-host=&quot;access.redhat.com&quot; data-og-source-url=&quot;https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.13&quot; data-og-url=&quot;https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.13&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dy0yk8/hyTCCcTfDs/jHZiLWse5sD3HDGGWPFEyk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bPdMtW/hyTCyO6jbY/YMc7biSwJ84AhmwKr5m9m0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.13&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.13&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dy0yk8/hyTCCcTfDs/jHZiLWse5sD3HDGGWPFEyk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bPdMtW/hyTCyO6jbY/YMc7biSwJ84AhmwKr5m9m0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Product Documentation for OpenShift Container Platform 4.13 | Red Hat Customer Portal&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Access Red Hat&amp;rsquo;s knowledge, guidance, and support through your subscription.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;access.redhat.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회사에서 OCP 관련 업무를 맡게되어서 구축해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Openshift Contianer Platform의 약자인 OCP는 Kubernetes 기반의 &lt;/b&gt;Redhat에서 만든 서비스이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubernetes에 추가적으로 monitoring, logging, CI/CD, Service Mesh 등의 운영에 필요하거나 편리한 tool들이 포함되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이제 구축해보자!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Assisted Installer를 이용한 OCP 구축&lt;b&gt;(4.13버전)&lt;/b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;figure id=&quot;og_1691837347617&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Hybrid Cloud Console&quot; data-og-description=&quot;&quot; data-og-host=&quot;console.redhat.com&quot; data-og-source-url=&quot;https://console.redhat.com/&quot; data-og-url=&quot;https://console.redhat.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.redhat.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://console.redhat.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Hybrid Cloud Console&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;console.redhat.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 처음부터 끝까지 구축하기보다는 Openshift에서 제공하는 Assisted Installer를 사용하여 구축해보려고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Redhat Hybrid Cloud Console에 접속하자.&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.49.33.png&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eymE6y/btsqZ0Hk8vc/hFnzGpk50kg4SsNbRYsCyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eymE6y/btsqZ0Hk8vc/hFnzGpk50kg4SsNbRYsCyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eymE6y/btsqZ0Hk8vc/hFnzGpk50kg4SsNbRYsCyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeymE6y%2FbtsqZ0Hk8vc%2FhFnzGpk50kg4SsNbRYsCyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1534&quot; height=&quot;765&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.49.33.png&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Red Hat Openshit로 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Cluster 생성(최소 Node 3개이상 필요)&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsK5Nv/btsq5YOOTI0/f3Ub6RkF7jXA36jOzpRAF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsK5Nv/btsq5YOOTI0/f3Ub6RkF7jXA36jOzpRAF1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;845&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.50.46.png&quot; style=&quot;width: 59.3357%; margin-right: 10px;&quot; data-widthpercent=&quot;60.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsK5Nv/btsq5YOOTI0/f3Ub6RkF7jXA36jOzpRAF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsK5Nv%2Fbtsq5YOOTI0%2Ff3Ub6RkF7jXA36jOzpRAF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;845&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVlwLh/btsq2QwKldk/DPFgvkgH0yKt8WtW7Ik291/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVlwLh/btsq2QwKldk/DPFgvkgH0yKt8WtW7Ik291/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;836&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.53.25.png&quot; style=&quot;width: 39.5015%;&quot; data-widthpercent=&quot;39.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVlwLh/btsq2QwKldk/DPFgvkgH0yKt8WtW7Ik291/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVlwLh%2Fbtsq2QwKldk%2FDPFgvkgH0yKt8WtW7Ik291%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Cluster를 생성해보자. 나는 Local에 설치한 VM fusion을 이용하여 cluster를 구축할 것이다. Cluster name과 Base Domain을 원하는 값으로 작성해주고 CPU를 설정해준다. 나의 경우 M2 MacBook이라 Arm64로 설정해주었다. 나머지는 기본값으로 진행했다(컴퓨터 사양때문에 조금 가볍게 진행하고 싶다면 Single Node Openshift - SNO를 선택하자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. Host 추가&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sts3b/btsqZacs3Ox/qPtmRPlNknC9kKeCYk7g8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sts3b/btsqZacs3Ox/qPtmRPlNknC9kKeCYk7g8K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;781&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.55.29.png&quot; style=&quot;width: 36.3274%; margin-right: 10px;&quot; data-widthpercent=&quot;36.75&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sts3b/btsqZacs3Ox/qPtmRPlNknC9kKeCYk7g8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsts3b%2FbtsqZacs3Ox%2FqPtmRPlNknC9kKeCYk7g8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;979&quot; height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEN57L/btsqZyxwAd9/qtyzo11zawTZRXuHnKKkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEN57L/btsqZyxwAd9/qtyzo11zawTZRXuHnKKkkk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;688&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.55.15.png&quot; data-widthpercent=&quot;63.25&quot; style=&quot;width: 62.5098%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEN57L/btsqZyxwAd9/qtyzo11zawTZRXuHnKKkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEN57L%2FbtsqZyxwAd9%2Fqtyzo11zawTZRXuHnKKkkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1484&quot; height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Operators에서는 기본값으로 진행했고 이제 OCP를 구성할 Host를 찾을 수 있도록 설정해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;- ISO image generate&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFjQqP/btsq0xY2mcp/QbyMkgdoQIN00FAFJic3u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFjQqP/btsq0xY2mcp/QbyMkgdoQIN00FAFJic3u1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;544&quot; data-origin-height=&quot;763&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.57.14.png&quot; style=&quot;width: 34.7276%; margin-right: 10px;&quot; data-widthpercent=&quot;35.14&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFjQqP/btsq0xY2mcp/QbyMkgdoQIN00FAFJic3u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFjQqP%2Fbtsq0xY2mcp%2FQbyMkgdoQIN00FAFJic3u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;544&quot; height=&quot;763&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGtzPd/btsq2QcsrmH/41W0yowkeCjfLRaKayRMgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGtzPd/btsq2QcsrmH/41W0yowkeCjfLRaKayRMgK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;895&quot; data-filename=&quot;스크린샷 2023-08-12 오후 7.57.37.png&quot; style=&quot;width: 64.1096%;&quot; data-widthpercent=&quot;64.86&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGtzPd/btsq2QcsrmH/41W0yowkeCjfLRaKayRMgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGtzPd%2Fbtsq2QcsrmH%2F41W0yowkeCjfLRaKayRMgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1178&quot; height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Assisted Installer를 사용하는 이유가 아닌가 싶다. Cluster를 구성할 Node들에서 설정해야할 내용들을 알아서 ISO 이미지로 만들어준다. 이를 Generate하기전에 나의경우 Provisioning type을 Minimal image file로 선택해주었고 그다음 내가 사용할 SSH public key만 준비해서 넣어주면된다. 아래의 Generate를 클릭하면 오른쪽 그림과 같이 ISO 이미지를 다운로드 할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. VM Fusion을 이용한 node 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dd72CZ/btsqZu2NjIp/kzk6dXg5fpgdRCwhk8aL90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dd72CZ/btsqZu2NjIp/kzk6dXg5fpgdRCwhk8aL90/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;1030&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.01.09.png&quot; style=&quot;width: 37.0291%; margin-right: 10px;&quot; data-widthpercent=&quot;37.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dd72CZ/btsqZu2NjIp/kzk6dXg5fpgdRCwhk8aL90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdd72CZ%2FbtsqZu2NjIp%2Fkzk6dXg5fpgdRCwhk8aL90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XseJI/btsq1cf97wh/KBmIp6qkbNuNE8qF3ZuIf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XseJI/btsq1cf97wh/KBmIp6qkbNuNE8qF3ZuIf1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;620&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.02.06.png&quot; style=&quot;width: 61.8081%;&quot; data-widthpercent=&quot;62.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XseJI/btsq1cf97wh/KBmIp6qkbNuNE8qF3ZuIf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXseJI%2Fbtsq1cf97wh%2FKBmIp6qkbNuNE8qF3ZuIf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Cluster에서 Node로 사용될 가상머신을 만들어주었다. 참고로 Openshift의 node들은 굉장히 고사양이 필요하다. 어지간한 노트북으로는 구축도 안된다...나도 꽤많은 프로세서와 메모리, 하드(400GB)를 넣어주었다. 참고로 해당 클러스터 구축 시, 필요한 최소사양이 있으니 참고하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[주의] 가상머신 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.02.49.png&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/68bjt/btsqZeF6dcH/edSrtQ6tFxyS1k1bV4nQ81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/68bjt/btsqZeF6dcH/edSrtQ6tFxyS1k1bV4nQ81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/68bjt/btsqZeF6dcH/edSrtQ6tFxyS1k1bV4nQ81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F68bjt%2FbtsqZeF6dcH%2FedSrtQ6tFxyS1k1bV4nQ81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2030&quot; height=&quot;1530&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.02.49.png&quot; data-origin-width=&quot;2030&quot; data-origin-height=&quot;1530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 참고로 생성을 진행하게되면 위와같은 화면을 보게될텐데. &quot;왜 멈췄지??&quot; 하면서 삭제하고 다시 만드는 삽질은 하지말길 바란다. 대략 2~5분사이를 대기하면 자동으로 만들어진다(ㅠㅠ안되는줄알고 삽질했다..) 이런식으로 3개를 만들어주자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Cluster를 구성할 Node Role 선택&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.12.30.png&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bESSPF/btsq1KwNPjJ/Rac7ePOyVcYILbyk0sntBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bESSPF/btsq1KwNPjJ/Rac7ePOyVcYILbyk0sntBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bESSPF/btsq1KwNPjJ/Rac7ePOyVcYILbyk0sntBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbESSPF%2Fbtsq1KwNPjJ%2FRac7ePOyVcYILbyk0sntBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1555&quot; height=&quot;800&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.12.30.png&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Node를 모두 생성하게되면 console에서 자동으로 탐지를 진행한다. 위와같이 목록에 생성한 3개의 node가 보여지면 Role을 선택해준다. Control plane node를 선택했지만 자동으로 Controlplane node + worker node가 되었다. 이후 storage는 Pass했다. 참고로 최소 클러스터 구성조건은 Master, Worker node 각각 3개이상이다. 하지만 하나의 node를 master와 worker로 사용이 가능했다. 따라서 3대만 있어도 구축은 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;6. Networking 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.15.40.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uKhVg/btsqYSC9231/79gSlkiaRs1FgUvUhCLTGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uKhVg/btsqYSC9231/79gSlkiaRs1FgUvUhCLTGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uKhVg/btsqYSC9231/79gSlkiaRs1FgUvUhCLTGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuKhVg%2FbtsqYSC9231%2F79gSlkiaRs1FgUvUhCLTGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;756&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.15.40.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; API IP와 Ingress IP를 설정해주고 다음으로 넘어가자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;7. Cluster Installation&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.16.45.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pvGS9/btsq0x5OgcD/tbkCwDlBYuvCXDe1DeVzdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pvGS9/btsq0x5OgcD/tbkCwDlBYuvCXDe1DeVzdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pvGS9/btsq0x5OgcD/tbkCwDlBYuvCXDe1DeVzdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpvGS9%2Fbtsq0x5OgcD%2FtbkCwDlBYuvCXDe1DeVzdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;960&quot; height=&quot;721&quot; data-filename=&quot;스크린샷 2023-08-12 오후 8.16.45.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 어떤설정으로 cluster가 구축될지 preview를 해주고 install을 진행하면 cluster를 생성하기 시작한다. 이 때부터는 그냥 기다리기만하면된다. 내 기준 1시간 정도 걸렸던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;설치완료 &amp;amp; Web Console 접속&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m9yAF/btsqZ17owDS/WrRMsNJAlwJe36RJcEpqz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m9yAF/btsqZ17owDS/WrRMsNJAlwJe36RJcEpqz0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;2746&quot; data-origin-height=&quot;1020&quot; data-filename=&quot;스크린샷 2023-08-12 오후 9.24.17.png&quot; style=&quot;width: 53.262%; margin-right: 10px;&quot; data-widthpercent=&quot;53.89&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m9yAF/btsqZ17owDS/WrRMsNJAlwJe36RJcEpqz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm9yAF%2FbtsqZ17owDS%2FWrRMsNJAlwJe36RJcEpqz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2746&quot; height=&quot;1020&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcgpN/btsqYTITjOF/Rn8wVlLN5QN6vdahOwi5Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcgpN/btsqYTITjOF/Rn8wVlLN5QN6vdahOwi5Ak/img.png&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;718&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.5752%;&quot; data-widthpercent=&quot;46.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BcgpN/btsqYTITjOF/Rn8wVlLN5QN6vdahOwi5Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcgpN%2FbtsqYTITjOF%2FRn8wVlLN5QN6vdahOwi5Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1654&quot; height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3040&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diBiav/btsq1aJhv8M/464Zx9zWBfr9evrQv1GnL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diBiav/btsq1aJhv8M/464Zx9zWBfr9evrQv1GnL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diBiav/btsq1aJhv8M/464Zx9zWBfr9evrQv1GnL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiBiav%2Fbtsq1aJhv8M%2F464Zx9zWBfr9evrQv1GnL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3040&quot; height=&quot;1640&quot; data-origin-width=&quot;3040&quot; data-origin-height=&quot;1640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 그렇다면 이제 Web Console에 접속해보자 계정의 경우 아래에 알려주고 있다. Web Console에 접근이 되지 않는다면 DNS 설정이 되지 않아서인데 아래에 친절하게 접근되지 않을 경우 조치방법을 알려주고 있다. &quot;/etc/hosts&quot; 파일 또는 &quot;/etc/resolves.conf&quot; 파일에 안내하는 내용을 붙여넣어주면 된다. 위와같이 드디어 Web Console에 접근할 수 있게된다!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;kubectl 또는 OC 사용&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 10.14.01.png&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boQc8V/btsqZD6i3rL/vLeKZNA4GOcql6toiNi021/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boQc8V/btsqZD6i3rL/vLeKZNA4GOcql6toiNi021/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boQc8V/btsqZD6i3rL/vLeKZNA4GOcql6toiNi021/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboQc8V%2FbtsqZD6i3rL%2FvLeKZNA4GOcql6toiNi021%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1770&quot; height=&quot;82&quot; data-filename=&quot;스크린샷 2023-08-12 오후 10.14.01.png&quot; data-origin-width=&quot;1770&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1691846068796&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;oc login&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-12 오후 10.14.56.png&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/62vIn/btsq1aJiou3/wkMkqxCkn0TG1aT9w0hip0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/62vIn/btsq1aJiou3/wkMkqxCkn0TG1aT9w0hip0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/62vIn/btsq1aJiou3/wkMkqxCkn0TG1aT9w0hip0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F62vIn%2Fbtsq1aJiou3%2FwkMkqxCkn0TG1aT9w0hip0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2806&quot; height=&quot;714&quot; data-filename=&quot;스크린샷 2023-08-12 오후 10.14.56.png&quot; data-origin-width=&quot;2806&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 명령을 진행하면 관리자 계정에 대한 token 정보나 login 방법, API 사용예시 등을 알려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o080r/btsqYSJWB3l/qHywrkKvT2j4cxNRTvk1k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o080r/btsqYSJWB3l/qHywrkKvT2j4cxNRTvk1k0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;1076&quot; data-filename=&quot;스크린샷 2023-08-12 오후 9.32.15.png&quot; style=&quot;width: 30.6849%; margin-right: 10px;&quot; data-widthpercent=&quot;31.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o080r/btsqYSJWB3l/qHywrkKvT2j4cxNRTvk1k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo080r%2FbtsqYSJWB3l%2FqHywrkKvT2j4cxNRTvk1k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1584&quot; height=&quot;1076&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUybmY/btsq2j0b3LO/Nxd6m34Px0CZtCgy7KcVI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUybmY/btsq2j0b3LO/Nxd6m34Px0CZtCgy7KcVI1/img.png&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;382&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;68.95&quot; style=&quot;width: 68.1523%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUybmY/btsq2j0b3LO/Nxd6m34Px0CZtCgy7KcVI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUybmY%2Fbtsq2j0b3LO%2FNxd6m34Px0CZtCgy7KcVI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 추가적으로 kubectl을 사용하기위해서는 kubeconfig를 이용해야한다. kubectl은 API요청을 편리하게 사용하는 것과 같다고 볼 수 있으며 그때 사용하는 인증정보가 kubeconfig에 담겨있기 때문에 해당 파일관리는 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kubectl 또는 oc 명령어를 통해 다음과 같이 Pod가 조회되지 않는다면 .kube/config파일을 다운로드한 kubeconfig 파일로 대체해보자. 우리가 보통 구축해서 사용하던 kubernetes와 다르게 방대한 양의 Pod가 돌고 있는 것을 볼 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ 참고 ] OCP Command-line interface tool&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1691839538322&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Hybrid Cloud Console&quot; data-og-description=&quot;&quot; data-og-host=&quot;console.redhat.com&quot; data-og-source-url=&quot;https://console.redhat.com/openshift/downloads&quot; data-og-url=&quot;https://console.redhat.com/openshift/downloads&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://console.redhat.com/openshift/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://console.redhat.com/openshift/downloads&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Hybrid Cloud Console&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;console.redhat.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; OCP를 관리할 때 사용할 tool은 위의 경로에서 설치하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[ 자동완성 ]&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1691845236688&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# zsh 사용시
oc completion zsh &amp;gt; oc

# bash 사용시
oc completion bash &amp;gt; oc

# 이후 .zshrc 또는 .bashrc 파일 하단에 아래내용 입력 후 저장
=&amp;gt; source {경로}/oc 추가

# source .zshrc 또는 source .bashrc 실행&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Infra/Kubernetes</category>
      <category>Assisted Installer</category>
      <category>Cloud</category>
      <category>container</category>
      <category>Kubernetes</category>
      <category>ocp</category>
      <category>OpenShift</category>
      <category>OpenShift Container Platform</category>
      <category>redhat</category>
      <category>보안</category>
      <category>인프라</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/325</guid>
      <comments>https://ho-story.tistory.com/325#entry325comment</comments>
      <pubDate>Sat, 12 Aug 2023 20:06:31 +0900</pubDate>
    </item>
    <item>
      <title>[AWS] flAWS2 Challenge - Level3(Attacker)</title>
      <link>https://ho-story.tistory.com/324</link>
      <description>&lt;figure id=&quot;og_1689827650307&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;flAWS2.cloud&quot; data-og-description=&quot;&quot; data-og-host=&quot;level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud&quot; data-og-source-url=&quot;http://level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud/&quot; data-og-url=&quot;http://level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;flAWS2.cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;level3-oc6ou6dnkw8sszwvdrraxc5t5udrsw3s.flaws2.cloud&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxczJ/btsofpp3ia5/4YTDk9nryFMzFUaDPB8oKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxczJ/btsofpp3ia5/4YTDk9nryFMzFUaDPB8oKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxczJ/btsofpp3ia5/4YTDk9nryFMzFUaDPB8oKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxczJ%2Fbtsofpp3ia5%2F4YTDk9nryFMzFUaDPB8oKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1472&quot; height=&quot;641&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1689827696246&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] flAWS Challenge - Level5&quot; data-og-description=&quot;flAWS level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud 문제확인 =&amp;gt; 해당 문제에서는 그저 HTTP proxy 역할만하는 EC2를 sample로 주고 사용법을 알려주고 있다. 실제로 proxy인지 테스트 해보았고 진짜 단순한 proxy&quot; data-og-host=&quot;xn--vj5b11biyw.kr&quot; data-og-source-url=&quot;https://ho-story.tistory.com/320&quot; data-og-url=&quot;https://xn--vj5b11biyw.kr/320&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eX6w8/hyTnHLNVxi/DvvRTsla0DIzh4yK5jVCyk/img.png?width=800&amp;amp;height=642&amp;amp;face=0_0_800_642,https://scrap.kakaocdn.net/dn/iVxO5/hyTmwkNRy7/DrE8GvjvW66cqwp1ybP6lk/img.png?width=800&amp;amp;height=642&amp;amp;face=0_0_800_642,https://scrap.kakaocdn.net/dn/ua1qR/hyTnM0E8YX/ugCKCEkbEz3KXzZhpmHfU0/img.png?width=1652&amp;amp;height=808&amp;amp;face=0_0_1652_808&quot;&gt;&lt;a href=&quot;https://ho-story.tistory.com/320&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ho-story.tistory.com/320&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eX6w8/hyTnHLNVxi/DvvRTsla0DIzh4yK5jVCyk/img.png?width=800&amp;amp;height=642&amp;amp;face=0_0_800_642,https://scrap.kakaocdn.net/dn/iVxO5/hyTmwkNRy7/DrE8GvjvW66cqwp1ybP6lk/img.png?width=800&amp;amp;height=642&amp;amp;face=0_0_800_642,https://scrap.kakaocdn.net/dn/ua1qR/hyTnM0E8YX/ugCKCEkbEz3KXzZhpmHfU0/img.png?width=1652&amp;amp;height=808&amp;amp;face=0_0_1652_808');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] flAWS Challenge - Level5&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;flAWS level5-d2891f604d2061b6977c2481b0c8333e.flaws.cloud 문제확인 =&amp;gt; 해당 문제에서는 그저 HTTP proxy 역할만하는 EC2를 sample로 주고 사용법을 알려주고 있다. 실제로 proxy인지 테스트 해보았고 진짜 단순한 proxy&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;xn--vj5b11biyw.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 옹? 이번문제는 기존에 flaws-1에서 풀었던 Level5와 비슷한 문제이다. 해당 문제와 동일하게 Proxy만 하나 제시해준다. 그외에 별다른 힌트는 주지않았지만 기존에 풀었던 문제처럼 뭔가 내부에 접근가능한 요청을 보내서 정보를 유출시켜야 할 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;혹시?? 50000% 안될 것 같지만??&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689828065791&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;인스턴스 메타데이터 검색 - Amazon Elastic Compute Cloud&quot; data-og-description=&quot;Amazon EC2가 새 인스턴스 메타데이터 빌드를 릴리스할 때마다 코드를 업데이트하지 않으려면 버전 번호가 아니라, 경로에서 latest를 사용하는 것이 좋습니다. 예를 들어, 다음과 같이 latest를 사용&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;인스턴스 메타데이터 검색 - Amazon Elastic Compute Cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Amazon EC2가 새 인스턴스 메타데이터 빌드를 릴리스할 때마다 코드를 업데이트하지 않으려면 버전 번호가 아니라, 경로에서 latest를 사용하는 것이 좋습니다. 예를 들어, 다음과 같이 latest를 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1689827820835&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://container.target.flaws2.cloud/proxy/http://169.254.169.254/latest/meta-data/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TuSBp/btsohpJAbAr/I8HK9suOuJ3nEJmzEkS1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TuSBp/btsohpJAbAr/I8HK9suOuJ3nEJmzEkS1K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TuSBp/btsohpJAbAr/I8HK9suOuJ3nEJmzEkS1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTuSBp%2FbtsohpJAbAr%2FI8HK9suOuJ3nEJmzEkS1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;244&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; flaws-1 Level5에서 진행했던 instance metadata 검색으로 시도해봤지만 아무런 반응이 없다ㅎㅎ 역시 똑같은 문제는 낼리가 없었다. 그렇다면 비슷한 방법중에 다른게 뭐가 있을까 구글링을 시도했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Task Metadata &lt;b&gt;Endpoint &lt;/b&gt;검색&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689829858156&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Task Metadata Endpoint version 2 - Amazon Elastic Container Service&quot; data-og-description=&quot;The task metadata version 2 endpoint is no longer being actively maintained. We recommend that you update the task metadata version 4 endpoint to get the latest metadata endpoint information. For more information, see Task metadata endpoint version 4. Begi&quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html#task-metadata-endpoint-v2-paths&quot; data-og-url=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html#task-metadata-endpoint-v2-paths&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html#task-metadata-endpoint-v2-paths&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html#task-metadata-endpoint-v2-paths&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Task Metadata Endpoint version 2 - Amazon Elastic Container Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The task metadata version 2 endpoint is no longer being actively maintained. We recommend that you update the task metadata version 4 endpoint to get the latest metadata endpoint information. For more information, see Task metadata endpoint version 4. Begi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1689829951982&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://container.target.flaws2.cloud/proxy/http://169.254.170.2/v2/metadata&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1701&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBAxgw/btsonmrrMPf/i9YwfACvNTORZVSYogDCT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBAxgw/btsonmrrMPf/i9YwfACvNTORZVSYogDCT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBAxgw/btsonmrrMPf/i9YwfACvNTORZVSYogDCT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBAxgw%2FbtsonmrrMPf%2Fi9YwfACvNTORZVSYogDCT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1701&quot; height=&quot;475&quot; data-origin-width=&quot;1701&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1689830039902&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JSON Formatter &amp;amp; Validator&quot; data-og-description=&quot;Format and validate JSON data so that it can easily be read by human beings.&quot; data-og-host=&quot;jsonformatter.curiousconcept.com&quot; data-og-source-url=&quot;https://jsonformatter.curiousconcept.com/#&quot; data-og-url=&quot;https://jsonformatter.curiousconcept.com&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkofYr/hyTnSl8XP5/h5a9x7biINuNxwD7u9GTY0/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144,https://scrap.kakaocdn.net/dn/bEOO6p/hyTmuHdN3V/er2qen7uBtuAPqUR15bI0K/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144&quot;&gt;&lt;a href=&quot;https://jsonformatter.curiousconcept.com/#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jsonformatter.curiousconcept.com/#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkofYr/hyTnSl8XP5/h5a9x7biINuNxwD7u9GTY0/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144,https://scrap.kakaocdn.net/dn/bEOO6p/hyTmuHdN3V/er2qen7uBtuAPqUR15bI0K/img.png?width=144&amp;amp;height=144&amp;amp;face=0_0_144_144');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JSON Formatter &amp;amp; Validator&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Format and validate JSON data so that it can easily be read by human beings.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jsonformatter.curiousconcept.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 오 뭔가 Json 형식의 많은 데이터가 나왔다. 아무것도 안나오다가 나오니 반갑다.. 해당 서비스의 container 관련된 정보들으로 추청된다. Json 포멧 정렬을 진행해서 보도록하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JSON 데이터 확인&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ewfw.PNG&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1037&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNLAFy/btsofNR98gs/F9QK6wIDGSQNnk5qqWqwQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNLAFy/btsofNR98gs/F9QK6wIDGSQNnk5qqWqwQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNLAFy/btsofNR98gs/F9QK6wIDGSQNnk5qqWqwQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNLAFy%2FbtsofNR98gs%2FF9QK6wIDGSQNnk5qqWqwQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1228&quot; height=&quot;1037&quot; data-filename=&quot;ewfw.PNG&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1037&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 해당 데이터를 보았을 때 ECS(Elastic Container Servivce)로 배포된 것을 알 수 있었고 ECS Cluster에 Task인 Container set에 대한 정보도 확인이 가능했다(현재 해당 Cluster에는 2개의 Docker Container가 존재했다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1689830872713&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[AWS] ECS vs Kubernetes&quot; data-og-description=&quot;컨테이너 서비스인 AWS ECS와 Kubernetes에 대해 비교해보려고 한다. 먼저 많이 언급되는 컨테이너 서비스의 장점을 먼저 살펴보자.- Continuous Delivery(CD): 흔히 DevOps에서 언급하는 지속적 배포 과정을 &quot; data-og-host=&quot;timewizhan.tistory.com&quot; data-og-source-url=&quot;https://timewizhan.tistory.com/entry/AWS-ECS-vs-Kubernetes&quot; data-og-url=&quot;https://timewizhan.tistory.com/entry/AWS-ECS-vs-Kubernetes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/t02ES/hyTnMzCRnF/pvudETadBnlJGJLTnnAhuK/img.png?width=800&amp;amp;height=580&amp;amp;face=0_0_800_580,https://scrap.kakaocdn.net/dn/bY92DL/hyTmu1F1fb/A1KLt6PGWbFgjL1srEPxHk/img.png?width=800&amp;amp;height=580&amp;amp;face=0_0_800_580,https://scrap.kakaocdn.net/dn/h8e1u/hyTmywdUee/zS3zyyDfZNUP9OgnWRhxxk/img.png?width=820&amp;amp;height=595&amp;amp;face=0_0_820_595&quot;&gt;&lt;a href=&quot;https://timewizhan.tistory.com/entry/AWS-ECS-vs-Kubernetes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://timewizhan.tistory.com/entry/AWS-ECS-vs-Kubernetes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/t02ES/hyTnMzCRnF/pvudETadBnlJGJLTnnAhuK/img.png?width=800&amp;amp;height=580&amp;amp;face=0_0_800_580,https://scrap.kakaocdn.net/dn/bY92DL/hyTmu1F1fb/A1KLt6PGWbFgjL1srEPxHk/img.png?width=800&amp;amp;height=580&amp;amp;face=0_0_800_580,https://scrap.kakaocdn.net/dn/h8e1u/hyTmywdUee/zS3zyyDfZNUP9OgnWRhxxk/img.png?width=820&amp;amp;height=595&amp;amp;face=0_0_820_595');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[AWS] ECS vs Kubernetes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너 서비스인 AWS ECS와 Kubernetes에 대해 비교해보려고 한다. 먼저 많이 언급되는 컨테이너 서비스의 장점을 먼저 살펴보자.- Continuous Delivery(CD): 흔히 DevOps에서 언급하는 지속적 배포 과정을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;timewizhan.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Json 데이터를 보니 Task내에 Pause container 추정되는 container + 다른 container가 같이 존재하는 것을 보고 ECS의 Cluster내의 Task는 Kubernetes의 Pod와 같은건가?? 했는데&amp;nbsp; 같다고 할 순 없지만 찾아보니 비슷한 건 맞긴 했다..ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt;&lt;b&gt; 하지만 결론적으로 딱히 &lt;span style=&quot;color: #ee2323;&quot;&gt;나에게 필요한 정보는 없는 것&lt;/span&gt; 같았다.&amp;nbsp;&lt;/b&gt; 음....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;LFI(Local File Inclusion) - 참고: &lt;/b&gt;&lt;a href=&quot;https://www.hahwul.com/cullinan/file-inclusion/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.hahwul.com/cullinan/file-inclusion/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689834470317&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;file: URI 에 대한 궁금증&quot; data-og-description=&quot;file:URI 에 대한 개념 및 사용법, StackOverflow, Wikipedia&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@codren/file&quot; data-og-url=&quot;https://velog.io/@codren/file&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcdSuk/hyTnVDoiQM/E0VQpnMunzMx7RehkcKbF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/uJF51/hyTnRgEl5P/zgHCna8SmkJBDBvEJGUo1k/img.png?width=1029&amp;amp;height=576&amp;amp;face=0_0_1029_576,https://scrap.kakaocdn.net/dn/wR4Wb/hyTnTS4xDE/bT6E6ZmTHBIoJFEWMGQ6H1/img.png?width=753&amp;amp;height=340&amp;amp;face=0_0_753_340&quot;&gt;&lt;a href=&quot;https://velog.io/@codren/file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@codren/file&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcdSuk/hyTnVDoiQM/E0VQpnMunzMx7RehkcKbF0/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/uJF51/hyTnRgEl5P/zgHCna8SmkJBDBvEJGUo1k/img.png?width=1029&amp;amp;height=576&amp;amp;face=0_0_1029_576,https://scrap.kakaocdn.net/dn/wR4Wb/hyTnTS4xDE/bT6E6ZmTHBIoJFEWMGQ6H1/img.png?width=753&amp;amp;height=340&amp;amp;face=0_0_753_340');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;file: URI 에 대한 궁금증&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;file:URI 에 대한 개념 및 사용법, StackOverflow, Wikipedia&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1689834475108&quot; class=&quot;awk&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://container.target.flaws2.cloud/proxy/file:///proc/self/environ&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;env.PNG&quot; data-origin-width=&quot;1751&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btrUds/btson1OcTlw/En52puhkXKkJa4c7g4xbQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btrUds/btson1OcTlw/En52puhkXKkJa4c7g4xbQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btrUds/btson1OcTlw/En52puhkXKkJa4c7g4xbQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtrUds%2Fbtson1OcTlw%2FEn52puhkXKkJa4c7g4xbQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1751&quot; height=&quot;188&quot; data-filename=&quot;env.PNG&quot; data-origin-width=&quot;1751&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; LFI를 통해서 해당 container의 환경변수관련 파일에 접근이 가능했으며 환경변수에는 AWS_CONTAINER_CREDNTIALS_RELATIVE_URI라는 값이 존재했다. 대놓고 AWS container와 credential과 관련있는 URI라고 써있는게 정답이라고 티내고있다. 그래서 해당 경로로 접근해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;AWS_CONTAINER_CREDNTIALS_RELATIVE_URL 접근&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689834624449&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://container.target.flaws2.cloud/proxy/http://169.254.170.2/v2/credentials/4c79e5cb-786b-4ceb-a0e2-a94a1c9b073a&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hi.PNG&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sqdl9/btsonKeRxNV/iuk8GdoHniPC1NmbeObAhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sqdl9/btsonKeRxNV/iuk8GdoHniPC1NmbeObAhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sqdl9/btsonKeRxNV/iuk8GdoHniPC1NmbeObAhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsqdl9%2FbtsonKeRxNV%2Fiuk8GdoHniPC1NmbeObAhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1819&quot; height=&quot;152&quot; data-filename=&quot;hi.PNG&quot; data-origin-width=&quot;1819&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 우리가 찾던 반가운 credential 값이 보였다. 그렇다면 이제 credential을 사용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Credential 등록 &amp;amp; S3 bucket내의 객체 확인(Listing)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689835043347&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;aws configure --profile gg
aws --profile gg sts get-caller-identity
aws --profile gg s3 ls&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gggg.PNG&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brOskP/btsoidW308F/n1SUTRLKxMK8ZPI3tiYXI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brOskP/btsoidW308F/n1SUTRLKxMK8ZPI3tiYXI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brOskP/btsoidW308F/n1SUTRLKxMK8ZPI3tiYXI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrOskP%2FbtsoidW308F%2Fn1SUTRLKxMK8ZPI3tiYXI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1369&quot; height=&quot;299&quot; data-filename=&quot;gggg.PNG&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 우리가 원하던 마지막 화면을 볼 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1689835226814&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;flAWS2.cloud&quot; data-og-description=&quot;&quot; data-og-host=&quot;the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud&quot; data-og-source-url=&quot;http://the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud/&quot; data-og-url=&quot;http://the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;flAWS2.cloud&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;the-end-962b72bjahfm5b4wcktm8t9z4sapemjb.flaws2.cloud&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBP7OV/btson1U0Kan/km3ikG2rmsab3IiRBWB7M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBP7OV/btson1U0Kan/km3ikG2rmsab3IiRBWB7M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBP7OV/btson1U0Kan/km3ikG2rmsab3IiRBWB7M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBP7OV%2Fbtson1U0Kan%2Fkm3ikG2rmsab3IiRBWB7M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1505&quot; height=&quot;416&quot; data-origin-width=&quot;1505&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Attacker 문제는 여기까지라고 한다. 이번문제를 통해 배운 것은 AWS의 다양한 서비스들이다(ECS, instance, fragate, LFI 관련) 결과적으로는 flaws-Level5번 문제에 이어서 Task, Instance와 같이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;endpoint에서 metadata 검색이 가능한 부분에 대해서도 반드시 필요한 경우가 아니라면 제한&lt;/b&gt;&lt;/span&gt;을 하는 것이 좋다..&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;proxy같은 서비스를 제공할 때는 file scheme 등 관련해서 내부 중요 파일이나 설정파일에 대해 접근제한 하도록 검증 로직을 적용하는 것&lt;/b&gt;&lt;/span&gt;도 필수적이라는 생각이 들었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 다음 포스팅부터는 Defender를 풀어보고 포스팅해보겠다.&lt;/p&gt;</description>
      <category>Infra/CloudSecurity</category>
      <category>attacker</category>
      <category>AWS</category>
      <category>EC2</category>
      <category>flaws2</category>
      <category>Fragate</category>
      <category>Instance</category>
      <category>level3</category>
      <category>LFI</category>
      <category>metadata</category>
      <category>클라우드보안</category>
      <author>IMyoungho</author>
      <guid isPermaLink="true">https://ho-story.tistory.com/324</guid>
      <comments>https://ho-story.tistory.com/324#entry324comment</comments>
      <pubDate>Thu, 20 Jul 2023 10:15:33 +0900</pubDate>
    </item>
  </channel>
</rss>