Ansible #6 ตอน pattern มีไว้กรอง inventory

Damrongsak Reetanon
3 min readMay 8, 2018

--

ถ้ามองว่า inventory เป็นถังเก็บข้อมูลของ managed host ขนาดใหญ่ ทุกครั้งที่เราต้องการสั่งให้ ansbile ไปจัดการกับ host ไม่จำเป็นต้องจัดการ managed host ทุกเครื่องที่มีอยู่ใน inventory ทุกครั้ง บางครั้งอาจจะต้องการจัดการกับบางกลุ่ม บ้างเครื่องเท่านั้น การกำหนด pattern จึงเป็นการกำหนดให้ ansible เข้าไปจัดการกับเครื่องที่เราต้องการในแต่ละครั้งเท่านั้น ดังนั้น การเรียนรู้ที่จะรู้จัก pattern จึงเป็นแนวทางหนึ่งที่เราจะกำหนดกรอบการเข้าไปจัดการ host ได้อย่างแม่นยำ และง่ายมากขึ้น

$ansible -i <inventory file> <pattern> -m <module name> -a <argument>

ในตอนนี้ จะใช้ inventory file ที่มีข้อมูลดังนี้ เป็นตัวอย่างในการทำความเข้าใจเรื่อง pattern ทั้งตอน ดังนั้น ถ้ามีการอ้างด้วย -i myinventory จะหมายถึงข้อมูล inventory ตามนี้

alpha.example.com
beta.example.com
192.168.25.45
[web]
gamma.example.com
delta.example.com
192.168.25.46
[db]
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34
[mix]
zeta.example.com
192.168.25.46
[app:children]
web
db

รูปแบบ pattern ในรูปแบบต่าง ๆ

  1. Host name
$ ansible -i myinventory beta.example.com --list-hosts
hosts (1):
beta.example.com

ในตัวอย่าง ระบุ pattern เป็น beta.example.com ผลที่ได้ก็คือ beta.example.com เป็นระบุว่า ต้องการ managed host เป็นแค่ beta.example.com เท่านั้น

2. IP Address

$ ansible -i myinventory 192.168.25.34 --list-hosts
hosts (1):
192.168.25.34

ในตัวอย่าง ระบุ pattern เป็น 192.168.25.34 ผลที่ได้ก็คือ 192.168.25.34 เป็นระบุว่า ต้องการ managed host เป็นแค่ 192.168.25.34 เท่านั้น

3. group

$ ansible -i myinventory db --list-hosts
hosts (4):
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34

ในตัวอย่าง ระบุ pattern เป็น db ซึ่งถ้าไปตรวจสอบใน inventory file จะพบว่า db เป็นชื่อ db ซึ่งประกอบไปได้ managed host ทั้งหมด 4 hosts ผลที่ได้จึงแสดงชื่อ host ทั้ง 4 ออก ตรงการที่ระบุใน inventory file

4. list

$ ansible -i myinventory 'alpha.example.com,192.168.25.45' --list-hosts
hosts (2):
alpha.example.com
192.168.25.45

ในตัวอย่าง ระบุ pattern เป็น alpha.example.com,192.168.25.45 เป็นการระบุ managed host มากกว่า 1 host โดยการระบุ pattern แบบ list ต้องคั่นด้วยเครื่องหมาย “,” เป็นตัวแยกระหว่าง managed host ในการละเครื่อง

5. all และ ungrouped

$ ansible -i myinventory 'all' --list-hosts
hosts (10):
alpha.example.com
beta.example.com
192.168.25.45
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34
gamma.example.com
delta.example.com
192.168.25.46
$ ansible -i myinventory 'ungrouped' --list-hosts
hosts (3):
alpha.example.com
beta.example.com
192.168.25.45

มี pattern ที่ ถูกกำหนดไว้โดย ansible อยู่ 2 ชื่อ คือ all และ ungrouped เป็นค่า default โดยที่ all หมายถึง pattern ที่ต้องการระบุถึงทุก host ที่มีอยู่ใน inventory file และ ungrouped หมายถึง pattern ที่ต้องการระบุถึง host ที่ไม่ถูกระบุอยู่ใน group ใด ๆ

6. wildcard

$ ansible -i myinventory '*' --list-hosts
hosts (10):
alpha.example.com
beta.example.com
192.168.25.45
gamma.example.com
delta.example.com
192.168.25.46
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34

พยายามจะหาคำอธิบายของ wildcard สุดท้ายก็เลยพึ่งตัวช่วย ลองไปค้นความหมายของคำว่า wildcard คือ ”ตัวอักขระหรือสัญลักษณ์ที่ใช้แทนตัวอักขระใด ๆ ก็มักใช้เมื่อต้องการสั่งให้มีการค้นแต่ไม่สามารถจะบอกรายละเอียดต่าง ๆ ได้ทั้งหมด” พอเลือกใช้ pattern เป็น wildcard ผลก็เลยออกมาเหมือนกับการเรียกใช้ pattern เป็น all

อ้างอิง : ความหมายของ wildcard https://dictionary.sanook.com/search/dict-computer/wildcards

7. wildcard pattern matching

$ ansible -i myinventory '*.example.com' --list-hosts
hosts (7):
alpha.example.com
theta.example.com
gamma.example.com
zeta.example.com
delta.example.com
lambda.example.com
beta.example.com
$ ansible -i myinventory '192.168.25.4*' --list-hosts
hosts (2):
192.168.25.45
192.168.25.46
$ ansible -i myinventory '192.168.25.3*,a*.example.com' --list-hosts
hosts (2):
192.168.25.34
alpha.example.com

ใน pattern แบบนี้ เป็นการนำ wildcard มาใช้งานเพิ่มเติม ให้ pattern เลือก host ที่ต้องการได้หลากหลายรูปแบบมากขี้น จากตัวอย่าง ‘*.example.com’ ผลที่ได้ก็จะเห็นได้ว่า จะเป็น host ที่อยู่ภายใต้ domain example.com ที่มีอยู่ใน inventory file , ‘192.168.25.4*’ ผลที่ได้ก็คือ host ที่มีอยู่ใน inventory file ที่มี ip ตั้งแต่ 192.168.25.40 ถึง 49 และ สุดท้าย การผสมการใช้ wildcard pattern matching กับ list เพื่อให้ได้ host ที่ต้องการได้อย่างครบด้วย

8. inclusion, exclude and intersection

#---- INCLUSION
$ ansible -i myinventory 'db:mix' --list-hosts
hosts (5):
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34
192.168.25.46
#---- INTERSECTION
$ ansible -i myinventory 'db:&mix' --list-hosts
hosts (1):
zeta.example.com
#---- EXCLUDE
$ ansible -i myinventory 'db:!mix' --list-hosts
hosts (3):
theta.example.com
lambda.example.com
192.168.25.34
#---- INFORMATION
$ ansible -i myinventory 'db' --list-hosts
hosts (4):
zeta.example.com
theta.example.com
lambda.example.com
192.168.25.34
$ ansible -i myinventory 'mix' --list-hosts
hosts (2):
zeta.example.com
192.168.25.46
INCLUSION (db:mix)
INTERSECTION (db:&mix)
EXCLUDE (db:!mix)

--

--

Damrongsak Reetanon
Damrongsak Reetanon

Written by Damrongsak Reetanon

OpenSource |Cloud Computing|Automation|DevOps

No responses yet