ค้นหาเว็บไซต์

วิธีสร้างเทมเพลตใน 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 %}

และเพียงเท่านี้สำหรับการบรรยายครั้งนี้ เข้าร่วมกับเราในหัวข้อถัดไปที่เราจะร่วมทำงานกับตัวแปรและข้อเท็จจริงที่สามารถเข้าใจได้