Ansible - ตัวแปร

ตัวแปรใน playbooks คือ very similarเพื่อใช้ตัวแปรในภาษาโปรแกรมใด ๆ ช่วยให้คุณใช้และกำหนดค่าให้กับตัวแปรและใช้ที่ใดก็ได้ใน playbook เราสามารถวางเงื่อนไขรอบ ๆ ค่าของตัวแปรและใช้ตามนั้นใน playbook

ตัวอย่าง

- hosts : <your hosts> 
vars:
tomcat_port : 8080

ในตัวอย่างข้างต้นเราได้กำหนดชื่อตัวแปร tomcat_port และกำหนดค่า 8080 ให้กับตัวแปรนั้นและสามารถใช้ค่านั้นใน playbook ของคุณได้ทุกที่ที่ต้องการ

ตอนนี้กำลังอ้างอิงจากตัวอย่างที่แชร์ รหัสต่อไปนี้มาจากหนึ่งในบทบาท (install-tomcat) -

block: 
   - name: Install Tomcat artifacts 
      action: > 
      yum name = "demo-tomcat-1" state = present 
      register: Output 
          
   always: 
      - debug: 
         msg: 
            - "Install Tomcat artifacts task ended with message: {{Output}}" 
            - "Installed Tomcat artifacts - {{Output.changed}}"

ที่นี่ผลลัพธ์คือตัวแปรที่ใช้

ให้เราดูคำหลักทั้งหมดที่ใช้ในโค้ดด้านบน -

  • block - ไวยากรณ์ Ansible เพื่อดำเนินการบล็อกที่กำหนด

  • name - ชื่อที่เกี่ยวข้องของบล็อก - ใช้ในการบันทึกและช่วยในการดีบักซึ่งบล็อกทั้งหมดถูกดำเนินการสำเร็จ

  • action- โค้ดที่อยู่ถัดจากแท็กการดำเนินการคืองานที่ต้องดำเนินการ การดำเนินการอีกครั้งคือคีย์เวิร์ด Ansible ที่ใช้ใน yaml

  • register - ผลลัพธ์ของการกระทำถูกลงทะเบียนโดยใช้คีย์เวิร์ด register และ Output คือชื่อตัวแปรที่เก็บผลลัพธ์ของการกระทำ

  • always - อีกครั้งคำหลัก Ansible ระบุว่าด้านล่างจะถูกดำเนินการเสมอ

  • msg - แสดงข้อความ

การใช้ตัวแปร - {{Output}}

สิ่งนี้จะอ่านค่าของผลลัพธ์ตัวแปร เช่นเดียวกับที่ใช้ในแท็บ msg มันจะพิมพ์ค่าของตัวแปรเอาต์พุต

นอกจากนี้คุณสามารถใช้คุณสมบัติย่อยของตัวแปรได้เช่นกัน เช่นเดียวกับในกรณีตรวจสอบ {{Output.changed}} ว่าเอาต์พุตมีการเปลี่ยนแปลงหรือไม่และใช้ตามนั้น

การจัดการข้อยกเว้นใน Playbooks

การจัดการข้อยกเว้นใน Ansible คล้ายกับการจัดการข้อยกเว้นในภาษาโปรแกรมใด ๆ ตัวอย่างของการจัดการข้อยกเว้นใน playbook แสดงไว้ด้านล่าง

tasks: 
   - name: Name of the task to be executed 
      block: 
         - debug: msg = 'Just a debug message , relevant for logging' 
         - command: <the command to execute> 
      
      rescue: 
         - debug: msg = 'There was an exception.. ' 
         - command: <Rescue mechanism for the above exception occurred) 
      
      always: 
         - debug: msg = "this will execute in all scenarios. Always will get logged"

ต่อไปนี้เป็นไวยากรณ์สำหรับการจัดการข้อยกเว้น

  • rescue และ always เป็นคำหลักเฉพาะสำหรับการจัดการข้อยกเว้น

  • บล็อกคือที่ที่เขียนโค้ด (สิ่งที่ต้องดำเนินการบนเครื่อง Unix)

  • หากคำสั่งที่เขียนภายในคุณลักษณะบล็อกล้มเหลวการดำเนินการจะไปถึงบล็อกช่วยเหลือและจะถูกดำเนินการ ในกรณีที่ไม่มีข้อผิดพลาดในคำสั่งภายใต้คุณสมบัติบล็อกการช่วยเหลือจะไม่ถูกดำเนินการ

  • Always ถูกดำเนินการในทุกกรณี

  • ดังนั้นถ้าเราเปรียบเทียบสิ่งเดียวกันกับ java มันก็คล้ายกับ try, catch และสุดท้ายบล็อก

  • ที่นี่ Block เหมือนกับ try block ที่คุณเขียนโค้ดที่จะเรียกใช้งานและ rescue เหมือนกับ catch block และ always เหมือนกับ finally.

ลูป

ด้านล่างนี้คือตัวอย่างเพื่อสาธิตการใช้งานลูปใน Ansible

ภารกิจคือการคัดลอกชุดของไฟล์ war ทั้งหมดจากไดเร็กทอรีหนึ่งไปยังโฟลเดอร์ tomcat webapps

คำสั่งส่วนใหญ่ที่ใช้ในตัวอย่างด้านล่างจะครอบคลุมอยู่แล้ว ที่นี่เราจะมุ่งเน้นไปที่การใช้ลูป

เริ่มแรกในคำสั่ง 'เชลล์' เราได้ทำ ls * .war ดังนั้นมันจะแสดงรายการไฟล์สงครามทั้งหมดในไดเรกทอรี

เอาต์พุตของคำสั่งนั้นถูกนำมาใช้ในตัวแปรชื่อเอาต์พุต

ในการวนซ้ำจะมีการใช้ไวยากรณ์ "with_items"

with_items: "{{output.stdout_lines}}" -> output.stdout_lines ทำให้เรามีเอาต์พุตทีละบรรทัดจากนั้นเราวนซ้ำที่เอาต์พุตด้วยคำสั่ง with_items ของ Ansible

การแนบเอาต์พุตตัวอย่างเพียงเพื่อให้เข้าใจว่าเราใช้ stdout_lines ในคำสั่ง with_items อย่างไร

--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
      - name: Install Apache 
      shell: "ls *.war" 
      register: output 
      args: 
         chdir: /opt/ansible/tomcat/demo/webapps 
      
      - file: 
         src: '/opt/ansible/tomcat/demo/webapps/{{ item }}' 
         dest: '/users/demo/vivek/{{ item }}' 
         state: link 
      with_items: "{{output.stdout_lines}}"

บล็อก

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

ตัวอย่างของบล็อกครอบคลุมในการใช้งานตัวแปรการจัดการข้อยกเว้นและลูปด้านบน

เงื่อนไข

Conditionals ถูกใช้เมื่อต้องการรันขั้นตอนเฉพาะตามเงื่อนไข

--- 
#Tsting 
- hosts: all 
   vars: 
      test1: "Hello Vivek" 
   tasks: 
      - name: Testing Ansible variable 
      debug: 
         msg: "Equals" 
         when: test1 == "Hello Vivek"

ในกรณีนี้ Equals จะถูกพิมพ์ออกมาเนื่องจากตัวแปร test1 มีค่าเท่ากันตามที่กล่าวไว้ในเงื่อนไขเมื่อ when สามารถใช้กับตรรกะหรือเงื่อนไขและตรรกะเช่นเดียวกับภาษาโปรแกรมทั้งหมด

เพียงแค่เปลี่ยนค่าของตัวแปร test1 จาก Hello Vivek เป็น Hello World และดูผลลัพธ์