<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Damrongsak Reetanon</title>
    <description>The latest articles on DEV Community by Damrongsak Reetanon (@rdamrong).</description>
    <link>https://dev.to/rdamrong</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F566188%2Fab9a35a5-c668-4906-bd77-b6585613faea.jpeg</url>
      <title>DEV Community: Damrongsak Reetanon</title>
      <link>https://dev.to/rdamrong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rdamrong"/>
    <language>en</language>
    <item>
      <title>เฝ้าดูความเร็วอินเตอร์เน็ตที่บ้าน</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sun, 26 Nov 2023 12:42:48 +0000</pubDate>
      <link>https://dev.to/rdamrong/efaaduukhwaamerwinetrentthiibaan-4o64</link>
      <guid>https://dev.to/rdamrong/efaaduukhwaamerwinetrentthiibaan-4o64</guid>
      <description>&lt;p&gt;บ่ายวันอาทิตย์ นั่งเตรียมเนื้อหาบรรยายอยู่ ก็เหลือบไปเห็น &lt;a href="https://www.facebook.com/ripmilla" rel="noopener noreferrer"&gt;Supadej Suthiphongkanasai&lt;/a&gt; โพสต์ว่า "ไปเจอ Git อันนึง น่าสนใจดี เป็น Docker Project ที่จะทำ Speedtest ทุกๆ 1 ชม แล้วเก็บ stat ลงกราฟไว้ ..."&lt;br&gt;
น่าสนใจดี กำลังนั่งง่วง ๆ อยู่เลย ก็เลยทิ้งงาน ลองแวะไปดู Repo ใน Github ดูหน่อยสิว่าจะยังไงดี ... นั่งดูสัก 10 นาที ก็เลยตัดสินใจ ก็ลองเล่นดูเลยก็ได้ &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ว่ากันจริง ๆ แล้วใน Github ของ Henry Withaker ที่ public ไว้ก็มีอยู่ 30 repos แต่สิ่งที่เราจะลองดูกันก็คือ repo ที่ชื่อว่า &lt;a href="https://github.com/henrywhitaker3/Speedtest-Tracker" rel="noopener noreferrer"&gt;Speed-Tracker&lt;/a&gt; ซึ่งมี source code และคำอธิบายอย่างละเอียดในการใช้งาน โดยรวม ๆ ก็บอกว่า เค้าใช้ Laravel เขียน back-end, ใช้ React เขียน front-end ส่วนของการทดสอบความเร็วก็ใช้ CLI ของค่าย speedtest.net และสุดท้ายใช้ Chart.js เป็นคนวาดกราฟออกมา &lt;br&gt;
** โดย default จะวัดความเร็วทุก 1 ชั่วโมง (แต่ว่าเราตั้งความถี่เองได้)&lt;br&gt;
** กำหนดได้ว่าจะดูข้อมูลย้อนหลังได้กี่วันตอนแสดงผล&lt;br&gt;
** สามารถ backup &amp;amp; restore ข้อมูลที่เคยเก็บไว้ได้ในรูปแบบของ JSON หรือ CSV&lt;br&gt;
** สามารถส่งข้อความไปยัง Slack, Discord และ Telegram ได้ ถ้าผลที่ speedtest วัดได้ มีค่าต่ำกว่าหรือสูงกว่า ค่าที่คำหนดไว้&lt;br&gt;
** ทำงานร่วมกับ healthcheck.io, Organizr และ InfluxDB ได้&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ลงมือกันเลย โดยที่เครื่องที่จะใช้ได้ทำงานติดตั้ง Docker และ docker-compose ไว้เรียบร้องแล้ว จากนั้นก็สร้าง directory data เอาไว้เก็บข้อมูล และให้เข้าถึง speedtest-tracker ที่ TCP/8765&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# mkdir data
# cat &amp;gt; docker-compose.yaml &amp;lt;&amp;lt;EOF
version: '3.3'
services:
     speedtest:
         container_name: speedtest
         image: henrywhitaker3/speedtest-tracker
         ports:
             - 8765:80
         volumes:
             - ./data:/config
         environment:
             - OOKLA_EULA_GDPR=true
         logging:
             driver: "json-file"
             options:
                 max-file: "100"
                 max-size: "2048k"
         restart: unless-stopped
EOF
# docker-compose up -d
Creating network "speedtest_default" with the default driver
Pulling speedtest (henrywhitaker3/speedtest-tracker:)...
latest: Pulling from henrywhitaker3/speedtest-tracker
c91af5d1b23e: Pull complete
740fcfa9e15a: Pull complete
ce5b3694a6d6: Pull complete
a83d676a55d9: Pull complete
38ac933c5d8d: Pull complete
dc32e0469fc9: Pull complete
2692dc6e8a90: Pull complete
36a44203a304: Pull complete
df68ab8ba510: Pull complete
712e86a465e0: Pull complete
b87cc77a8de9: Pull complete
Digest: sha256:47159a9402291275bd9f8a8ed4f5c1ce8502de216465ed29da8a3c995b807df1
Status: Downloaded newer image for henrywhitaker3/speedtest-tracker:latest
Creating speedtest ... done
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;รอสัก 1 นาที แล้วก็ใช้ browser เปิดไปที่ &lt;a href="http://hostname:8765" rel="noopener noreferrer"&gt;http://hostname:8765&lt;/a&gt; และถ้าต้องการทดสอบการวัดความเร็ว ก็กดปุ่ม "Test again" ได้เลย&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;สามารถปรับแต่งความถี่ในการวัดความเร็วได้ โดยเลือกเมนู Settings ที่ tab General จากเดิมที่กำหนดไว้ทุก ๆ 1 ชั่วโมง &lt;code&gt;0 * * * *&lt;/code&gt; ผมแก้ไขให้การวัดความเร็วทุก ๆ 30 นาทีเพื่อให้เห็นผลการทำงาน ในช่วงทดสอบได้ชัดเจนขึ้น โดยกำหนดที่ Schedule ให้เป็น &lt;code&gt;*/30 * * * *&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;ขอให้สนุกกับ technology ครับ&lt;/p&gt;

&lt;h4&gt;
  
  
  Mady by มูลค่าความสุข
&lt;/h4&gt;

</description>
      <category>speedtest</category>
      <category>damrongsak</category>
    </item>
    <item>
      <title>Offline Terraform Provider</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sun, 27 Nov 2022 09:25:24 +0000</pubDate>
      <link>https://dev.to/rdamrong/offline-terraform-provider-2bgf</link>
      <guid>https://dev.to/rdamrong/offline-terraform-provider-2bgf</guid>
      <description>&lt;p&gt;พอดีว่าระบบที่บ้านเป็น Open-Source Virtualization Solution ที่ชื่อว่า oVirt ซึ่งก็มีความสุขดี ใช้สร้างโน่นนี่นั่นเพื่อทดสอบอะไรไปเรื่อง ... เพียงแต่ว่า ขี้เกียจไม่อยากมานั่งสร้าง VM ที่ละตัว ช่วงแรก ๆ ใช้ Ansible ก็ต้องเขียน playbook สำหรับสร้าง พอจะเปลี่ยงแปลงระบบที่ต้องการทดสอบ ก็ต้องมานั่งแก้ playbook จะลบทิ้งตอนไม่ใช้แล้ว ก็ต้องเขียนอีก playbook อีกชุดเพื่อทำหน้าที่ลบ VM ทั้งหมด ... ซึ่งเป็นจุดอ่อนของการใช้งาน Ansible เพื่อ provisioning แต่พอได้รู้จัก Terraform บอกเลยว่า ตอนโจทย์ในช่วงการ provisioning มากเลย &lt;br&gt;
ปัญหาก็มาอยู่ว่าพอใช้ infrastructure ตัวที่ไม่ค่อยมีใครใช้ ปัญหาเรื่อง Terraform Provider ก็ตามมาทันที ปัญหาแรก ตอน Terraform จาก version 0.12 เปลี่ยนไปเป็น 0.13 แต่  oVirt plugin ก็ไม่พัฒนาตาม จึงใช้ไม่ได้ใน Terraform v 0.13 ต้องเปลี่ยน Terraform version ไป ๆ มา ๆ เวลาทำงาน อยู่บ้านต้องใช้ v0.12 พอไปที่ทำงาน ก็เปลี่ยนเป็น version อื่น เพื่อให้ใช้ plugin รุ่นใหม่ ๆ ได้ ... และแล้ว ผู้พัฒนา oVirt plugin ก็พัฒนาก็พัฒนาให้รองรับ Terraform รุ่นใหม่ ๆ ก็ดูเหมือนจะดี มีความหวัง แต่ก็ไปไม่สุด ไม่ได้เอาไปใส่ไว้ใน Terraform Registry ให้ &lt;br&gt;
.... แล้วต้องทำอย่างไรดีล่ะ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ตัวอย่างนี้ เป็นตัวอย่างที่ทำงานบนระบบปฏิบัติการ macOS และ ยังเป็น Macbook Pro รุ่นที่ยังใช้ chip Intel X86_64 อยู่ ดังนั้น การเลือกใช้งาน อาจมีความแตกต่างกันบ้างตามระบบที่ต่างกัน&lt;/li&gt;
&lt;li&gt;ลำดับแรก download ตัว Terraform Provider ที่ต้องการมาเก็บไว้ใน directory ที่วางแผนไว้ก่อน
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d8k-bpro &amp;gt; ~ curl -OL https://github.com/oVirt/terraform-provider-ovirt/releases/download/v0.99.0/terraform-provider-ovirt_0.99.0_darwin_amd64.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 11.1M  100 11.1M    0     0  1824k      0  0:00:06  0:00:06 --:--:-- 2412k
d8k-bpro &amp;gt; ~ unzip terraform-provider-ovirt_0.99.0_darwin_amd64.zip
Archive:  terraform-provider-ovirt_0.99.0_darwin_amd64.zip
  inflating: CHANGELOG.md
  inflating: LICENSE
  inflating: README.md
  inflating: terraform-provider-ovirt_0.99.0
d8k-bpro &amp;gt; ~ mkdir -p ~/.terraform.d/providers/local/ovirt/ovirt/0.99/darwin_amd64
d8k-bpro &amp;gt; ~ mv terraform-provider-ovirt_0.99.0 ~/.terraform.d/providers/local/ovirt/ovirt/0.99/darwin_amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;สร้าง ~/.terraformrc
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d8k-bpro &amp;gt; ~ vi ~/.terraformrc
provider_installation {
  filesystem_mirror {
    path    = "/Users/drs/.terraform.d/providers"
  }
  direct {
    exclude = ["local/*/*"]
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;วิธีการเรียกใช้งาน Terraform Plugins จาก Terraform Configuration File
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d8k-bpro &amp;gt; project1 vi main.tf

terraform {
  required_providers {
    ovirt = {
      source  = "local/ovirt/ovirt"
      version = "0.99.0"
    }
  }
}


provider "ovirt" {
   username = "admin@internal"
   url = "https://ovirt.example.com/ovirt-engine/api"
   password = var.ovirt_password
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Initialization Working Directory
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;d8k-bpro &amp;gt; project1 terraform init

Initializing the backend...

Initializing provider plugins...
- Finding local/ovirt/ovirt versions matching "0.99.0"...
- Finding latest version of hashicorp/null...
- Installing local/ovirt/ovirt v0.99.0...
- Installed local/ovirt/ovirt v0.99.0 (unauthenticated)
- Installing hashicorp/null v3.2.1...
- Installed hashicorp/null v3.2.1 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

╷
│ Warning: Incomplete lock file information for providers
│
│ Due to your customized provider installation methods, Terraform was forced to calculate
│ lock file checksums locally for the following providers:
│   - local/ovirt/ovirt
│
│ The current .terraform.lock.hcl file only includes checksums for darwin_amd64, so
│ Terraform running on another platform will fail to install these providers.
│
│ To calculate additional checksums for another platform, run:
│   terraform providers lock -platform=linux_amd64
│ (where linux_amd64 is the platform to generate)
╵

Terraform has been successfully initialized!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หมายเหตุ: อาจจะมีข้อความเตือนเรื่องการตรวจสอบความถูกต้องของ Provider ที่ไม่สามารถทำได้อยู่ แต่ไม่ได้มีปัญหาในการใช้งาน&lt;/p&gt;

&lt;p&gt;สุดท้าย ในปี 2022 oVirt ก็มี Terraform Providers รุ่นใหม่อยู่ใน Terraform Registry เรียบร้อยแล้ว แต่พบว่า ความสามารถของ provider ตัวใหม่ยังมีความสามารถน้อยกว่าในรุ่นเก่ามาก ผู้ใช้จึงยังเลือกใน Terraform Provider ตัวเก่าอยู่&lt;/p&gt;

&lt;h2&gt;
  
  
  มูลค่าความสุข
&lt;/h2&gt;

</description>
      <category>terraform</category>
      <category>mfec</category>
    </item>
    <item>
      <title>อยากรู้ว่าใน K8s มีการใช้ทรัพยาการในเครื่องอะไรไปเท่าไหร่บ้าง มีอะไรเหลือบ้าง</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sat, 04 Jun 2022 17:16:49 +0000</pubDate>
      <link>https://dev.to/rdamrong/yaakruuwaaain-k8s-miikaaraichthraphyaakaarainekhruuengaairaipethaaaihrbaang-miiaairehluuebaang-4lig</link>
      <guid>https://dev.to/rdamrong/yaakruuwaaain-k8s-miikaaraichthraphyaakaarainekhruuengaairaipethaaaihrbaang-miiaairehluuebaang-4lig</guid>
      <description>&lt;p&gt;หลายคนคงสงสัยเหมือนผมว่า ใน K8s cluster ของเรา &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ทรัพยากรในเครื่องถูกใช้ไปเยอะไหม&lt;/li&gt;
&lt;li&gt;มี App ตัวไหนใช้ทรัพยากรอะไรไปบ้าง&lt;/li&gt;
&lt;li&gt;ทรัพยากรในเครื่องใกล้หมดยัง มีเหลืออยู่มากน้อย&lt;/li&gt;
&lt;li&gt;อยากดูแบบละเอียด ๆ เลยถึงในระดับ container ว่ากิน memory กิน CPU เยอะไหม&lt;/li&gt;
&lt;li&gt;แต่ละ node มีการ request ทรัยากรไปเท่าไหรแล้่ว ได้มีการกำหนด limit ไว้ไหม ยังเหลืออยู่อีกเท่าไหร่&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  คำถามเหล่านี้ว่าไปแล้ว ก็สามารถหาคำตอบได้จากคำสั่ง kubectl ที่เราคุ้นเคยได้
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ถ้าอยากหาคำตอบเรื่อง request และ limit ก็หาได้จาก

&lt;code&gt;kubectl describe nodes &amp;lt;node_name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;ถ้าอยากหาคำตอบเรื่องปริมาณการใช้งานทรัพยากร สามารถใช้คำสั่ง

&lt;code&gt;kubectl top [pods,nodes]&lt;/code&gt;

แต่ว่าต้องติดตั้ง metrics server ให้เรียบร้อยก่อนใช้งาน
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkg370ikdrs3fpn0d3rcv.png" alt="Image description"&gt;
ถ้าอยากเห็นภาพรวมของการใช้ทรัพยากร ก็คือต้องค่อย ๆ ไปไล่ดูทีละ node หรือในบางกรณีก็ต้องค่อย ๆ ไล่ดูทีละ namespace&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  kube-capacity ช่วยตอบโจทย์ให้เราได้
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/robscott/kube-capacity" rel="noopener noreferrer"&gt;kube-capacity&lt;/a&gt; ถูกพัฒนาขึ้นมาเพื่อให้เราเห็นภาพรวมของ requests, limits และ  utilizations ใน Kubernetes Cluster ซึ่งก็จะมีข้อมูลที่มีประโยชน์จาก kubectl top และ kubectl describe มาแสดงผลให้เห็นภาพรวมของทรัพยากรใน cluster ได้ง่ายขึ้น&lt;/p&gt;

&lt;h4&gt;
  
  
  ก่อนเริ่มต้น
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;ติดตั้ง &lt;a href="https://github.com/kubernetes-sigs/metrics-server" rel="noopener noreferrer"&gt;metrics server&lt;/a&gt; เรียบร้อย&lt;/li&gt;
&lt;li&gt;ติดตั้ง kube-capacity (ทดสอบบน macOS v12.3.1)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; brew tap robscott/tap
&amp;gt; brew install robscott/tap/kube-capacity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ดูภาพรวมราย nodes ของ requests และ limits ของ Kubernetes Cluster
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kube-capacity
NODE             CPU REQUESTS   CPU LIMITS    MEMORY REQUESTS   MEMORY LIMITS
&lt;span class="k"&gt;*&lt;/span&gt;                6350m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;    7500m &lt;span class="o"&gt;(&lt;/span&gt;46%&lt;span class="o"&gt;)&lt;/span&gt;   2040Mi &lt;span class="o"&gt;(&lt;/span&gt;8%&lt;span class="o"&gt;)&lt;/span&gt;       340Mi &lt;span class="o"&gt;(&lt;/span&gt;1%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp0     950m &lt;span class="o"&gt;(&lt;/span&gt;47%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      440Mi &lt;span class="o"&gt;(&lt;/span&gt;24%&lt;span class="o"&gt;)&lt;/span&gt;       340Mi &lt;span class="o"&gt;(&lt;/span&gt;18%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp1     750m &lt;span class="o"&gt;(&lt;/span&gt;37%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      300Mi &lt;span class="o"&gt;(&lt;/span&gt;16%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp2     750m &lt;span class="o"&gt;(&lt;/span&gt;37%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      300Mi &lt;span class="o"&gt;(&lt;/span&gt;16%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node0   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node1   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node2   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node3   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  [เพิ่มข้อมูล utilization] ดูภาพรวมราย nodes ของ requests,limits และ  utilization ของ Kubernetes Cluster
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kube-capacity &lt;span class="nt"&gt;--util&lt;/span&gt;
NODE             CPU REQUESTS   CPU LIMITS    CPU UTIL      MEMORY REQUESTS   MEMORY LIMITS   MEMORY UTIL
&lt;span class="k"&gt;*&lt;/span&gt;                6350m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;    7500m &lt;span class="o"&gt;(&lt;/span&gt;46%&lt;span class="o"&gt;)&lt;/span&gt;   5934m &lt;span class="o"&gt;(&lt;/span&gt;37%&lt;span class="o"&gt;)&lt;/span&gt;   2040Mi &lt;span class="o"&gt;(&lt;/span&gt;8%&lt;span class="o"&gt;)&lt;/span&gt;       340Mi &lt;span class="o"&gt;(&lt;/span&gt;1%&lt;span class="o"&gt;)&lt;/span&gt;      8533Mi &lt;span class="o"&gt;(&lt;/span&gt;35%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp0     950m &lt;span class="o"&gt;(&lt;/span&gt;47%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      100m &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;     440Mi &lt;span class="o"&gt;(&lt;/span&gt;24%&lt;span class="o"&gt;)&lt;/span&gt;       340Mi &lt;span class="o"&gt;(&lt;/span&gt;18%&lt;span class="o"&gt;)&lt;/span&gt;     1098Mi &lt;span class="o"&gt;(&lt;/span&gt;61%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp1     750m &lt;span class="o"&gt;(&lt;/span&gt;37%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      63m &lt;span class="o"&gt;(&lt;/span&gt;3%&lt;span class="o"&gt;)&lt;/span&gt;      300Mi &lt;span class="o"&gt;(&lt;/span&gt;16%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        1065Mi &lt;span class="o"&gt;(&lt;/span&gt;59%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-cp2     750m &lt;span class="o"&gt;(&lt;/span&gt;37%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;      70m &lt;span class="o"&gt;(&lt;/span&gt;3%&lt;span class="o"&gt;)&lt;/span&gt;      300Mi &lt;span class="o"&gt;(&lt;/span&gt;16%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        1087Mi &lt;span class="o"&gt;(&lt;/span&gt;60%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node0   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   1286m &lt;span class="o"&gt;(&lt;/span&gt;64%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        992Mi &lt;span class="o"&gt;(&lt;/span&gt;26%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node1   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   1071m &lt;span class="o"&gt;(&lt;/span&gt;53%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        986Mi &lt;span class="o"&gt;(&lt;/span&gt;25%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node2   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   1104m &lt;span class="o"&gt;(&lt;/span&gt;55%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        1153Mi &lt;span class="o"&gt;(&lt;/span&gt;30%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node3   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   1118m &lt;span class="o"&gt;(&lt;/span&gt;55%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        1167Mi &lt;span class="o"&gt;(&lt;/span&gt;30%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   780m &lt;span class="o"&gt;(&lt;/span&gt;39%&lt;span class="o"&gt;)&lt;/span&gt;     1500m &lt;span class="o"&gt;(&lt;/span&gt;75%&lt;span class="o"&gt;)&lt;/span&gt;   1126m &lt;span class="o"&gt;(&lt;/span&gt;56%&lt;span class="o"&gt;)&lt;/span&gt;   200Mi &lt;span class="o"&gt;(&lt;/span&gt;5%&lt;span class="o"&gt;)&lt;/span&gt;        0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;        989Mi &lt;span class="o"&gt;(&lt;/span&gt;26%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ดูข้อมูลเป็นราย pods ในแต่ละ node เฉพาะ namespace: test
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kube-capacity &lt;span class="nt"&gt;--pods&lt;/span&gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt; &lt;span class="nb"&gt;test
&lt;/span&gt;NODE             POD       CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
&lt;span class="k"&gt;*&lt;/span&gt;                &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp0     &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp1     &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp2     &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node0   &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node1   &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node2   &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node3   &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node4   &lt;span class="k"&gt;*&lt;/span&gt;         0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   mynginx   0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ดูข้อมูลเป็นราย containers ในแต่ละ node เฉพาะ namespace: test
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kube-capacity &lt;span class="nt"&gt;--containers&lt;/span&gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt; &lt;span class="nb"&gt;test
&lt;/span&gt;NODE             POD       CONTAINER   CPU REQUESTS   CPU LIMITS   MEMORY REQUESTS   MEMORY LIMITS
&lt;span class="k"&gt;*&lt;/span&gt;                &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp0     &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp1     &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-cp2     &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node0   &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node1   &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node2   &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node3   &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;

cluster4-node4   &lt;span class="k"&gt;*&lt;/span&gt;         &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   mynginx   &lt;span class="k"&gt;*&lt;/span&gt;           0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   mynginx   hello       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
cluster4-node4   mynginx   mynginx     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;       0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;     0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;          0Mi &lt;span class="o"&gt;(&lt;/span&gt;0%&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  เลือกดูเฉพาะข้อมูลที่อยากดู มีหลาย option ให้กรอกดูเฉพาะที่อยากดูได้หลายอย่างให้เลือกเลย
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;-n หรือ --namespace เพื่อเลือกดูข้อมูลเฉพาะ namespace ที่ระบุเท่านั้น&lt;/li&gt;
&lt;li&gt;--namespace-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ namespace ที่มี label ตามที่ระบุไว้&lt;/li&gt;
&lt;li&gt;--node-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ node ที่มี label ตามที่ระบุไว้&lt;/li&gt;
&lt;li&gt;--pod-labels key=value เพื่อเลือกดูข้อมูลเฉพาะ pod ที่มี label ตามที่ระบุไว้&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More Info: &lt;br&gt;
&lt;a href="https://github.com/robscott/kube-capacity" rel="noopener noreferrer"&gt;https://github.com/robscott/kube-capacity&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  มูลค่าความสุข
&lt;/h2&gt;

</description>
      <category>kubernetes</category>
      <category>k8s</category>
    </item>
    <item>
      <title>Install AWX v21.0.0 in Kubernetes with AWX-operator</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Mon, 02 May 2022 10:14:58 +0000</pubDate>
      <link>https://dev.to/rdamrong/install-awx-in-kubernetes-with-awx-operator-3f3g</link>
      <guid>https://dev.to/rdamrong/install-awx-in-kubernetes-with-awx-operator-3f3g</guid>
      <description>&lt;p&gt;ผมมักจะ update ความเป็นมาเป็นไปของ AWX อย่างน้อย ๆ ก็สักปีละครับ หยิบมาดูว่ามีอะไรใหม่ ๆ ไหม แต่ส่วนใหญ่ผมเรียนรู้การใช้งาน AWX อยู่ในรูปแบบ container แบบเครื่องเดียวมาตลอด ปีนี้ลองเปลี่ยนใหม่ หยิบมาลงบน K8s ซะหน่อย &lt;br&gt;
ตอนแรกก็คิดว่าจะใช้เวลาหลายวัน คงลองผิดลองถูกติดตั้งเสร็จ ปรากฎว่า ไม่ยากอย่างที่คิดนะ แปร๊บบบบบบเดียวก็ได้ใช้แล้ว เสียเวลาตรงที่ node เรามี memory ไม่พอ ติดตั้งรอบแรกเสร็จก็เลยยังใช้ไม่ได้ มาดูครับ ไม่ยากเลย&lt;/p&gt;
&lt;h1&gt;
  
  
  ข้อมูลเบื้องต้น
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes 1.23.6&lt;/li&gt;
&lt;li&gt;node แต่ละ node มีหน่วยความจำ 8 GB (ครั้งแรกทดลองที่ 2 GB ไม่สามารถทำงานได้)&lt;/li&gt;
&lt;li&gt;awx-operator 0.20.2&lt;/li&gt;
&lt;li&gt;ใช้ Longhorn เป็น Storageฃ&lt;/li&gt;
&lt;li&gt;เครื่องที่ใช้ในการติดตั้งต้องมีข้อมูล kubeconfig เรียบร้อยแล้ว&lt;/li&gt;
&lt;li&gt;เครืื่องที่ใช้ในการติดตั้งมี kubectl ให้พร้อมใช้งาน&lt;/li&gt;
&lt;li&gt;&lt;p&gt;เครื่องที่ใช้ในการติดตั้งมีระบบปฏิบัติการเป็น macOS version 12.3.1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ติดตั้ง kustomize ที่เครื่อง&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ brew &lt;span class="nb"&gt;install &lt;/span&gt;kustomize
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Downloading https://ghcr.io/v2/homebrew/core/kustomize/manifests/4.5.4
Already downloaded: /Users/drs/Library/Caches/Homebrew/downloads/4b93fd6dc9174be6d2593f4c63e94d5debc6efcc98907e2397538940cd1f31f7--kustomize-4.5.4.bottle_manifest.json
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Downloading https://ghcr.io/v2/homebrew/core/kustomize/blobs/sha256:1535062dcc42e6776f9506e12e572e19a5c18017543ece5be92e7c770b53490a
Already downloaded: /Users/drs/Library/Caches/Homebrew/downloads/ee6acdadbe5f876b826fd4191717fd9f71c9d35a6ef8a6c360d9f70927625868--kustomize--4.5.4.monterey.bottle.tar.gz
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Pouring kustomize--4.5.4.monterey.bottle.tar.gz
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Summary
🍺  /usr/local/Cellar/kustomize/4.5.4: 8 files, 13.3MB
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Running &lt;span class="sb"&gt;`&lt;/span&gt;brew cleanup kustomize&lt;span class="sb"&gt;`&lt;/span&gt;...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS &lt;span class="o"&gt;(&lt;/span&gt;see &lt;span class="sb"&gt;`&lt;/span&gt;man brew&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;สร้าง kustomization.yaml
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;cat &amp;gt;&amp;gt; kustomization.yaml &amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kustomize.config.k8s.io/v1beta1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kustomization&lt;/span&gt;
&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github.com/ansible/awx-operator/config/default?ref=0.20.2&lt;/span&gt;
&lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;quay.io/ansible/awx-operator&lt;/span&gt;
    &lt;span class="na"&gt;newTag&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.20.2&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;awx&lt;/span&gt;

&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;เรียกใช้งาน kustomize เพื่อติดตัั้งส่วนประกอบต่าง ๆ ของ awx-operator
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ kustomize build &lt;span class="nb"&gt;.&lt;/span&gt; | kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; -
namespace/awx created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;ตรวจสอบสถานะของ awx-operator-controller-manager
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ kubectl get pods -n awx
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-64976659fc-2c9px   2/2     Running   0          61s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;สร้าง Kubernetes Object ชนิด AWX (ซึ่ง ​CRD นี้ถูกติดตั้งในขั้นตอนที่ 3)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt;&amp;gt; awx-demo.yaml &amp;lt;&amp;lt; EOF
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx-demo
spec:
  service_type: nodeport
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  หากต้องการดูคุณสมบัติเพิ่มเติน สามารถดูได้ที่
&lt;/h3&gt;

&lt;p&gt;&lt;br&gt;
 &lt;code&gt;kubectl explain awx --recursive=true&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;แก้ไข kustomization.yaml โดยเพิ่มบรรทัด - awx-demo.yaml ในส่วนของ resources
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;gt;&amp;gt; kustomization.yaml &amp;lt;&amp;lt;EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - github.com/ansible/awx-operator/config/default?ref=0.20.2
  - awx-demo.yaml
images:
  - name: quay.io/ansible/awx-operator
    newTag: 0.20.2
namespace: awx

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;เรียกใช้งาน kustomize เพื่อติดตัั้งส่วนประกอบต่าง ๆ ของ awx-operator อีกครั้ง
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/usr/local/bin/kustomize build . | kubectl apply -f -
namespace/awx unchanged
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com unchanged
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com unchanged
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com unchanged
serviceaccount/awx-operator-controller-manager unchanged
role.rbac.authorization.k8s.io/awx-operator-awx-manager-role configured
role.rbac.authorization.k8s.io/awx-operator-leader-election-role unchanged
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader unchanged
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role unchanged
rolebinding.rbac.authorization.k8s.io/awx-operator-awx-manager-rolebinding unchanged
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding unchanged
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding unchanged
configmap/awx-operator-awx-manager-config unchanged
service/awx-operator-controller-manager-metrics-service unchanged
deployment.apps/awx-operator-controller-manager unchanged
awx.awx.ansible.com/awx-demo created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;รอการติดตั้ง AWX และสามารถตรวจสอบสถานะการติดตั้งได้จาก
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator" -n awx -w
NAME                  READY   STATUS    RESTARTS   AGE
awx-demo-postgres-0   1/1     Running   0          56s
awx-demo-7db56584fb-z5kxc   0/4     Pending   0          0s
awx-demo-7db56584fb-z5kxc   0/4     Pending   0          0s
awx-demo-7db56584fb-z5kxc   0/4     ContainerCreating   0          0s
awx-demo-7db56584fb-z5kxc   4/4     Running             0          5s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ตรวจสอบรหัสผ่านสำหรับ user admin
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ kubectl get secret awx-demo-admin-password -o jsonpath="{.data.password}"  -n awx | base64 --decode
e5SlKNCgfoES69IexQTDH97DmKr8YHVM%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;browse ไปที่

&lt;code&gt;http://&amp;lt;IP of nodeport&amp;gt;:&amp;lt;nodeport&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;ก้าวแรกกับ AWX
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pt5njmfh42z6yzzn37w.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  มูลค่าความสุข
&lt;/h5&gt;

</description>
      <category>awx</category>
      <category>ansible</category>
      <category>automation</category>
      <category>damrongsak</category>
    </item>
    <item>
      <title>Create Schedules in AWX </title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Fri, 12 Nov 2021 06:14:45 +0000</pubDate>
      <link>https://dev.to/rdamrong/create-schedules-in-awx-19ki</link>
      <guid>https://dev.to/rdamrong/create-schedules-in-awx-19ki</guid>
      <description>&lt;p&gt;ในกรณีที่อยากสร้าง Job จาก Template ที่เราสร้างไว้แล้ว ให้ทำงานตามช่วงเวลาที่เราต้องการ ไม่ว่าจะเป็นกำหนดให้ทำงานครั้งเดียวตามเวลาที่กำหนด หรือ ทำงานเป็นช่วงเวลา เช่น ทุกนาที ทุกชั่วโมง หรือทุกสัปดาห์ สามารถทำได้โดย&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เลือก template ที่เราต้องการสร้าง Schedules 
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TOd5y4e9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b4ib0b4l1i214bvu1xxr.png" alt="Items1" width="880" height="328"&gt;
&lt;/li&gt;
&lt;li&gt;เลือก tab &amp;gt; Schedules
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--x0A73qV9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/md3nz3qcy56pv2y9lyhs.png" alt="Items2" width="880" height="436"&gt;
&lt;/li&gt;
&lt;li&gt;กดปุ่ม ADD
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nDKgy5Cv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfxvs2mw5dcls4l1oab0.png" alt="Items3" width="880" height="326"&gt;
&lt;/li&gt;
&lt;li&gt;ตั้งชื่อ , กำหนดเวลา แล้ว ช่วงเวลาที่ต้องการ และกดปุ่ม Save
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_1a9LvC4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lctvalebcrqdnjungb7r.png" alt="Items4" width="880" height="349"&gt;
&lt;/li&gt;
&lt;li&gt;ตรวจสอบความถูกต้อง และเวลาที่ template จะทำงานในครั้งถัดไปได้ที่ Views &amp;gt; Schedules
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nWMt3Sd4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72snankvxg2xzmxun6y5.png" alt="Items5" width="880" height="513"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  มูลค่าความสุข
&lt;/h4&gt;

</description>
      <category>ansible</category>
      <category>awx</category>
    </item>
    <item>
      <title>Install Gitlab Community Edition 14.3.0-ce.0 on Docker</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sat, 25 Sep 2021 11:37:52 +0000</pubDate>
      <link>https://dev.to/rdamrong/install-gitlab-community-edition-14-3-0-ce-0-docker-jeb</link>
      <guid>https://dev.to/rdamrong/install-gitlab-community-edition-14-3-0-ce-0-docker-jeb</guid>
      <description>&lt;p&gt;"ติดตั้ง Gitlab ใช้เองในบ้าน" เป้าหมายสำหรับเสาร์อาทิตย์สัปดาห์นี้ ... ยอมรับเลยว่าความรู้เรื่อง git ผมน้อยมาก เรียกได้ว่า งู ๆ ปลา ๆ เลยก็ได้ จะใช้ก็อะไร ก็ google เอา แล้วก็ใช้เท่าที่ตัวเองรู้ ... ก็รู้อยู่แหละว่า git ทำอะไรได้หลากหลายมาก เกินกว่าความรู้ที่เรามีอยู่ ก็เลยอยากเพิ่มเติมความรู้เรื่องนี้ซะหน่อย ... gitlab นี่แหละแนวเรา มี Community Edition ให้เลือกใช้ได้ และถ้าถูกใจก็ไปต่อกับ Enterprise Edition&lt;/p&gt;

&lt;p&gt;อ้อ ... ถ้าแวะเวียนผ่านมาอ่าน แล้วอยากแบ่งปันความรู้เรื่อง git ให้ผม ขอสมัครเรียนด้วยนะครับ อยากรู้มากกกกก&lt;/p&gt;

&lt;p&gt;0.ขั้นตอนการเตรียมความพร้อมก่อนการติดตั้ง โดยรวม ๆ ก็เริ่มจากมี VM ผมเลือกใช้ Ubuntu 20.04.3 LTS ขนาด 4 vCPU 8 GB RAM พร้อมติดตั้ง docker และ docker-compose ไว้เรียบร้อยแล้ว และ domain ที่ใช้ในการทดสอบคือ git.d8k.lo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
Linux git 5.4.0-84-generic &lt;span class="c"&gt;#94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;docker version
Client:
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.8
 Git commit:        20.10.7-0ubuntu1~20.04.1
 Built:             Wed Aug  4 22:52:25 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      &lt;span class="nb"&gt;true

&lt;/span&gt;Server:
 Engine:
  Version:          20.10.7
  API version:      1.41 &lt;span class="o"&gt;(&lt;/span&gt;minimum version 1.12&lt;span class="o"&gt;)&lt;/span&gt;
  Go version:       go1.13.8
  Git commit:       20.10.7-0ubuntu1~20.04.1
  Built:            Wed Aug  4 19:07:47 2021
  OS/Arch:          linux/amd64
  Experimental:     &lt;span class="nb"&gt;false
 &lt;/span&gt;containerd:
  Version:          1.5.2-0ubuntu1~20.04.2
  GitCommit:
 runc:
  Version:          1.0.0~rc95-0ubuntu1~20.04.2
  GitCommit:
 docker-init:
  Version:          0.19.0
  GitCommit:
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose version
docker-compose version 1.25.0, build unknown
docker-py version: 4.1.0
CPython version: 3.8.10
OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1.สร้าง directory เพื่อเป็นที่เก็บ configuration และ persistent data  รวมถึง key pair สำหรับ TLS ด้วย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drs@git:~&lt;span class="nv"&gt;$ WORKING_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/config/ssl
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/logs
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/data
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/config/ssl/gen-tls &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
#!/bin/bash

rm -f *.key *.crt *.csr


openssl ecparam -out ca.key -name prime256v1 -genkey
openssl req -new -x509  -key ca.key -out ca.crt  -subj "/CN=My CA EC"
rm -f server*

openssl ecparam -out server1.key -name prime256v1 -genkey
openssl req -new -key server1.key -out server1.csr -sha256 -subj "/CN=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"
echo subjectAltName = DNS:&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;,IP:&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ip a show dev enp1s0 |grep &lt;span class="s2"&gt;"inet "&lt;/span&gt;|awk &lt;span class="s1"&gt;'{print $2}'&lt;/span&gt;|cut &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; 1&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;,IP:127.0.0.1 &amp;gt;&amp;gt; server1.cnf
echo extendedKeyUsage = serverAuth &amp;gt;&amp;gt; server1.cnf
openssl x509 -req -in server1.csr -CAkey ca.key -CA ca.crt -out server1.crt -CAcreateserial -extfile server1.cnf

openssl dhparam -out dhparam 2048
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;755 &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/config/ssl/gen-tls
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/config/ssl
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/gitlab-data/config/ssl/gen-tls
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.สร้าง docker-compose.yml และ เรียก dock-compose up -d&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/docker-compose.yml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'git.d8k.lo'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://git.d8k.lo'
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
      nginx['redirect_http_to_https'] = true
      nginx['ssl_certificate'] = "/etc/gitlab/ssl/server1.crt"
      nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/server1.key"
      nginx['ssl_dhparam'] = "/etc/gitlab/ssl/dhparam"

  ports:
    - '80:80'
    - '443:443'
    - '2224:22'

  volumes:
    - '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/gitlab-data/config:/etc/gitlab'
    - '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/gitlab-data/logs:/var/log/gitlab'
    - '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/gitlab-data/data:/var/opt/gitlab'
    - '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKING_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;/gitlab-data/config/ssl:/etc/gitlab/ssl'
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.ตรวจสอบความคีบหน้าของการทำงานของ gitlab-ce ซึ่งใช้เวลาประมาณ 5 นาที ถึงจะพร้อมให้บริการ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ตรวจสอบชื่อ container จากคำสั่ง docker container &lt;span class="nb"&gt;ls &lt;/span&gt;ในกรณีของผมจะชื่อว่า drs_web_1
drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; drs_web_1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.ตรวจสอบรหัสผ่านสำหรับ root เพื่อใช้ในการ login ได้จาก&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;drs@git:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cat&lt;/span&gt; ~/gitlab-data/config/initial_root_password
&lt;span class="c"&gt;# WARNING: This value is valid only in the following conditions&lt;/span&gt;
&lt;span class="c"&gt;#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).&lt;/span&gt;
&lt;span class="c"&gt;#          2. Password hasn't been changed manually, either via UI or via command line.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.&lt;/span&gt;

Password: ueK3olh3hY0yA2nHU2OXSBU+Wvh2F620rOaxVrr1Ldc&lt;span class="o"&gt;=&lt;/span&gt;

&lt;span class="c"&gt;# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;ทดสอบการใช้งานได้ที่ &lt;a href="https://git.d8k.lo" rel="noopener noreferrer"&gt;https://git.d8k.lo&lt;/a&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frucofulqx835m5cgcdej.png" alt="Alt Text"&gt;
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8ekkgpc0tj87pqprgkj.png" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  มูลค่าความสุข
&lt;/h1&gt;

</description>
      <category>gitlab</category>
      <category>docker</category>
      <category>git</category>
    </item>
    <item>
      <title>Test Ansible AWX 19.3.0 on Docker</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Thu, 23 Sep 2021 16:58:03 +0000</pubDate>
      <link>https://dev.to/rdamrong/test-ansible-awx-19-3-0-on-docker-1bnn</link>
      <guid>https://dev.to/rdamrong/test-ansible-awx-19-3-0-on-docker-1bnn</guid>
      <description>&lt;p&gt;Ansible AWX ใน version 18.0 เป็นต้นไปไม่สามารถติดตั้งในรูปแบบเดิม ๆ ที่เคยทำได้อีกแล้ว และมุ่งไปที่ติดตั้งใน Kubernetes ด้วย operator ซึ่งก็เป็นทิศทางที่เห็นด้วยว่า น่าจะไปในทิศทางนั้น แล้วถ้าต้องการทดสอบล่ะ ทำไงได้บ้าง มาลองดูกันครับ&lt;/p&gt;

&lt;p&gt;0.Requirements&lt;br&gt;
เครึ่องที่ใช้ทดสอบ เป็นเครื่องที่มี Memory 8 GB , 4 vCPU พร้อมติดตั้ง docker ไว้ที่เครื่องเรียบร้อยแล้ว โดยที่เลือกใช้ Ubuntu 20.04.3 LTS เป็น OS ในการทดสอบ&lt;/p&gt;

&lt;p&gt;1.ติดตั้ง software ที่จำเป็น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install -y docker-compose python3-pip ansible

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

&lt;/div&gt;



&lt;p&gt;2.d/l awx version ที่ต้องการ ณ​. วันที่เขียนนี้ version 19.3.0 เป็น latest version และ สั่งสร้าง AWX Container Image&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone -b 19.3.0 https://github.com/ansible/awx.git
$ cd awx
$ make docker-compose-build

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

&lt;/div&gt;



&lt;p&gt;3.Running AWX&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ make docker-auth awx/projects docker-compose-sources
$ docker-compose -f tools/docker-compose/_sources/docker-compose.yml run --rm awx_1 make clean-ui ui-devel
$ docker-compose -f tools/docker-compose/_sources/docker-compose.yml up -d

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

&lt;/div&gt;



&lt;p&gt;4.ติดตามสถานะการติดตั้ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker logs -f tools_awx_1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.เปลี่ยน admin password&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker exec -ti tools_awx_1 awx-manage changepassword admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6.สามารถเข้าถึง Ansible AWX ได้ที่ http://&amp;lt;host&amp;gt;:8013 หรือ https://&amp;lt;host&amp;gt;:8043&lt;/p&gt;

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

&lt;h1&gt;
  
  
  มูลค่าความสุข
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>How to compile Geoip2 Dynamic Module for NGINX Open Source that installed in Ubuntu 20.04 LTS</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Wed, 28 Jul 2021 04:36:07 +0000</pubDate>
      <link>https://dev.to/rdamrong/how-to-compile-geoip2-dynamic-module-for-nginx-open-source-that-installed-in-ubuntu-20-04-lts-5geb</link>
      <guid>https://dev.to/rdamrong/how-to-compile-geoip2-dynamic-module-for-nginx-open-source-that-installed-in-ubuntu-20-04-lts-5geb</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4896k9lyyr5jbgdxvb4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4896k9lyyr5jbgdxvb4k.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Update, Upgrade and verify Ubuntu version
&lt;/h3&gt;


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

&lt;p&gt;$ sudo apt update&lt;br&gt;
$ sudo apt upgrade -y&lt;br&gt;
$ cat /etc/os-release&lt;br&gt;
NAME="Ubuntu"&lt;br&gt;
VERSION="20.04.2 LTS (Focal Fossa)"&lt;br&gt;
ID=ubuntu&lt;br&gt;
ID_LIKE=debian&lt;br&gt;
PRETTY_NAME="Ubuntu 20.04.2 LTS"&lt;br&gt;
VERSION_ID="20.04"&lt;br&gt;
HOME_URL="&lt;a href="https://www.ubuntu.com/" rel="noopener noreferrer"&gt;https://www.ubuntu.com/&lt;/a&gt;"&lt;br&gt;
SUPPORT_URL="&lt;a href="https://help.ubuntu.com/" rel="noopener noreferrer"&gt;https://help.ubuntu.com/&lt;/a&gt;"&lt;br&gt;
BUG_REPORT_URL="&lt;a href="https://bugs.launchpad.net/ubuntu/" rel="noopener noreferrer"&gt;https://bugs.launchpad.net/ubuntu/&lt;/a&gt;"&lt;br&gt;
PRIVACY_POLICY_URL="&lt;a href="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" rel="noopener noreferrer"&gt;https://www.ubuntu.com/legal/terms-and-policies/privacy-policy&lt;/a&gt;"&lt;br&gt;
VERSION_CODENAME=focal&lt;br&gt;
UBUNTU_CODENAME=focal&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Install NGINX and check NGINX version by nginx -v&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ sudo apt install -y nginx&lt;br&gt;
$ nginx -v&lt;br&gt;
nginx version: nginx/1.18.0 (Ubuntu)&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Install Development tool and required library&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ sudo apt install -y libmaxminddb0 libmaxminddb-dev mmdb-bin build-essential libpcre3-dev zlib1g-dev libssl-dev libxml2-dev libxslt-dev libgd-dev&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Download the same NGINX source code that installed.&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ wget &lt;a href="https://nginx.org/download/nginx-1.18.0.tar.gz" rel="noopener noreferrer"&gt;https://nginx.org/download/nginx-1.18.0.tar.gz&lt;/a&gt;&lt;br&gt;
$ tar xvfz nginx-1.18.0.tar.gz&lt;br&gt;
$ cd nginx-1.18.0&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Download latest version ngx_http_geoip2_module source code from &lt;a href="https://github.com/leev/ngx_http_geoip2_module" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://github.com/leev/ngx_http_geoip2_module" rel="noopener noreferrer"&gt;https://github.com/leev/ngx_http_geoip2_module&lt;/a&gt;&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ wget &lt;a href="https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.3.tar.gz" rel="noopener noreferrer"&gt;https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.3.tar.gz&lt;/a&gt;&lt;br&gt;
$ tar xvfz 3.3.tar.gz&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Find the original complie options by nginx -V and&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ nginx -V&lt;br&gt;
nginx version: nginx/1.18.0 (Ubuntu)&lt;br&gt;
built with OpenSSL 1.1.1f  31 Mar 2020&lt;br&gt;
TLS SNI support enabled&lt;br&gt;
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-KTLRnK/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Compile NGINX with the same option as it build with added Geoip2 module option  --add-dynamic-module=./ngx_http_geoip2_module-3.3&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ ./configure --add-dynamic-module=./ngx_http_geoip2_module-3.3 --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-KTLRnK/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module&lt;br&gt;
$ make modules&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Copy ngx_http_geoip2_module.so and ngx_stream_geoip2_module.so to Shared NGINX module library&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ sudo cp -vi objs/ngx_http_geoip2_module.so /usr/share/nginx/modules/&lt;br&gt;
$ sudo cp -vi objs/ngx_stream_geoip2_module.so /usr/share/nginx/modules/&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Added load_module into /etc/nginx/nginx.conf and restart NGINX&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ sudo vi /etc/nginx/nginx.conf&lt;/p&gt;

&lt;p&gt;user www-data;&lt;br&gt;
worker_processes auto;&lt;br&gt;
pid /run/nginx.pid;&lt;br&gt;
include /etc/nginx/modules-enabled/*.conf;&lt;/p&gt;
&lt;h1&gt;
  
  
  --- Add this 2 lines ----
&lt;/h1&gt;

&lt;p&gt;load_module modules/ngx_http_geoip2_module.so;&lt;br&gt;
load_module modules/ngx_stream_geoip2_module.so;&lt;br&gt;
[...]&lt;/p&gt;

&lt;p&gt;$ sudo systemctl restart nginx&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Verify NGINX configuration and NGINX status&lt;br&gt;
&lt;/h3&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ sudo nginx -T | grep geoip2&lt;br&gt;
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok&lt;br&gt;
nginx: configuration file /etc/nginx/nginx.conf test is successful&lt;br&gt;
load_module modules/ngx_http_geoip2_module.so;&lt;br&gt;
load_module modules/ngx_stream_geoip2_module.so;&lt;/p&gt;

&lt;p&gt;$ sudo systemctl status nginx&lt;br&gt;
● nginx.service - A high performance web server and a reverse proxy server&lt;br&gt;
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)&lt;br&gt;
     Active: active (running) since Wed 2021-07-28 11:10:53 +07; 1min 38s ago&lt;br&gt;
       Docs: man:nginx(8)&lt;br&gt;
    Process: 3109605 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br&gt;
    Process: 3109611 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br&gt;
   Main PID: 3109613 (nginx)&lt;br&gt;
      Tasks: 3 (limit: 9510)&lt;br&gt;
     Memory: 3.6M&lt;br&gt;
     CGroup: /system.slice/nginx.service&lt;br&gt;
             ├─3109613 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br&gt;
             ├─3109614 nginx: worker process&lt;br&gt;
             └─3109615 nginx: worker process&lt;/p&gt;

&lt;p&gt;Jul 28 11:10:53 server200 systemd[1]: Starting A high performance web server and a reverse proxy server...&lt;br&gt;
Jul 28 11:10:53 server200 systemd[1]: Started A high performance web server and a reverse proxy server.&lt;/p&gt;

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

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  มูลค่าความสุข&lt;br&gt;
&lt;/h1&gt;

</description>
    </item>
    <item>
      <title>ติดตั้ง NGINX แบบขี้เกียจ</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sat, 10 Jul 2021 17:31:54 +0000</pubDate>
      <link>https://dev.to/rdamrong/nginx-3ebj</link>
      <guid>https://dev.to/rdamrong/nginx-3ebj</guid>
      <description>&lt;p&gt;หลังจากที่ไม่ได้จับ NGINX มาสักพัก มัวแต่ไปนั่งเล่นอย่างอื่นอยู่ แต่พอดีว่าช่วงนี้งานเข้า NGINX รัว ๆ ก็เลยต้อง setup ระบบไว้เตรียมบรรยาย ... แต่มาคราวนี้รู้สึกขี้เกียจ ไม่อยากทำอะไรยุ่งยาก เก็บพลังงานไว้ดีกว่า ... ด้วยความที่เพิ่งไปสอน Ansible มา เห็นว่า NGINX ทำ collection ใหม่ไว้หลายอย่างเลย ลองแวะไปดูให้ละเอียด ... มี Ansible playbook สำหรับติดตั้ง NGINX นินา ก็เลยบันทึกประสบการณ์แบบขี้เกียจ ๆ มาให้ลองอ่านดูครับ&lt;/p&gt;

&lt;h3&gt;
  
  
  สิ่งที่ต้องเตรียม
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;server Ubuntu Server 20.04.2 LTS&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ติดตั้ง ansible และส่วนอื่น ๆ ที่จำเป็น
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ansible
&lt;span class="nv"&gt;$ &lt;/span&gt;ansible-galaxy collection &lt;span class="nb"&gt;install &lt;/span&gt;nginxinc.nginx_core
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/nginxinc/ansible-collection-nginx.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  แก้ไข deploy-nginx.yml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;ansible-collection-nginx/playbooks/
&lt;span class="nv"&gt;$ &lt;/span&gt;vi deploy-nginx.yml
&lt;span class="nt"&gt;---&lt;/span&gt;
- hosts: all
  become: &lt;span class="nb"&gt;yes
  &lt;/span&gt;become_user: root
  become_method: &lt;span class="nb"&gt;sudo
  &lt;/span&gt;connection: &lt;span class="nb"&gt;local
  &lt;/span&gt;collections:
    - nginxinc.nginx_core
  roles:
    - role: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  เรียกใช้งาน ansible playbook เพื่อติดตั้ง NGINX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"localhost, "&lt;/span&gt; deploy-nginx.yml

PLAY &lt;span class="o"&gt;[&lt;/span&gt;all] &lt;span class="k"&gt;*************************************************************************************************************************************************&lt;/span&gt;

TASK &lt;span class="o"&gt;[&lt;/span&gt;Gathering Facts] &lt;span class="k"&gt;*************************************************************************************************************************************&lt;/span&gt;
ok: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Check whether you are using a supported NGINX distribution] &lt;span class="k"&gt;**********************************************************************************&lt;/span&gt;
ok: &lt;span class="o"&gt;[&lt;/span&gt;localhost] &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"changed"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"msg"&lt;/span&gt;: &lt;span class="s2"&gt;"Your OS, Ubuntu is supported by NGINX Open Source"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;...]
TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Debug NGINX output] &lt;span class="k"&gt;**************************************************************************************************************************&lt;/span&gt;
skipping: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Configure logrotate &lt;span class="k"&gt;for &lt;/span&gt;NGINX] &lt;span class="k"&gt;***************************************************************************************************************&lt;/span&gt;
skipping: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Install NGINX Amplify] &lt;span class="k"&gt;***********************************************************************************************************************&lt;/span&gt;
skipping: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

PLAY RECAP &lt;span class="k"&gt;*************************************************************************************************************************************************&lt;/span&gt;
localhost                  : &lt;span class="nv"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;14   &lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5    &lt;span class="nv"&gt;unreachable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;failed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;skipped&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;22   &lt;span class="nv"&gt;rescued&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;ignored&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ทดสอบการทำงานของ NGINX
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost
&amp;lt;&lt;span class="o"&gt;!&lt;/span&gt;DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;&lt;span class="nb"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&amp;lt;title&amp;gt;Welcome to nginx!&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
    body &lt;span class="o"&gt;{&lt;/span&gt;
        width: 35em&lt;span class="p"&gt;;&lt;/span&gt;
        margin: 0 auto&lt;span class="p"&gt;;&lt;/span&gt;
        font-family: Tahoma, Verdana, Arial, sans-serif&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Welcome to nginx!&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;For online documentation and support please refer to
&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://nginx.org/"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;nginx.org&amp;lt;/a&amp;gt;.&amp;lt;br/&amp;gt;
Commercial support is available at
&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://nginx.com/"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;nginx.com&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Thank you &lt;span class="k"&gt;for &lt;/span&gt;using nginx.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  มูลค่าความสุข
&lt;/h5&gt;

</description>
      <category>nginx</category>
      <category>ubuntu</category>
    </item>
    <item>
      <title>ติดตั้ง NGINX Plus แบบขี้เกียจ</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Sat, 10 Jul 2021 09:17:50 +0000</pubDate>
      <link>https://dev.to/rdamrong/nginx-plus-2pdo</link>
      <guid>https://dev.to/rdamrong/nginx-plus-2pdo</guid>
      <description>&lt;p&gt;หลังจากที่ไม่ได้จับ NGINX มาสักพัก มัวแต่ไปนั่งเล่นอย่างอื่นอยู่ แต่พอดีว่าช่วงนี้งานเข้า NGINX รัว ๆ ก็เลยต้อง setup ระบบไว้เตรียมบรรยาย ... แต่มาคราวนี้รู้สึกขี้เกียจ ไม่อยากทำอะไรยุ่งยาก เก็บพลังงานไว้ดีกว่า ... ด้วยความที่เพิ่งไปสอน Ansible มา เห็นว่า NGINX ทำ collection ใหม่ไว้หลายอย่างเลย ลองแวะไปดูให้ละเอียด ... มี Ansible playbook สำหรับติดตั้ง NGINX Plus นินา ก็เลยบันทึกประสบการณ์แบบขี้เกียจ ๆ มาให้ลองอ่านดูครับ&lt;/p&gt;

&lt;h3&gt;
  
  
  สิ่งที่ต้องเตรียม
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;server Ubuntu Server 20.04.2 LTS &lt;/li&gt;
&lt;li&gt;Key และ ​Certificate ที่เป็น Subscription ของ NGINX Plus เก็บที่ $HOME/nginx-repo.key และ $HOME/nginx-repo.crt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ติดตั้ง ansible และส่วนอื่น ๆ ที่จำเป็น
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-y&lt;/span&gt; update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ansible
&lt;span class="nv"&gt;$ &lt;/span&gt;ansible-galaxy collection &lt;span class="nb"&gt;install &lt;/span&gt;nginxinc.nginx_core
&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/nginxinc/ansible-collection-nginx.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  แก้ไข deploy-nginx-plus.yml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;ansible-collection-nginx/playbooks/
&lt;span class="nv"&gt;$ &lt;/span&gt;vi deploy-nginx-plus.yml
&lt;span class="nt"&gt;---&lt;/span&gt;
- hosts: all
  become: &lt;span class="nb"&gt;yes
  &lt;/span&gt;become_user: root
  become_method: &lt;span class="nb"&gt;sudo
  &lt;/span&gt;connection: &lt;span class="nb"&gt;local
  &lt;/span&gt;collections:
    - nginxinc.nginx_core
  roles:
    - role: nginx
      vars:
        nginx_type: plus
        nginx_license:
          certificate: /home/drs/nginx-repo.crt
          key: /home/drs/nginx-repo.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  เรียกใช้งาน ansible playbook เพื่อติดตั้ง NGINX Plus
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"localhost, "&lt;/span&gt; deploy-nginx-plus.yml

PLAY &lt;span class="o"&gt;[&lt;/span&gt;all] &lt;span class="k"&gt;*****************************************************************************************************&lt;/span&gt;

TASK &lt;span class="o"&gt;[&lt;/span&gt;Gathering Facts] &lt;span class="k"&gt;*****************************************************************************************&lt;/span&gt;
ok: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Check whether you are using a supported NGINX distribution] &lt;span class="k"&gt;**************************************&lt;/span&gt;
ok: &lt;span class="o"&gt;[&lt;/span&gt;localhost] &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"changed"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
    &lt;span class="s2"&gt;"msg"&lt;/span&gt;: &lt;span class="s2"&gt;"Your OS, Ubuntu is supported by NGINX Plus"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;...]
TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Configure logrotate &lt;span class="k"&gt;for &lt;/span&gt;NGINX] &lt;span class="k"&gt;*******************************************************************&lt;/span&gt;
skipping: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

TASK &lt;span class="o"&gt;[&lt;/span&gt;nginx : Install NGINX Amplify] &lt;span class="k"&gt;***************************************************************************&lt;/span&gt;
skipping: &lt;span class="o"&gt;[&lt;/span&gt;localhost]

PLAY RECAP &lt;span class="k"&gt;*****************************************************************************************************&lt;/span&gt;
localhost                  : &lt;span class="nv"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;23   &lt;span class="nv"&gt;changed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;11   &lt;span class="nv"&gt;unreachable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;failed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;skipped&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;22   &lt;span class="nv"&gt;rescued&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0    &lt;span class="nv"&gt;ignored&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ทดสอบการทำงานของ NGINX Plus
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl http://localhost
&amp;lt;&lt;span class="o"&gt;!&lt;/span&gt;DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;&lt;span class="nb"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&amp;lt;title&amp;gt;Welcome to nginx!&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
    body &lt;span class="o"&gt;{&lt;/span&gt;
        width: 35em&lt;span class="p"&gt;;&lt;/span&gt;
        margin: 0 auto&lt;span class="p"&gt;;&lt;/span&gt;
        font-family: Tahoma, Verdana, Arial, sans-serif&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Welcome to nginx!&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;For online documentation and support please refer to
&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://nginx.org/"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;nginx.org&amp;lt;/a&amp;gt;.&amp;lt;br/&amp;gt;
Commercial support is available at
&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://nginx.com/"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;nginx.com&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;em&amp;gt;Thank you &lt;span class="k"&gt;for &lt;/span&gt;using nginx.&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  มูลค่าความสุข
&lt;/h5&gt;

</description>
      <category>ubuntu</category>
      <category>nginx</category>
      <category>nginxplus</category>
    </item>
    <item>
      <title>docker scan ตอน 2 ... ยังมีข้อสงสัยอีกนิดหน่อย !!!</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Wed, 02 Jun 2021 04:51:46 +0000</pubDate>
      <link>https://dev.to/rdamrong/docker-scan-2-4dii</link>
      <guid>https://dev.to/rdamrong/docker-scan-2-4dii</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JAA95Ipk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2kfjzidbw9jbb3das2r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JAA95Ipk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i2kfjzidbw9jbb3das2r.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
หลังจากที่เขียนเรื่อง docker scan เสร็จแล้ว ก็ยังนั่งเล่นเพิ่มเติมอีกนิดหน่อย เพราะว่ายังมีข้อสงสัยที่ยังหาเหตุผลและคำตอบไม่ได้ &lt;/p&gt;
&lt;h2&gt;
  
  
  ประเด็นแรก docker scan จะตรวจสอบ application ให้ด้วยไหม
&lt;/h2&gt;

&lt;p&gt;ถ้าลองนั่งเล่นดู จะสังเกตุได้ว่าวิธีที่ docker scan ทำก็คือจะเข้าไปกวาดดูใน container image ดูว่ามีไฟล์อะไรอยู่บ้าง แล้วนำไปเปรียบเทียบกับฐานข้อมูลที่ตัวเองมีอยู่ สิ่งที่สงสัยคือ Snyk ที่ docker scan ใช้เป็นเครื่องมือในการหาช่องโหว่จะรู้จักหรือตรวจสอบ application อื่น ๆ ที่เพิ่มเติมจาก base image ที่เป็น OS ด้วยไหม &lt;/p&gt;

&lt;p&gt;Damn Vulnerable Web Application (DVWA) น่าจะเป็นตัวทดสอบที่ดี เป็นที่รู้จักในวงกว้าง DVWA เป็น web application ที่ถูกสร้างให้มีช่องโหว่อยู่มากมาย ใช้เพื่อการเรียนรู้ด้าน Web Application Security ถ้า docker scan ทราบช่องโหว่ของ DVWA ได้ จะได้ทดสอบในมุมอื่น ๆ ต่อไป จึงทดสอบด้วย container image ที่  vulnerables/web-dvwa ใน Docker Hub&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; docker scan vulnerables/web-dvwa &lt;span class="nt"&gt;--json&lt;/span&gt; &lt;span class="nt"&gt;--group-issues&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;คำตอบที่ได้ก็คือ ผลการ scan ไม่รู้ข้อมูลของ DVWA เลย พบแต่ช่องโหว่ของไฟล์ที่ base image ที่เป็น OS &lt;a href="https://gist.githubusercontent.com/rdamrong/5c6f3b82c0d7935ff6924ef4ab2e980b/raw/ee09d18e23d8085a7f22aa6556a7bbc01dda9a4b/dvwa.json"&gt;สามารถดูผลทดสอบได้ที่นี่ครับ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ประเด็นที่ 2 เจอ option --file 
&lt;/h2&gt;

&lt;p&gt;พบว่า เมื่อเปรียบเทียบการใช้ --file และ ไม่ใช้ --file ผลของการรายงานช่องโหว่ไม่ต่างกัน เพราะว่าเป็นรายงานที่ได้จากข้อมูลใน Container Image แต่สิ่งที่ต่างกันจะอยู่ในช่วงท้ายของรายงาน พบว่าการใส่ --file มีคำแนะนำเพิ่มเติมถ้าในกรณีที่ base image ที่ใช้อยู่มีช่องโหว่ จากตัวอย่างในช่วงท้ายรายงานจะแนะนำให้ใช้ base image alpine:3 ซึ่งไม่มีรายงานช่องโหว่ แทนตัวเดิมที่ใช้ alpine:3.11.0&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; docker scan &lt;span class="nt"&gt;-f&lt;/span&gt; .&lt;span class="se"&gt;\D&lt;/span&gt;ockerfile ws-fac

Testing ws-fac...

✗ Low severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;openssl/libcrypto1.1
  Description: Inadequate Encryption Strength
  Info: https://snyk.io/vuln/SNYK-ALPINE311-OPENSSL-1075739
  Introduced through: openssl/libcrypto1.1@1.1.1d-r2, openssl/libssl1.1@1.1.1d-r2, apk-tools/apk-tools@2.10.4-r3, libtls-standalone/libtls-standalone@2.9.1-r0
  From: openssl/libcrypto1.1@1.1.1d-r2
  From: openssl/libssl1.1@1.1.1d-r2 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; openssl/libcrypto1.1@1.1.1d-r2
  From: apk-tools/apk-tools@2.10.4-r3 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; openssl/libcrypto1.1@1.1.1d-r2
  and 4 more...
  Image layer: Introduced by your base image &lt;span class="o"&gt;(&lt;/span&gt;alpine:3.11.0&lt;span class="o"&gt;)&lt;/span&gt;
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 1.1.1j-r0
&lt;span class="o"&gt;[&lt;/span&gt;...]
✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;apk-tools/apk-tools
  Description: Out-of-bounds Read
  Info: https://snyk.io/vuln/SNYK-ALPINE311-APKTOOLS-1246343
  Introduced through: apk-tools/apk-tools@2.10.4-r3
  Image layer: Introduced by your base image &lt;span class="o"&gt;(&lt;/span&gt;alpine:3.11.0&lt;span class="o"&gt;)&lt;/span&gt;
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 2.10.6-r0



Organization:      damrongsak
Package manager:   apk
Target file:       .&lt;span class="se"&gt;\D&lt;/span&gt;ockerfile
Project name:      docker-image|ws-fac
Docker image:      ws-fac
Platform:          linux/amd64
Base image:        alpine:3.11.0
Licenses:          enabled

Tested 14 dependencies &lt;span class="k"&gt;for &lt;/span&gt;known issues, found 11 issues.

Base Image     Vulnerabilities  Severity
alpine:3.11.0  11               5 high, 5 medium, 1 low

Recommendations &lt;span class="k"&gt;for &lt;/span&gt;base image upgrade:

Minor upgrades
Base Image  Vulnerabilities  Severity
alpine:3    0                0 high, 0 medium, 0 low
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ผลรายงานในกรณีที่ไม่ใส่ --file  เพื่อเปรียบเทียบกัน
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; docker scan  ws-fac

Testing ws-fac...

✗ Low severity vulnerability found in openssl/libcrypto1.1
  Description: Inadequate Encryption Strength
  Info: https://snyk.io/vuln/SNYK-ALPINE311-OPENSSL-1075739
  Introduced through: openssl/libcrypto1.1@1.1.1d-r2, openssl/libssl1.1@1.1.1d-r2, apk-tools/apk-tools@2.10.4-r3, libtls-standalone/libtls-standalone@2.9.1-r0
  From: openssl/libcrypto1.1@1.1.1d-r2
  From: openssl/libssl1.1@1.1.1d-r2 &amp;gt; openssl/libcrypto1.1@1.1.1d-r2
  From: apk-tools/apk-tools@2.10.4-r3 &amp;gt; openssl/libcrypto1.1@1.1.1d-r2
  and 4 more...
  Fixed in: 1.1.1j-r0
[...]
✗ High severity vulnerability found in apk-tools/apk-tools
  Description: Out-of-bounds Read
  Info: https://snyk.io/vuln/SNYK-ALPINE311-APKTOOLS-1246343
  Introduced through: apk-tools/apk-tools@2.10.4-r3
  From: apk-tools/apk-tools@2.10.4-r3
  Fixed in: 2.10.6-r0



Organization:      damrongsak
Package manager:   apk
Project name:      docker-image|ws-fac
Docker image:      ws-fac
Platform:          linux/amd64
Licenses:          enabled

Tested 14 dependencies for known issues, found 11 issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  มูลค่าความสุข
&lt;/h3&gt;

</description>
      <category>docker</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>scan หาช่องโหว่ใน image ด้วยคำสั่ง docker scan</title>
      <dc:creator>Damrongsak Reetanon</dc:creator>
      <pubDate>Tue, 01 Jun 2021 09:33:02 +0000</pubDate>
      <link>https://dev.to/rdamrong/scan-image-docker-scan-22f6</link>
      <guid>https://dev.to/rdamrong/scan-image-docker-scan-22f6</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foaylfop8njiwff649vfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foaylfop8njiwff649vfs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19 พ.ค. 2563 Docker และ Snyk ประกาศความร่วมมือร่วมกันในมุมของการตรวจสอบช่องโหว่ใน Container Image ใน Docker&lt;/li&gt;
&lt;li&gt;Snyx เป็นบริษัทที่มีผลิตภัณฑ์ที่มีเครื่องมือที่ช่วยหาช่องโหว่ และแนะนำเพื่อแก้ไข ทั้งในมุม Open Source Dependencies, Code Security, Container Security และ Infrastructure as Code Security&lt;/li&gt;
&lt;li&gt;ในกรณีที่ต้องการ scan หาช่องโหว่ในของ Container Image ในเครื่องตัวเอง ต้องเป็น ​Docker ที่เป็น &lt;strong&gt;Docker Desktop&lt;/strong&gt; version 2.3.6.0 ขึ้นไป &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;ใช้ได้เฉพาะ ​Docker Desktop for Mac and Docker Desktop for Windows เท่านั้น&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ docker version
Client:
 Cloud integration: 1.0.14
 Version:           20.10.6
&lt;span class="o"&gt;[&lt;/span&gt;...]
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      &lt;span class="nb"&gt;true

&lt;/span&gt;Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 &lt;span class="o"&gt;(&lt;/span&gt;minimum version 1.12&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;...]
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

❯ docker scan &lt;span class="nt"&gt;--version&lt;/span&gt;
Version:    v0.8.0
Git commit: 35651ca
Provider:   Snyk &lt;span class="o"&gt;(&lt;/span&gt;1.563.0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx25gl7jmpu11z7q5oda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx25gl7jmpu11z7q5oda.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Scan เพื่อตรวจสอบช่องโหว่ของ Container Image
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; ในกรณีที่ไม่พบช่องโหว่ใน Container Image. &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;lt;&amp;lt;

❯ docker scan  redhat/ubi8-micro

Testing redhat/ubi8-micro...

Organization:      damrongsak
Package manager:   rpm
Project name:      docker-image|redhat/ubi8-micro
Docker image:      redhat/ubi8-micro
Platform:          linux/amd64
Licenses:          enabled

✓ Tested 18 dependencies &lt;span class="k"&gt;for &lt;/span&gt;known issues, no vulnerable paths found.

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; ในกรณีที่พบช่องโหว่ใน Container Image &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&amp;lt;&amp;lt;

❯ docker scan centos

Testing centos...

✗ Low severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;libdb-utils
  Description: RHSA-2021:1675
  Info: https://snyk.io/vuln/SNYK-CENTOS8-LIBDBUTILS-1294335
  Introduced through: libdb-utils@5.3.28-39.el8
  From: libdb-utils@5.3.28-39.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 0:5.3.28-40.el8

✗ Low severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;libdb
  Description: RHSA-2021:1675
  Info: https://snyk.io/vuln/SNYK-CENTOS8-LIBDB-1294336
  Introduced through: libdb@5.3.28-39.el8
  From: libdb@5.3.28-39.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 0:5.3.28-40.el8

&lt;span class="o"&gt;[&lt;/span&gt;...]

Tested 172 dependencies &lt;span class="k"&gt;for &lt;/span&gt;known vulnerabilities, found 28 vulnerabilities.

For more free scans that keep your images secure, sign up to Snyk at https://dockr.ly/3ePqVcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ใช้ option --json แสดงผลการ scan ในรูปแบบของ JSON
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;ผลการ scan ที่ได้จะมีรายละเอียดของข้อมูลที่มากกว่า การแสดงผลแบบที่ไม่ใช้ --json&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ docker scan &lt;span class="nt"&gt;--json&lt;/span&gt; centos
&lt;span class="s2"&gt;"vulnerabilities"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"RHSA-2021:1679"&lt;/span&gt;,
      &lt;span class="s2"&gt;"credit"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;""&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"packageName"&lt;/span&gt;: &lt;span class="s2"&gt;"bash"&lt;/span&gt;,
      &lt;span class="s2"&gt;"language"&lt;/span&gt;: &lt;span class="s2"&gt;"linux"&lt;/span&gt;,
      &lt;span class="s2"&gt;"packageManager"&lt;/span&gt;: &lt;span class="s2"&gt;"centos:8"&lt;/span&gt;,
      &lt;span class="s2"&gt;"description"&lt;/span&gt;: &lt;span class="s2"&gt;"## NVD Description&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;i&amp;gt; **Note:** &amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;i&amp;gt; Versions mentioned in the description apply to the upstream &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;bash&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt; package. &amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;i&amp;gt; See &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Remediation&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt; section below for &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Centos:8&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt; relevant versions. &amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;The bash packages provide Bash (Bourne-again shell), which is the default shell for Red Hat Enterprise Linux. Security Fix(es): * bash: when effective UID is not equal to its real UID the saved UID is not dropped (CVE-2019-18276) For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section. Additional Changes: For detailed information on changes in this release, see the Red Hat Enterprise Linux 8.4 Release Notes linked from the References section.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;## Remediation&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Upgrade &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;Centos:8&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;bash&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="s2"&gt; to version 0:4.4.19-14.el8 or higher.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;## References&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;- [ADVISORY](https://access.redhat.com/errata/RHSA-2021:1679)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;,
      &lt;span class="s2"&gt;"identifiers"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ALTERNATIVE"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
        &lt;span class="s2"&gt;"CVE"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"RHSA-2021:1679"&lt;/span&gt;
        &lt;span class="o"&gt;]&lt;/span&gt;,
        &lt;span class="s2"&gt;"CWE"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s2"&gt;"severity"&lt;/span&gt;: &lt;span class="s2"&gt;"low"&lt;/span&gt;,
      &lt;span class="s2"&gt;"severityWithCritical"&lt;/span&gt;: &lt;span class="s2"&gt;"low"&lt;/span&gt;,
      &lt;span class="s2"&gt;"cvssScore"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"CVSSv3"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"patches"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
      &lt;span class="s2"&gt;"references"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"title"&lt;/span&gt;: &lt;span class="s2"&gt;"ADVISORY"&lt;/span&gt;,
          &lt;span class="s2"&gt;"url"&lt;/span&gt;: &lt;span class="s2"&gt;"https://access.redhat.com/errata/RHSA-2021:1679"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"creationTime"&lt;/span&gt;: &lt;span class="s2"&gt;"2021-05-19T08:11:21.843115Z"&lt;/span&gt;,
      &lt;span class="s2"&gt;"modificationTime"&lt;/span&gt;: &lt;span class="s2"&gt;"2021-05-19T08:11:21.853372Z"&lt;/span&gt;,
      &lt;span class="s2"&gt;"publicationTime"&lt;/span&gt;: &lt;span class="s2"&gt;"2021-05-19T08:11:21.860359Z"&lt;/span&gt;,
      &lt;span class="s2"&gt;"disclosureTime"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"id"&lt;/span&gt;: &lt;span class="s2"&gt;"SNYK-CENTOS8-BASH-1294125"&lt;/span&gt;,
      &lt;span class="s2"&gt;"nvdSeverity"&lt;/span&gt;: &lt;span class="s2"&gt;"low"&lt;/span&gt;,
      &lt;span class="s2"&gt;"relativeImportance"&lt;/span&gt;: null,
      &lt;span class="s2"&gt;"semver"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"vulnerable"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
          &lt;span class="s2"&gt;"&amp;lt;0:4.4.19-14.el8"&lt;/span&gt;
        &lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;,
      &lt;span class="s2"&gt;"exploit"&lt;/span&gt;: &lt;span class="s2"&gt;"No Data"&lt;/span&gt;,
      &lt;span class="s2"&gt;"from"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"docker-image|centos@latest"&lt;/span&gt;,
        &lt;span class="s2"&gt;"bash@4.4.19-12.el8"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"upgradePath"&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="nb"&gt;false&lt;/span&gt;,
        &lt;span class="s2"&gt;"bash@0:4.4.19-14.el8"&lt;/span&gt;
      &lt;span class="o"&gt;]&lt;/span&gt;,
      &lt;span class="s2"&gt;"isUpgradable"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
      &lt;span class="s2"&gt;"isPatchable"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
      &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"bash"&lt;/span&gt;,
      &lt;span class="s2"&gt;"version"&lt;/span&gt;: &lt;span class="s2"&gt;"4.4.19-12.el8"&lt;/span&gt;,
      &lt;span class="s2"&gt;"nearestFixedInVersion"&lt;/span&gt;: &lt;span class="s2"&gt;"0:4.4.19-14.el8"&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;[&lt;/span&gt;...]
  &lt;span class="s2"&gt;"packageManager"&lt;/span&gt;: &lt;span class="s2"&gt;"rpm"&lt;/span&gt;,
  &lt;span class="s2"&gt;"ignoreSettings"&lt;/span&gt;: null,
  &lt;span class="s2"&gt;"docker"&lt;/span&gt;: &lt;span class="o"&gt;{}&lt;/span&gt;,
  &lt;span class="s2"&gt;"summary"&lt;/span&gt;: &lt;span class="s2"&gt;"28 vulnerable dependency paths"&lt;/span&gt;,
  &lt;span class="s2"&gt;"filesystemPolicy"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt;,
  &lt;span class="s2"&gt;"filtered"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"ignore"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;,
    &lt;span class="s2"&gt;"patch"&lt;/span&gt;: &lt;span class="o"&gt;[]&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="s2"&gt;"uniqueCount"&lt;/span&gt;: 28,
  &lt;span class="s2"&gt;"projectName"&lt;/span&gt;: &lt;span class="s2"&gt;"docker-image|centos"&lt;/span&gt;,
  &lt;span class="s2"&gt;"platform"&lt;/span&gt;: &lt;span class="s2"&gt;"linux/amd64"&lt;/span&gt;,
  &lt;span class="s2"&gt;"path"&lt;/span&gt;: &lt;span class="s2"&gt;"centos"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;

&lt;h3&gt;
  
  
  เพิ่ม option --dependency-tree แสดงความเกี่ยวข้องกันของแต่ละไฟล์ใน Container Image
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ docker scan &lt;span class="nt"&gt;--dependency-tree&lt;/span&gt; redhat/ubi8-micro
docker-image|redhat/ubi8-micro @ latest
   ├─ basesystem @ 11-5.el8
   ├─ bash @ 4.4.20-1.el8_4
   ├─ coreutils-single @ 8.30-8.el8
   ├─ filesystem @ 3.8-3.el8
   ├─ glibc @ 2.28-151.el8
   ├─ glibc-common @ 2.28-151.el8
   ├─ glibc-minimal-langpack @ 2.28-151.el8
   ├─ libacl @ 2.2.53-1.el8
   ├─ libattr @ 2.4.48-3.el8
   ├─ libcap @ 2.26-4.el8
   ├─ libselinux @ 2.9-5.el8
   ├─ libsepol @ 2.9-2.el8
   ├─ ncurses-base @ 6.1-7.20180224.el8
   ├─ ncurses-libs @ 6.1-7.20180224.el8
   ├─ pcre2 @ 10.32-2.el8
   ├─ redhat-release @ 8.4-0.6.el8
   ├─ setup @ 2.12.2-6.el8
   └─ tzdata @ 2021a-1.el8

Testing redhat/ubi8-micro...

Organization:      damrongsak
Package manager:   rpm
Project name:      docker-image|redhat/ubi8-micro
Docker image:      redhat/ubi8-micro
Platform:          linux/amd64
Licenses:          enabled

✓ Tested 18 dependencies &lt;span class="k"&gt;for &lt;/span&gt;known issues, no vulnerable paths found.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  เพิ่ม option --severity เพื่อกำหนดให้แสดงผลเฉพาะกลุ่มของ severity ที่ต้องการเท่านั้น ซึ่งสามารถกำหนดได้ 3 ระดับ low, medium และ high
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ docker scan &lt;span class="nt"&gt;--severity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;high centos

Testing centos...

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;openssl-libs
  Description: RHSA-2020:5476
  Info: https://snyk.io/vuln/SNYK-CENTOS8-OPENSSLLIBS-1052541
  Introduced through: openssl-libs@1:1.1.1g-11.el8
  From: openssl-libs@1:1.1.1g-11.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 1:1.1.1g-12.el8_3

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;openssl-libs
  Description: RHSA-2021:1024
  Info: https://snyk.io/vuln/SNYK-CENTOS8-OPENSSLLIBS-1089748
  Introduced through: openssl-libs@1:1.1.1g-11.el8
  From: openssl-libs@1:1.1.1g-11.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 1:1.1.1g-15.el8_3

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;nettle
  Description: RHSA-2021:1206
  Info: https://snyk.io/vuln/SNYK-CENTOS8-NETTLE-1287634
  Introduced through: nettle@3.4.1-2.el8
  From: nettle@3.4.1-2.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 0:3.4.1-4.el8_3

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;gnutls
  Description: RHSA-2021:1206
  Info: https://snyk.io/vuln/SNYK-CENTOS8-GNUTLS-1287630
  Introduced through: gnutls@3.6.14-6.el8
  From: gnutls@3.6.14-6.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 0:3.6.14-8.el8_3

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;bind-export-libs
  Description: RHSA-2021:0670
  Info: https://snyk.io/vuln/SNYK-CENTOS8-BINDEXPORTLIBS-1081045
  Introduced through: bind-export-libs@32:9.11.20-5.el8
  From: bind-export-libs@32:9.11.20-5.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 32:9.11.20-5.el8_3.1

✗ High severity vulnerability found &lt;span class="k"&gt;in &lt;/span&gt;bind-export-libs
  Description: RHSA-2021:1989
  Info: https://snyk.io/vuln/SNYK-CENTOS8-BINDEXPORTLIBS-1294046
  Introduced through: bind-export-libs@32:9.11.20-5.el8
  From: bind-export-libs@32:9.11.20-5.el8
  Fixed &lt;span class="k"&gt;in&lt;/span&gt;: 32:9.11.26-4.el8_4



Organization:      damrongsak
Package manager:   rpm
Project name:      docker-image|centos
Docker image:      centos
Platform:          linux/amd64
Licenses:          enabled

Tested 172 dependencies &lt;span class="k"&gt;for &lt;/span&gt;known issues, found 6 issues.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ข้อจำกัดที่ต้องรู้
&lt;/h3&gt;

&lt;p&gt;ถ้า scan โดยไม่ได้ login กับ Snyk จะ scan ได้เพียง 10 ครั้งต่อเดือนเท่านั้น หากต้องการใช้ต้อง login กับ Snyk ด้วยคำสั่ง &lt;code&gt;docker scan --login&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯  docker scan IMAGE
You have reached the scan limit of 10 monthly scans without authentication.
For additional monthly scans, sign into or sign up &lt;span class="k"&gt;for &lt;/span&gt;Snyk &lt;span class="k"&gt;for &lt;/span&gt;free with the following &lt;span class="nb"&gt;command&lt;/span&gt;:
&lt;span class="sb"&gt;`&lt;/span&gt;docker scan &lt;span class="nt"&gt;--login&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Login ที่ snyk.io ด้วย Docker ID พอ login สำเร็จ Snyk จะอนุญาตให้เรา scan ได้ 200 ครั้งต่อเดืือน
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ docker scan &lt;span class="nt"&gt;--login&lt;/span&gt;

Now redirecting you to our auth page, go ahead and log &lt;span class="k"&gt;in&lt;/span&gt;,
and once the auth is &lt;span class="nb"&gt;complete&lt;/span&gt;, &lt;span class="k"&gt;return &lt;/span&gt;to this prompt and you&lt;span class="s1"&gt;'ll
be ready to start using snyk.

If you can'&lt;/span&gt;t &lt;span class="nb"&gt;wait &lt;/span&gt;use this url:
https://snyk.io/login?token&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;...]


Your account has been authenticated. Snyk is now ready to be used.

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

&lt;/div&gt;

&lt;h2&gt;
  
  
  มูลค่าความสุข
&lt;/h2&gt;

&lt;p&gt;อ่านต่อตอนที่ 2&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/rdamrong" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F566188%2Fab9a35a5-c668-4906-bd77-b6585613faea.jpeg" alt="rdamrong"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/rdamrong/docker-scan-2-4dii" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;docker scan ตอน 2 ... ยังมีข้อสงสัยอีกนิดหน่อย !!!&lt;/h2&gt;
      &lt;h3&gt;Damrongsak Reetanon ・ Jun 2 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#docker&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devsecops&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;



</description>
      <category>docker</category>
      <category>snyx</category>
      <category>devsecops</category>
      <category>container</category>
    </item>
  </channel>
</rss>
