วิธีสร้างเทมเพลตใน Ansible เพื่อสร้างการกำหนดค่าบนโหนดที่ได้รับการจัดการ - ตอนที่ 7
ในส่วนที่ 7 ของ Ansible Series นี้ คุณจะได้เรียนรู้วิธีสร้างและใช้เทมเพลตใน Ansible เพื่อสร้างการกำหนดค่าแบบกำหนดเองบนโหนดที่ได้รับการจัดการ การสร้างเทมเพลตใน Ansible เป็นวิธีที่ง่ายและเป็นมิตรในการพุชการกำหนดค่าแบบกำหนดเองไปยังโหนดที่ได้รับการจัดการซึ่งรันระบบต่างๆ โดยมีการแก้ไขไฟล์ Playbook เพียงเล็กน้อย
Templating ใน Ansible คืออะไร?
เพื่อให้เข้าใจได้ดีขึ้นว่าเทมเพลตคืออะไร ลองพิจารณาผู้จัดการฝ่ายไอทีร่างอีเมลเพื่อเชิญแผนกของเขาให้เข้าร่วมงานเลี้ยงค็อกเทล อีเมลจะถูกส่งไปยังสมาชิกแต่ละคนและเชิญชวนให้พวกเขาแท็กพร้อมกับคู่สมรสของตนด้วย
อีเมลได้รับการปรับแต่งเพื่อให้เนื้อหาของอีเมลยังคงเหมือนเดิม แต่ผู้รับและชื่อของคู่สมรสจะแตกต่างกันไป อีเมลจะกลายเป็นเทมเพลต ในขณะที่ผู้รับและคู่สมรสที่เกี่ยวข้องจะเป็นตัวแปร
นั่นเป็นตัวอย่างทั่วไป Ansible ใช้ Jinja2 ซึ่งเป็นเครื่องมือสร้างเทมเพลตที่ทันสมัยสำหรับเฟรมเวิร์ก Python ที่ใช้ในการสร้างเนื้อหาหรือนิพจน์แบบไดนามิก การสร้างเทมเพลตมีประโยชน์อย่างยิ่งเมื่อสร้างไฟล์การกำหนดค่าแบบกำหนดเองสำหรับเซิร์ฟเวอร์หลายเครื่อง แต่ไม่ซ้ำกันสำหรับแต่ละเซิร์ฟเวอร์
Jinja2 ใช้เครื่องหมายปีกกาคู่ {{ ... }}
เพื่อล้อมรอบตัวแปรที่ถูกกำหนดไว้ สำหรับความคิดเห็น ให้ใช้ {{# #}
และสำหรับคำสั่งแบบมีเงื่อนไข ให้ใช้ {% … %}
สมมติว่าคุณมีโมเดลข้อมูลของ VLANs ในเครือข่ายของคุณที่มีระบบโฮสต์ที่คุณต้องการส่งไปยัง VLANs ตามลำดับดังที่แสดง
vlans:
- id: 10
name: LB
- id: 20
name: WB_01
- id: 30
name: WB_02
- id: 40
name: DB
ในการแสดงการกำหนดค่านี้ เทมเพลต jinja2 ที่เรียกว่า vlans.j2 จะปรากฏขึ้นดังที่แสดง อย่างที่คุณเห็น ตัวแปร vlan.id และ vlan.name อยู่ในวงเล็บปีกกา
vlan {{ vlan.id }}
name {{ vlan.name }}
เมื่อรวมทุกอย่างเข้าด้วยกันใน Playbook ซึ่งวางเครื่องโฮสต์ที่แตกต่างกัน สิ่งนี้จะปรากฏดังภาพ:
- hosts
tasks:
- name: Rendering VLAN configuration
template:
src: vlans.j2
dest: "vlan_configs/{{ inventory_hostname }}.conf"
ตัวอย่างที่ 1: การกำหนดค่าเว็บเซิร์ฟเวอร์ใน Distros ที่แตกต่างกัน
ในตัวอย่างนี้ เราจะสร้างไฟล์ index.html ที่จะแสดงข้อมูลเกี่ยวกับ ชื่อโฮสต์ และระบบปฏิบัติการของเว็บเซิร์ฟเวอร์ 2 ตัวที่ใช้ CentOS และ Ubuntu .
ติดตั้ง
Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 - IP address: 173.82.115.165
เว็บเซิร์ฟเวอร์ Apache ได้รับการติดตั้งบนเซิร์ฟเวอร์ทั้งสองแล้ว
สำหรับ CentOS 7
สำหรับอูบุนตู 18.04
ดังนั้นเรามาสร้าง Playbook test_server.yml ดังที่แสดง:
---
- hosts: all
become: yes
tasks:
- name: Install index.html
template:
src: index.html.j2
dest: /var/www/html/index.html
mode: 0777
เทมเพลตไฟล์ Jinja ของเราคือ index.html.j2 ซึ่งจะถูกส่งไปยังไฟล์ index.html บนเว็บเซิร์ฟเวอร์แต่ละแห่ง อย่าลืมใส่นามสกุล .j2
ต่อท้ายเสมอเพื่อแสดงว่าเป็นไฟล์ jinja2
ตอนนี้เรามาสร้างไฟล์เทมเพลต index.html.j2 กันดีกว่า
<html>
<center>
<h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
<h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>
เทมเพลตนี้เป็นไฟล์ HTML พื้นฐานที่ ansible_hostname และ ansible_os_family เป็นตัวแปรในตัวที่จะถูกแทนที่ด้วยชื่อโฮสต์และระบบปฏิบัติการที่เกี่ยวข้องของเว็บเซิร์ฟเวอร์แต่ละตัวบนเบราว์เซอร์
ตอนนี้เรามาเริ่ม Playbook กันดีกว่า
ansible-playbook test_server.yml
ตอนนี้มาโหลดหน้าเว็บซ้ำสำหรับทั้งเว็บเซิร์ฟเวอร์ CentOS 7 และ Ubuntu
สำหรับ CentOS 7
สำหรับอูบุนตู 18.04
อย่างที่คุณเห็น ข้อมูลที่แตกต่างกันเกี่ยวกับชื่อโฮสต์และตระกูลของระบบปฏิบัติการได้แสดงอยู่บนเซิร์ฟเวอร์แต่ละเครื่อง และนั่นก็คือเทมเพลต Jinja2 ที่เจ๋งมาก!
ตัวกรอง:
บางครั้งคุณอาจตัดสินใจแทนที่ค่าของตัวแปรด้วยสตริงที่ปรากฏในลักษณะใดลักษณะหนึ่ง
ตัวอย่างที่ 1: ทำให้สตริงปรากฏเป็นตัวพิมพ์ใหญ่/ตัวพิมพ์เล็ก
ตัวอย่างเช่น ในตัวอย่างก่อนหน้านี้ เราสามารถตัดสินใจได้ว่าต้องการให้ตัวแปร Ansible ปรากฏเป็นตัวพิมพ์ใหญ่ โดยเพิ่มค่าที่อยู่ด้านบนสุดให้กับตัวแปร วิธีนี้จะทำให้ค่าในตัวแปรถูกแปลงเป็นรูปแบบตัวพิมพ์ใหญ่
{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT
ในทำนองเดียวกัน คุณสามารถแปลงเอาต์พุตสตริงเป็นตัวพิมพ์เล็กได้โดยการผนวกอาร์กิวเมนต์ที่ต่ำกว่า
{{ ansible_hostname | lower }} => centos 7
{{ ansible_os_family | lower }} => redhat
ตัวอย่างที่ 2: แทนที่สตริงด้วยอันอื่น
นอกจากนี้ คุณยังสามารถแทนที่สตริงด้วยสตริงอื่นได้
ตัวอย่างเช่น:
ชื่อภาพยนตร์คือ {{ movie_name }} =>
ชื่อภาพยนตร์คือ Ring
หากต้องการแทนที่เอาต์พุตด้วยสตริงอื่น ให้ใช้อาร์กิวเมนต์แทนที่ดังที่แสดง:
ชื่อภาพยนตร์คือ {{ movie_name | แทนที่ (“Ring“, ”Heist ”) }} =>
ชื่อภาพยนตร์คือ Heist
ตัวอย่างที่ 3: รายการและตั้งค่าตัวกรอง
หากต้องการดึงค่าที่น้อยที่สุดในอาร์เรย์ ให้ใช้ตัวกรอง นาที
{{ [ 2, 3, 4, 5, 6, 7 ] | min }} => 2
ในทำนองเดียวกัน หากต้องการดึงข้อมูลจำนวนที่มากที่สุด ให้ใช้ตัวกรอง สูงสุด
{{ [ 2, 3, 4, 5, 6, 7 ] | max }} => 7
หากต้องการแสดงค่าที่ไม่ซ้ำ ให้ใช้ตัวกรอง ไม่ซ้ำกัน
{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} => 2, 3
ใช้ตัวกรอง สุ่ม เพื่อให้ได้ตัวเลขสุ่มระหว่าง 0 ถึงค่า
{{ 50 | random }} => Some random number
ลูป :
เช่นเดียวกับในภาษาการเขียนโปรแกรม เรามี ลูป ใน Ansible Jinja2
ตัวอย่างเช่น หากต้องการสร้างไฟล์ที่มีรายการตัวเลข ให้ใช้ for loop ดังที่แสดงในตัวอย่างด้านล่าง:
ตัวอย่างที่ 1:
{% for number in [0, 1, 2, 3, 4, 5, 6, 7] %}
{{ number }}
{% end for %}
คุณยังสามารถรวม for loop เข้ากับคำสั่ง if-else เพื่อกรองและรับค่าบางอย่างได้
ตัวอย่างที่ 2:
{% for number in [0, 1, 2, 3, 4, 5, 6, 7] %}
{% if number == 5 %}
{{ number }}
{% endif%}
{% endfor %}
และเพียงเท่านี้สำหรับการบรรยายครั้งนี้ เข้าร่วมกับเราในหัวข้อถัดไปที่เราจะร่วมทำงานกับตัวแปรและข้อเท็จจริงที่สามารถเข้าใจได้