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

วิธีทำงานกับตัวแปรและข้อเท็จจริงที่เข้าใจได้ - ตอนที่ 8


เราได้กล่าวถึงตัวแปรในซีรีส์ Ansible นี้แล้วและเพื่อให้คุณรู้สึกกระปรี้กระเปร่าเล็กน้อย ตัวแปร เหมือนกับในภาษาการเขียนโปรแกรมอื่นๆ โดยพื้นฐานแล้วคือคีย์ที่แสดงถึงค่า

ชื่อตัวแปรที่ถูกต้องประกอบด้วยอะไร?

ชื่อตัวแปรประกอบด้วยตัวอักษร ตัวเลข ขีดล่าง หรือผสมระหว่าง 2 ตัวหรือทั้งหมดก็ได้ อย่างไรก็ตาม โปรดทราบว่าชื่อตัวแปรจะต้องขึ้นต้นด้วยตัวอักษรเสมอและไม่ควรมีการเว้นวรรค

มาดูตัวอย่างบางส่วนของชื่อตัวแปรที่ถูกต้องและยอมรับไม่ได้:

ตัวอย่างชื่อตัวแปรที่ถูกต้อง:

football 
foot_ball
football20 
foot_ball20

ตัวอย่างชื่อตัวแปรที่ไม่ถูกต้อง:

foot ball
20 
foot-ball

เรามาหารือเกี่ยวกับประเภทของตัวแปร:

1. ตัวแปรเพลย์บุ๊ก

ตัวแปร เพลย์บุ๊ก ค่อนข้างง่ายและตรงไปตรงมา หากต้องการกำหนดตัวแปรใน คู่มือการเล่น เพียงใช้คำหลัก vars ก่อนที่จะเขียนตัวแปรด้วยการเยื้อง

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

นี่คือตัวอย่าง Playbook ง่ายๆ:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

ใน Playbook ข้างต้น ตัวแปร คำทักทาย จะถูกแทนที่ด้วยค่า สวัสดีชาวโลก! เมื่อเรียกใช้ Playbook Playbook จะพิมพ์ข้อความ Hello world! เมื่อดำเนินการ

นอกจากนี้ คุณยังสามารถมีรายการหรืออาร์เรย์ของตัวแปรได้ดังที่แสดง:

Playbook ด้านล่างแสดงตัวแปรที่เรียกว่า ทวีป ตัวแปรเก็บค่าที่แตกต่างกัน 5 ค่า ได้แก่ ชื่อทวีป แต่ละค่าเหล่านี้สามารถเข้าถึงได้ง่ายโดยใช้ ดัชนี 0 เป็นตัวแปรแรก

ตัวอย่างของ Playbook ด้านล่างดึงข้อมูลและแสดง เอเชีย (ดัชนี 1)

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

รายการตัวแปรสามารถจัดโครงสร้างในทำนองเดียวกันดังที่แสดง:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

หากต้องการแสดงรายการทั้งหมดในรายการ ให้ใช้โมดูล with_items สิ่งนี้จะวนซ้ำค่าทั้งหมดในอาร์เรย์

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

ตัวแปร Ansible อีกประเภทหนึ่งคือตัวแปร พจนานุกรม

ตัวแปรพจนานุกรมได้รับการสนับสนุนเพิ่มเติมใน Playbook ในการกำหนดตัวแปรพจนานุกรม เพียงระบุคู่คีย์-ค่าใต้ชื่อตัวแปรพจนานุกรม

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

ในตัวอย่างข้างต้น vlans เป็นตัวแปรพจนานุกรม ในขณะที่ id และ พอร์ต เป็นคู่คีย์-ค่า

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

สำหรับ port_id เนื่องจากเราเริ่มต้นค่าด้วยข้อความ ไม่ใช่ตัวแปร จึงไม่จำเป็นต้องมีเครื่องหมายคำพูดล้อมรอบเครื่องหมายปีกกา

2. ตัวแปรพิเศษ

Ansible แสดงรายการตัวแปรที่กำหนดไว้ล่วงหน้าที่สามารถอ้างอิงได้ในเทมเพลตและ Playbook ของ Jinja2 แต่ผู้ใช้ไม่สามารถเปลี่ยนแปลงหรือกำหนดได้

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

หากต้องการรับรายการตัวแปร Ansible ทั้งหมด ให้ใช้โมดูล การตั้งค่า ในคำสั่ง Ansible ad-hoc ดังที่แสดงด้านล่าง:

ansible -m setup hostname

ซึ่งจะแสดงเอาต์พุตในรูปแบบ JSON ดังที่แสดง:

ansible -m setup localhost

จากผลลัพธ์ เราจะเห็นว่าตัวอย่างบางส่วนของตัวแปรพิเศษ Ansible ได้แก่:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

มีตัวแปรพิเศษ Ansible อื่นๆ อีกมากมาย นี่เป็นเพียงตัวอย่างบางส่วน

ตัวแปรเหล่านี้สามารถใช้ได้ในเทมเพลต Jinja2 ดังที่แสดง:

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

3. ตัวแปรสินค้าคงคลัง

สุดท้ายนี้ เรามีตัวแปรสินค้าคงคลัง Ansible สินค้าคงคลังคือไฟล์ในรูปแบบ INI ที่มีโฮสต์ทั้งหมดที่ Ansible จัดการ

ในสินค้าคงคลัง คุณสามารถกำหนดตัวแปรให้กับระบบโฮสต์และนำไปใช้ใน Playbook ได้ในภายหลัง

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

ข้อมูลข้างต้นสามารถแสดงในไฟล์ Playbook YAML ดังที่แสดง:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

หากระบบโฮสต์ใช้ตัวแปรเดียวกัน คุณสามารถกำหนดกลุ่มอื่นในไฟล์สินค้าคงคลังเพื่อทำให้ยุ่งยากน้อยลง และหลีกเลี่ยงการทำซ้ำโดยไม่จำเป็น

ตัวอย่างเช่น:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

โครงสร้างข้างต้นสามารถจัดเป็น:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

และในไฟล์ Playbook YAML จะมีการกำหนดไว้ดังที่แสดง:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

ข้อเท็จจริงที่สามารถวิเคราะห์ได้

เมื่อเรียกใช้ playbooks งานแรกที่ Ansible ทำคือการดำเนินการตั้งค่า ฉันค่อนข้างแน่ใจว่าคุณต้องเจอผลลัพธ์:

TASK:  [Gathering facts] *********

ข้อเท็จจริงที่วิเคราะห์ได้นั้นไม่มีอะไรนอกจากคุณสมบัติของระบบหรือข้อมูลเกี่ยวกับโหนดระยะไกลที่คุณเชื่อมต่อด้วย ข้อมูลนี้รวมถึงสถาปัตยกรรมระบบ เวอร์ชันของระบบปฏิบัติการ ข้อมูล BIOS เวลาและวันที่ของระบบ เวลาทำงานของระบบ ที่อยู่ IP และข้อมูลฮาร์ดแวร์ที่จะกล่าวถึงบางส่วน

หากต้องการทราบข้อเท็จจริงเกี่ยวกับระบบใดๆ เพียงใช้โมดูล การตั้งค่า ดังที่แสดงในคำสั่งด้านล่าง:

ansible -m setup hostname

ตัวอย่างเช่น:

ansible -m setup database_server

ซึ่งจะพิมพ์ชุดข้อมูลขนาดใหญ่ในรูปแบบ JSON ดังที่แสดง:

ข้อเท็จจริงที่เข้าใจได้มีประโยชน์ในการช่วยให้ผู้ดูแลระบบทราบว่าการดำเนินการใดที่จะดำเนินการ เช่น ขึ้นอยู่กับระบบปฏิบัติการ พวกเขาสามารถทราบได้ว่าต้องติดตั้งแพ็คเกจซอฟต์แวร์ใด และต้องกำหนดค่าอย่างไร เป็นต้น

ข้อเท็จจริงที่กำหนดเอง

คุณรู้หรือไม่ว่าคุณสามารถสร้างข้อเท็จจริงที่คุณกำหนดเองซึ่ง Ansible สามารถรวบรวมได้? ใช่คุณสามารถ. แล้วคุณจะทำยังไงล่ะ? มาดูวิธีการเปลี่ยนเกียร์กันดีกว่า

ขั้นตอนแรกคือการสร้างไดเร็กทอรี /etc/ansible/facts.d บนโหนดที่ได้รับการจัดการหรือโหนดระยะไกล

ภายในไดเร็กทอรีนี้ ให้สร้างไฟล์ที่มีนามสกุล .fact ไฟล์นี้จะส่งคืนข้อมูล JSON เมื่อมีการเรียกใช้ Playbook บนโหนดควบคุม Ansible ซึ่งรวมถึงข้อเท็จจริงอื่นๆ ที่ Ansible ดึงข้อมูลหลังจากการเรียกใช้ Playbook

ต่อไปนี้คือตัวอย่างไฟล์ข้อเท็จจริงที่กำหนดเองชื่อ date_time.fact ซึ่งจะดึงข้อมูลวันที่และเวลา

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

เพิ่มบรรทัดต่อไปนี้ลงไป

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

บันทึกและออกจากไฟล์.

ตอนนี้กำหนดสิทธิ์ดำเนินการ:

chmod +x /etc/ansible/facts.d/date_time.fact

ตอนนี้ ฉันสร้าง Playbook บนโหนดควบคุม Ansible ชื่อ check_date.yml

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

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

ตอนนี้ให้เรียกใช้ playbook และสังเกต Ansible ดึงข้อมูลที่บันทึกไว้ในไฟล์ข้อเท็จจริง:

ansible_playbook check_date.yml

บทสรุป

นี่นำเรามาถึงจุดสิ้นสุดของบทช่วยสอนนี้เกี่ยวกับการทำงานกับตัวแปรและข้อเท็จจริง Ansible