Ansible - คู่มือฉบับย่อ

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

Ansible นั้นง่ายต่อการปรับใช้เนื่องจากไม่ใช้ตัวแทนหรือโครงสร้างพื้นฐานด้านความปลอดภัยที่กำหนดเอง

Ansible ใช้ playbook เพื่ออธิบายงานอัตโนมัติและ playbook ใช้ภาษาที่ง่ายมากเช่น YAML(เป็นภาษาซีเรียลไลเซชันข้อมูลที่มนุษย์อ่านได้และมักใช้สำหรับไฟล์คอนฟิกูเรชัน แต่สามารถใช้ได้ในหลายแอพพลิเคชั่นที่จัดเก็บข้อมูล) ซึ่งง่ายมากสำหรับมนุษย์ที่จะเข้าใจอ่านและเขียน ดังนั้นข้อดีคือแม้แต่ผู้สนับสนุนโครงสร้างพื้นฐานด้านไอทีก็สามารถอ่านและทำความเข้าใจเพลย์บุ๊กและดีบักได้หากจำเป็น (YAML - อยู่ในรูปแบบที่มนุษย์อ่านได้)

Ansible ออกแบบมาสำหรับการปรับใช้หลายชั้น Ansible ไม่ได้จัดการระบบเดียวในแต่ละครั้ง แต่เป็นการจำลองโครงสร้างพื้นฐานไอทีโดยอธิบายว่าระบบทั้งหมดของคุณมีความสัมพันธ์กัน Ansible ไม่มีเอเจนต์อย่างสมบูรณ์ซึ่งหมายความว่า Ansible ทำงานโดยการเชื่อมต่อโหนดของคุณผ่าน ssh (โดยค่าเริ่มต้น) แต่ถ้าคุณต้องการวิธีอื่นในการเชื่อมต่อเช่น Kerberos Ansible จะให้ตัวเลือกนั้นแก่คุณ

หลังจากเชื่อมต่อกับโหนดของคุณ Ansible จะผลักดันโปรแกรมขนาดเล็กที่เรียกว่า“ Ansible Modules” Ansible เรียกใช้โมดูลนั้นบนโหนดของคุณและลบออกเมื่อเสร็จสิ้น Ansible จัดการสินค้าคงคลังของคุณในไฟล์ข้อความธรรมดา (นี่คือไฟล์โฮสต์) Ansible ใช้ไฟล์โฮสต์ซึ่งสามารถจัดกลุ่มโฮสต์และสามารถควบคุมการดำเนินการกับกลุ่มเฉพาะในเพลย์บุ๊ก

ไฟล์โฮสต์ตัวอย่าง

นี่คือเนื้อหาของไฟล์โฮสต์ -

#File name: hosts
#Description: Inventory file for your application. Defines machine type abc
node to deploy specific artifacts
# Defines machine type def node to upload
metadata.

[abc-node]
#server1 ansible_host = <target machine for DU deployment> ansible_user = <Ansible
user> ansible_connection = ssh
server1 ansible_host = <your host name> ansible_user = <your unix user>
ansible_connection = ssh

[def-node]
#server2 ansible_host = <target machine for artifact upload>
ansible_user = <Ansible user> ansible_connection = ssh
server2 ansible_host = <host> ansible_user = <user> ansible_connection = ssh

การจัดการการกำหนดค่าคืออะไร

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

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

คุณสามารถติดตั้ง WebLogic / WebSphere ได้ในครั้งเดียวบนเครื่องทั้งหมดของคุณด้วยหนังสือเล่น Ansible และสินค้าคงคลังที่เขียนขึ้นด้วยวิธีที่ง่ายที่สุด สิ่งที่คุณต้องทำคือแสดงรายการที่อยู่ IP ของโหนดของคุณในสินค้าคงคลังและเขียน playbook เพื่อติดตั้ง WebLogic / WebSphere เรียกใช้ playbook จากเครื่องควบคุมของคุณและจะถูกติดตั้งบนโหนดทั้งหมดของคุณ

Ansible ทำงานอย่างไร

ภาพด้านล่างแสดงการทำงานของ Ansible

Ansible works โดยเชื่อมต่อกับโหนดของคุณและผลักดันโปรแกรมขนาดเล็กที่เรียกว่า "Ansible โมดูล "ให้กับพวกเขา Ansibleจากนั้นเรียกใช้โมดูลเหล่านี้ (ผ่าน SSH โดยค่าเริ่มต้น) และลบออกเมื่อเสร็จสิ้น ไลบรารีโมดูลของคุณสามารถอยู่ในเครื่องใดก็ได้และไม่จำเป็นต้องมีเซิร์ฟเวอร์ daemons หรือฐานข้อมูล

โหนดการจัดการในภาพด้านบนคือโหนดควบคุม (โหนดการจัดการ) ซึ่งควบคุมการทำงานทั้งหมดของเพลย์บุ๊ก เป็นโหนดที่คุณใช้งานการติดตั้ง ไฟล์สินค้าคงคลังจัดเตรียมรายการโฮสต์ที่โมดูล Ansible ต้องรันและโหนดการจัดการทำการเชื่อมต่อ SSH และเรียกใช้โมดูลขนาดเล็กบนเครื่องโฮสต์และติดตั้งผลิตภัณฑ์ / ซอฟต์แวร์

Beauty ของ Ansible คือมันจะลบโมดูลออกเมื่อติดตั้งโมดูลเหล่านั้นได้อย่างมีประสิทธิภาพดังนั้นจึงเชื่อมต่อกับเครื่องโฮสต์ดำเนินการตามคำแนะนำและหากติดตั้งสำเร็จจะลบโค้ดที่คัดลอกบนเครื่องโฮสต์ที่ถูกเรียกใช้

ในบทนี้เราจะเรียนรู้เกี่ยวกับการตั้งค่าสภาพแวดล้อมของ Ansible

ขั้นตอนการติดตั้ง

โดยหลักแล้วมีเครื่องจักรสองประเภทเมื่อเราพูดถึงการปรับใช้ -

  • Control machine - เครื่องที่เราสามารถจัดการเครื่องอื่น ๆ

  • Remote machine - เครื่องจักรที่จัดการ / ควบคุมโดยเครื่องควบคุม

อาจมีเครื่องระยะไกลหลายเครื่องที่จัดการโดยเครื่องควบคุมเครื่องเดียว ดังนั้นสำหรับการจัดการเครื่องระยะไกลเราต้องติดตั้ง Ansible บนเครื่องควบคุม

ข้อกำหนดของเครื่องควบคุม

Ansible สามารถเรียกใช้จากเครื่องใดก็ได้ที่ติดตั้ง Python 2 (เวอร์ชัน 2.6 หรือ 2.7) หรือ Python 3 (เวอร์ชัน 3.5 ขึ้นไป)

Note - Windows ไม่รองรับเครื่องควบคุม

โดยค่าเริ่มต้น Ansible จะใช้ ssh เพื่อจัดการเครื่องระยะไกล

Ansible ไม่ได้เพิ่มฐานข้อมูลใด ๆ ไม่จำเป็นต้องมี daemons ใด ๆ เพื่อเริ่มต้นหรือให้มันทำงานต่อไป ในขณะที่จัดการเครื่องระยะไกล Ansibledoes notปล่อยให้ซอฟต์แวร์ใด ๆ ติดตั้งหรือทำงานอยู่ ดังนั้นจึงไม่มีคำถามเกี่ยวกับวิธีการอัปเกรดเมื่อย้ายไปยังเวอร์ชันใหม่

สามารถติดตั้ง Ansible บนเครื่องควบคุมที่มีข้อกำหนดดังกล่าวข้างต้นได้หลายวิธี คุณสามารถติดตั้งรุ่นล่าสุดผ่าน Apt, yum, pkg, pip, OpenCSW, pacman และอื่น ๆ

การติดตั้งผ่าน Apt บนเครื่อง Ubuntu

สำหรับการติดตั้ง Ansible คุณต้องกำหนดค่า PPA บนเครื่องของคุณ สำหรับสิ่งนี้คุณต้องเรียกใช้โค้ดบรรทัดต่อไปนี้ -

$ sudo apt-get update $ sudo apt-get install software-properties-common 
$ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update 
$ sudo apt-get install ansible

หลังจากเรียกใช้โค้ดด้านบนคุณก็พร้อมที่จะจัดการเครื่องระยะไกลผ่าน Ansible เพียงแค่เรียกใช้ Ansible – version เพื่อตรวจสอบเวอร์ชันและเพียงเพื่อตรวจสอบว่า Ansible ได้รับการติดตั้งอย่างถูกต้องหรือไม่

Ansible ใช้ไวยากรณ์ YAML สำหรับการแสดง Ansible playbooks บทนี้ให้ภาพรวมของ YAML Ansible ใช้ YAML เพราะมนุษย์เข้าใจอ่านและเขียนได้ง่ายมากเมื่อเทียบกับรูปแบบข้อมูลอื่น ๆ เช่น XML และ JSON

ทุก YAML ไฟล์อาจเริ่มต้นด้วย“ ---” และลงท้ายด้วย“ ... ”

ทำความเข้าใจกับ YAML

ในส่วนนี้เราจะเรียนรู้วิธีต่างๆในการแสดงข้อมูล YAML

คู่คีย์ - ค่า

YAML ใช้คู่คีย์ - ค่าอย่างง่ายเพื่อแสดงข้อมูล พจนานุกรมจะแสดงในคู่คีย์: ค่า

Note - ควรมีช่องว่างระหว่าง: และค่า

ตัวอย่าง: บันทึกของนักเรียน

--- #Optional YAML start syntax 
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
… #Optional YAML end syntax

ตัวย่อ

คุณยังสามารถใช้ตัวย่อเพื่อแสดงถึงพจนานุกรม

ตัวอย่าง

James: {name: james john, rollNo: 34, div: B, sex: male}

รายชื่อตัวแทน

นอกจากนี้เรายังสามารถแสดงรายการใน YAML ทุกองค์ประกอบ (สมาชิก) ของรายการควรเขียนในบรรทัดใหม่โดยมีการเยื้องเดียวกันโดยเริ่มต้นด้วย“ -“ (- และช่องว่าง)

ตัวอย่าง

---
countries:  
   - America 
   - China 
   - Canada 
   - Iceland 
…

ตัวย่อ

คุณยังสามารถใช้ตัวย่อเพื่อแสดงรายการ

ตัวอย่าง

Countries: [‘America’, ‘China’, ‘Canada’, ‘Iceland’]

รายชื่อภายใน Dictionaries

เราสามารถใช้ list ใน dictionaries คือ value ของ key คือ list

ตัวอย่าง

---  
james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
…

รายชื่อพจนานุกรม

นอกจากนี้เรายังสามารถสร้างรายการพจนานุกรม

ตัวอย่าง

---  
- james: 
   name: james john 
   rollNo: 34 
      div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 

- robert: 
      name: robert richardson 
      rollNo: 53 
      div: B 
      sex: male 
   likes: 
      - biology 
      - chemistry 
…

YAML ใช้“ |” เพื่อรวมบรรทัดใหม่ในขณะที่แสดงหลายบรรทัดและ“>” เพื่อไม่ให้ขึ้นบรรทัดใหม่ในขณะที่แสดงหลายบรรทัด ด้วยเหตุนี้เราจึงสามารถอ่านและแก้ไขบรรทัดขนาดใหญ่ได้ ในทั้งสองกรณีความตั้งใจจะถูกละเว้น

เรายังสามารถเป็นตัวแทน Booleanค่า (จริง / เท็จ) ใน YAML ที่ไหนboolean ค่าอาจไม่คำนึงถึงขนาดตัวพิมพ์

ตัวอย่าง

---  
- james: 
   name: james john 
   rollNo: 34 
   div: B 
   sex: male 
   likes: 
      - maths 
      - physics 
      - english 
   
   result: 
      maths: 87 
      chemistry: 45 
      biology: 56 
      physics: 70 
      english: 80 
   
   passed: TRUE 
   
   messageIncludeNewLines: | 
      Congratulation!! 
      You passed with 79% 
   
   messageExcludeNewLines: > 
      Congratulation!! 
      You passed with 79%

คำทั่วไปบางคำที่เกี่ยวข้องกับ Ansible

Service/Server - กระบวนการบนเครื่องที่ให้บริการ

Machine - เซิร์ฟเวอร์จริง vm (เครื่องเสมือน) หรือคอนเทนเนอร์

Target machine - เครื่องที่เรากำลังจะกำหนดค่าด้วย Ansible

Task - การดำเนินการ (เรียกใช้สิ่งนี้ลบสิ่งนั้น) ฯลฯ ที่จัดการโดย Ansible

Playbook - ไฟล์ yml ที่เขียนคำสั่ง Ansible และ yml ถูกเรียกใช้งานบนเครื่อง

คำสั่ง Ad hoc คือคำสั่งที่สามารถเรียกใช้ทีละคำสั่งเพื่อทำหน้าที่อย่างรวดเร็ว คำสั่งเหล่านี้ไม่จำเป็นต้องดำเนินการในภายหลัง

ตัวอย่างเช่นคุณต้องรีบูตเซิร์ฟเวอร์ของ บริษัท ทั้งหมด สำหรับสิ่งนี้คุณจะเรียกใช้คำสั่ง Adhoc จาก '/usr/bin/ansible'.

คำสั่งเฉพาะกิจเหล่านี้ไม่ได้ใช้สำหรับการจัดการคอนฟิกูเรชันและการปรับใช้เนื่องจากคำสั่งเหล่านี้ใช้ครั้งเดียว

ansible-playbook ใช้สำหรับการจัดการการกำหนดค่าและการปรับใช้

คำสั่ง Parallelism และ Shell

รีบูตเซิร์ฟเวอร์ บริษัท ของคุณโดยใช้ส้อมแบบขนาน 12 ครั้ง สำหรับสิ่งนี้เราจำเป็นต้องตั้งค่า SSHagent สำหรับการเชื่อมต่อ

$ ssh-agent bash 
$ ssh-add ~/.ssh/id_rsa

ในการเรียกใช้การรีบูตสำหรับเซิร์ฟเวอร์ของ บริษัท ทั้งหมดในกลุ่ม 'abc' ใน 12 ส้อมคู่ขนาน -

$ Ansible abc -a "/sbin/reboot" -f 12

ตามค่าเริ่มต้น Ansible จะเรียกใช้คำสั่ง Ad-hoc ข้างต้นจากบัญชีผู้ใช้ปัจจุบัน หากคุณต้องการเปลี่ยนพฤติกรรมนี้คุณจะต้องส่งชื่อผู้ใช้ในคำสั่ง Ad-hoc ดังนี้ -

$ Ansible abc -a "/sbin/reboot" -f 12 -u username

การถ่ายโอนไฟล์

คุณสามารถใช้คำสั่ง Ad-hoc ในการทำ SCP (Secure Copy Protocol) ไฟล์จำนวนมากพร้อมกันบนเครื่องหลายเครื่อง

การถ่ายโอนไฟล์ไปยังเซิร์ฟเวอร์ / เครื่องจำนวนมาก

$ Ansible abc -m copy -a "src = /etc/yum.conf dest = /tmp/yum.conf"

การสร้างไดเร็กทอรีใหม่

$ Ansible abc -m file -a "dest = /path/user1/new mode = 777 owner = user1 group = user1 state = directory"

การลบไดเร็กทอรีและไฟล์ทั้งหมด

$ Ansible abc -m file -a "dest = /path/user1/new state = absent"

การจัดการแพ็คเกจ

คำสั่ง Ad-hoc มีให้สำหรับยำและถนัด ต่อไปนี้เป็นคำสั่ง Ad-hoc โดยใช้ yum

คำสั่งต่อไปนี้ตรวจสอบว่า yum package ติดตั้งอยู่หรือไม่ แต่ไม่อัพเดต

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = present"

คำสั่งต่อไปนี้ตรวจสอบไม่ได้ติดตั้งแพ็คเกจ

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = absent"

คำสั่งต่อไปนี้ตรวจสอบว่ามีการติดตั้งแพ็กเกจเวอร์ชันล่าสุด

$ Ansible abc -m yum -a "name = demo-tomcat-1 state = latest"

การรวบรวมข้อเท็จจริง

สามารถใช้ข้อเท็จจริงสำหรับการใช้คำสั่งเงื่อนไขใน Playbook คุณสามารถค้นหาข้อมูลเฉพาะกิจของข้อเท็จจริงทั้งหมดของคุณผ่านคำสั่ง Ad-hoc ต่อไปนี้ -

$ Ansible all -m setup

ในบทนี้เราจะเรียนรู้เกี่ยวกับ Playbooks ใน Ansible

Playbooks คือไฟล์ที่เขียนโค้ด Ansible Playbooks เขียนในรูปแบบ YAML YAML ย่อมาจาก Yet Another Markup LanguagePlaybooksเป็นหนึ่งในคุณสมบัติหลักของ Ansible และบอก Ansible ว่าจะดำเนินการอะไร เป็นเหมือนรายการสิ่งที่ต้องทำสำหรับ Ansible ที่มีรายการงาน

Playbooks มีขั้นตอนที่ผู้ใช้ต้องการดำเนินการบนเครื่องใดเครื่องหนึ่ง Playbooks จะทำงานตามลำดับ Playbooks เป็นส่วนประกอบสำคัญสำหรับทุกกรณีการใช้งานของ Ansible

โครงสร้าง Playbook

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

หน้าที่ของการเล่นคือการจับคู่ชุดคำสั่งที่กำหนดไว้กับโฮสต์เฉพาะ

YAML เป็นภาษาพิมพ์ที่เข้มงวด ดังนั้นจึงต้องใช้ความระมัดระวังเป็นพิเศษในขณะที่เขียนไฟล์ YAML มีโปรแกรมแก้ไข YAML ที่แตกต่างกัน แต่เราต้องการใช้โปรแกรมแก้ไขแบบธรรมดาเช่น notepad ++ เพียงแค่เปิด notepad ++ แล้วคัดลอกและวาง yaml ด้านล่างแล้วเปลี่ยนภาษาเป็น YAML (Language → YAML)

YAML เริ่มต้นด้วย --- (ขีดกลาง 3 ตัว)

สร้าง Playbook

เริ่มต้นด้วยการเขียนไฟล์ YAML ตัวอย่าง เราจะดูแต่ละส่วนที่เขียนในไฟล์ yaml

--- 
   name: install and configure DB
   hosts: testServer
   become: yes

   vars: 
      oracle_db_port_value : 1521
   
   tasks:
   -name: Install the Oracle DB
      yum: <code to install the DB>
    
   -name: Ensure the installed service is enabled and running
   service:
      name: <your service name>

ด้านบนเป็น Playbook ตัวอย่างที่เราพยายามจะครอบคลุมไวยากรณ์พื้นฐานของ playbook บันทึกเนื้อหาข้างต้นเป็นไฟล์test.yml. ไวยากรณ์ของ YAML ต้องเป็นไปตามการเยื้องที่ถูกต้องและต้องระมัดระวังเล็กน้อยในขณะที่เขียนไวยากรณ์

แท็ก YAML ที่แตกต่างกัน

ให้เราดูแท็ก YAML ที่แตกต่างกัน แท็กต่างๆอธิบายไว้ด้านล่าง -

ชื่อ

แท็กนี้ระบุชื่อของ Ansible playbook ในสิ่งที่ Playbook นี้จะทำ สามารถตั้งชื่อเชิงตรรกะให้กับ playbook ได้

เจ้าภาพ

แท็กนี้ระบุรายการโฮสต์หรือกลุ่มโฮสต์ที่เราต้องการรันงาน ฟิลด์ / แท็กโฮสต์มีผลบังคับ มันบอก Ansible ว่าโฮสต์ใดที่จะรันงานในรายการ สามารถรันงานบนเครื่องเดียวกันหรือบนเครื่องระยะไกลได้ หนึ่งสามารถรันงานบนเครื่องหลายเครื่องและด้วยเหตุนี้แท็กโฮสต์สามารถมีกลุ่มของรายการโฮสต์ได้เช่นกัน

vars

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

งาน

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

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

ใน Ansible บทบาทนี้เป็นกลไกหลักในการแบ่ง playbook เป็นไฟล์หลาย ๆ ไฟล์ ช่วยให้การเขียนง่ายขึ้นcomplex playbooksและทำให้นำกลับมาใช้ใหม่ได้ง่ายขึ้น การทำลาย Playbook ช่วยให้คุณสามารถแบ่ง Playbook ออกเป็นส่วนประกอบที่ใช้ซ้ำได้อย่างมีเหตุผล

โดยพื้นฐานแล้วแต่ละบทบาทจะถูก จำกัด ไว้ที่ฟังก์ชันเฉพาะหรือเอาต์พุตที่ต้องการโดยมีขั้นตอนที่จำเป็นทั้งหมดเพื่อให้ผลลัพธ์นั้นไม่ว่าจะภายในบทบาทนั้นเองหรือในบทบาทอื่น ๆ

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

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

การสร้างบทบาทใหม่

โครงสร้างไดเร็กทอรีสำหรับบทบาทเป็นสิ่งสำคัญในการสร้างบทบาทใหม่

โครงสร้างบทบาท

บทบาทมีโครงร่างโครงสร้างบนระบบไฟล์ โครงสร้างเริ่มต้นสามารถเปลี่ยนแปลงได้ แต่ตอนนี้ให้เรายึดติดกับค่าเริ่มต้น

แต่ละบทบาทเป็นแผนผังไดเร็กทอรีในตัวเอง ชื่อบทบาทคือชื่อไดเร็กทอรีภายในไดเร็กทอรี / role

$ ansible-galaxy -h

การใช้งาน

ansible-galaxy [delete|import|info|init|install|list|login|remove|search|setup] [--help] [options] ...

ตัวเลือก

  • -h, --help - แสดงข้อความช่วยเหลือนี้และออก

  • -v, --verbose - โหมด Verbose (-vvv สำหรับข้อมูลเพิ่มเติม -vvvv เพื่อเปิดใช้งานการดีบักการเชื่อมต่อ)

  • --version - แสดงหมายเลขเวอร์ชันของโปรแกรมและออก

การสร้าง Role Directory

คำสั่งดังกล่าวได้สร้างไดเรกทอรีบทบาท

$ ansible-galaxy init vivekrole 
ERROR! The API server (https://galaxy.ansible.com/api/) is not responding, please try again later. 

$ ansible-galaxy init --force --offline vivekrole - vivekrole was created successfully $ tree vivekrole/ 
vivekrole/ 
├── defaults 
│   └── main.yml 
├── files ├── handlers 
│   └── main.yml 
├── meta 
│   └── main.yml 
├── README.md ├── tasks 
│   └── main.yml 
├── templates ├── tests │   ├── inventory 
│   └── test.yml 
└── vars 
    └── main.yml 
 
8 directories, 8 files

ตัวอย่างจะไม่ใช้ไดเร็กทอรีทั้งหมดและเราจะแสดงการใช้บางไดเร็กทอรีในตัวอย่าง

การใช้บทบาทใน Playbook

นี่คือรหัสของ playbook ที่เราเขียนขึ้นเพื่อการสาธิต รหัสนี้มาจาก playbook vivek_orchestrate.yml เราได้กำหนดโฮสต์:tomcat-node และเรียกสองบทบาทว่า - install-tomcat และ start-tomcat.

คำชี้แจงปัญหาคือเรามีสงครามซึ่งเราต้องปรับใช้บนเครื่องผ่าน Ansible

--- 
- hosts: tomcat-node 
roles: 
   - {role: install-tomcat} 
   - {role: start-tomcat}

เนื้อหาของโครงสร้างไดเร็กทอรีของเราจากที่ที่เราใช้งาน playbook

$ ls 
ansible.cfg  hosts  roles  vivek_orchestrate.retry vivek_orchestrate.yml

มีไดเร็กทอรีงานภายใต้แต่ละไดเร็กทอรีและมี main.yml เนื้อหา main.yml ของ install-tomcat คือ -

--- 
#Install vivek artifacts 
-  
   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}}"

เนื้อหาของ main.yml ของ start tomcat คือ -

#Start Tomcat          
-  
   block: 
      - name: Start Tomcat 
      command: <path of tomcat>/bin/startup.sh" 
      register: output 
      become: true 
   
   always: 
      - debug: 
         msg: 
            - "Start Tomcat task ended with message: {{output}}" 
            - "Tomcat started - {{output.changed}}"

ข้อดีของการแบ่ง playbook ออกเป็นบทบาทคือทุกคนที่ต้องการใช้คุณลักษณะ Install tomcat สามารถเรียกใช้บทบาท Install Tomcat ได้

ทำลาย Playbook ให้เป็นบทบาท

หากไม่ใช่สำหรับบทบาทเนื้อหาของ main.yml ของบทบาทที่เกี่ยวข้องสามารถคัดลอกได้ใน playbook ymlไฟล์. แต่เพื่อให้มีความเป็นโมดูลาร์บทบาทจึงถูกสร้างขึ้น

เอนทิตีตรรกะใด ๆ ที่สามารถใช้ซ้ำเป็นฟังก์ชันที่ใช้ซ้ำได้เอนทิตีนั้นสามารถย้ายไปยังบทบาทได้ ตัวอย่างนี้แสดงไว้ด้านบน

รันคำสั่งเพื่อเรียกใช้ playbook

-vvv option for verbose output – verbose output 
$ cd vivek-playbook/

นี่คือคำสั่งเพื่อเรียกใช้ playbook

$ sudo ansible-playbook -i hosts vivek_orchestrate.yml –vvv 
-----------------------------------------------------------------
-----------------------------------------------------------------------

เอาต์พุต

ผลลัพธ์ที่สร้างขึ้นจะเป็นดังที่เห็นบนหน้าจอ -

การใช้ /users/demo/vivek-playbook/ansible.cfg เป็นไฟล์ config

PLAYBOOK: vivek_orchestrate.yml *********************************************************
*********************************************************** 
1 plays in vivek_orchestrate.yml 

PLAY [tomcat-node] **********************************************************************
******** ************************************************* 
 
TASK [Gathering Facts] *************************************************
****************************** ********************************************* 
Tuesday 21 November 2017  13:02:05 +0530 (0:00:00.056) 0:00:00.056 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/system/setup.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249525.88-259535494116870 `" && 
   echo ansible-tmp-1511249525.88-259535494116870="` 
   echo /root/.ansible/tmp/ansibletmp-1511249525.88-259535494116870 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpPEPrkd TO 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/ 
   /root/.ansible/tmp/ansible-tmp-1511249525.88259535494116870/setup.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/setup.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249525.88-259535494116870/" > /dev/null 2>&1 && sleep 0' 
ok: [server1] 
META: ran handlers 
 
TASK [install-tomcat : Install Tomcat artifacts] ***********************************
*************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:07 +0530 (0:00:01.515)       0:00:01.572 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/packaging/os/yum.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249527.34-40247177825302 `" && echo 
   ansibletmp-1511249527.34-40247177825302="` echo 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302 `" ) && sleep 0' 
<localhost> PUT /tmp/tmpu83chg TO 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/ 
   /root/.ansible/tmp/ansible-tmp-1511249527.3440247177825302/yum.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/yum.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249527.34-40247177825302/" > /dev/null 2>
   &1 && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "invocation": { 
      "module_args": { 
         "conf_file": null, 
         "disable_gpg_check": false, 
         "disablerepo": null, 
         "enablerepo": null, 
         "exclude": null, 
         "install_repoquery": true, 
         "installroot": "/", 
         "list": null, 
         "name": ["demo-tomcat-1"], 
         "skip_broken": false, 
         "state": "present", 
         "update_cache": false, 
         "validate_certs": true 
      } 
   }, 
   "msg": "", 
   "rc": 0, 
   "results": [ 
      "Loaded plugins: product-id, 
      search-disabled-repos, 
      subscriptionmanager\nThis system is not registered to Red Hat Subscription Management. 
      You can use subscription-manager to register.\nResolving Dependencies\n--> 
      Running transaction check\n---> 
      Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\n--> Finished Dependency 
      Resolution\n\nDependencies Resolved\n
      \n================================================================================\n 
      Package Arch Version Repository         
      Size\n==================================================================\nInstalling:\n 
      demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\n\nTransaction 
      Summary\n==================================================================\nInstall  1 
      Package\n\nTotal download size: 7.1 M\nInstalled size: 7.9 M\nDownloading 
         packages:\nRunning transaction 
      check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n  Installing : 
      demotomcat-1-SNAPSHOT-1.noarch 1/1 \n  Verifying  : 
      demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \n\nInstalled:\n  
      demo-tomcat-1.noarch 0:SNAPSHOT-1 \n\nComplete!\n" 
   ] 
} 
 
TASK [install-tomcat : debug] **********************************************************
*************************************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:06.757) 0:00:08.329 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Install Tomcat artifacts task ended with message: {
         u'msg': u'', u'changed': True, u'results': 
         [u'Loaded plugins: product-id, 
         search-disabledrepos, 
         subscription-manager\\nThis system is not registered to Red Hat Subscription Management. 
         You can use subscription-manager to register.\\nResolving Dependencies\\n--> 
         Running transaction check\\n---> 
         Package demo-tomcat-1.noarch 0:SNAPSHOT-1 will be installed\\n--> 
         Finished Dependency Resolution\\n
         \\nDependencies 
         Resolved\\n\\n==================================================================\\n 
         Package Arch Version Repository         
         Size\\n======================================================================== 
         =====\\nInstalling:\\n demo-tomcat-1 noarch SNAPSHOT-1 demo-repo1 7.1 M\\n\\nTransaction 
         Summary\\n=========================================================\\nInstall  1 
         Package\\n\\nTotal download size: 7.1 M\\nInstalled size: 7.9 M\\nDownloading 
            packages:\\nRunning 
         transaction check\\nRunning transaction test\\nTransaction test succeeded\\nRunning 
            transaction\\n  
         Installing : demo-tomcat-1-SNAPSHOT-1.noarch 1/1 \\n  Verifying  : 
         demo-tomcat-1-SNAPSHOT-1.noarch
         1/1 \\n\\nInstalled:\\n  demo-tomcat-1.noarch 0:SNAPSHOT-1  \\n\\nComplete!\\n'], u'rc': 0
      }", 
      "Installed Tomcat artifacts - True" 
   ] 
} 
 
TASK [install-tomcat : Clean DEMO environment] ****************************************
************************************************************ 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 
Tuesday 21 November 2017  13:02:13 +0530 (0:00:00.057) 0:00:08.387 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/files/file.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.13-128345805983963 `" && echo 
   ansible-tmp-1511249534.13-128345805983963="` echo 
   /root/.ansible/tmp/ansibletmp-1511249534.13-128345805983963 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp0aXel7 TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.13128345805983963/file.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/file.py; rm -rf 
   "/root/.ansible/tmp/ansible-tmp1511249534.13-128345805983963/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
      "diff": { 
         "after": { 
            "path": "/users/demo/DEMO", 
            "state": "absent" 
      }, 
      "before": { 
         "path": "/users/demo/DEMO", 
         "state": "directory" 
      } 
   },

   "invocation": { 
      "module_args": { 
         "attributes": null, 
         "backup": null, 
         "content": null, 
         "delimiter": null, 
         "diff_peek": null, 
         "directory_mode": null, 
         "follow": false, 
         "force": false, 
         "group": null, 
         "mode": null, 
         "original_basename": null, 
         "owner": null, 
         "path": "/users/demo/DEMO", 
         "recurse": false, 
         "regexp": null, 
         "remote_src": null, 
         "selevel": null, 
         "serole": null, 
         "setype": null, 
         "seuser": null, 
         "src": null, 
         "state": "absent", 
         "unsafe_writes": null, 
         "validate": null 
      } 
   }, 
   "path": "/users/demo/DEMO", 
   "state": "absent" 
} 
 
TASK [install-tomcat : debug] ********************************************************
************************************************************* 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.257)       0:00:08.645 ****** 
ok: [server1] => {
   "changed": false, 
   "msg": [ 
      "Clean DEMO environment task ended with message:{u'diff': {u'after': {u'path': 
         u'/users/demo/DEMO', u'state': u'absent'}, 
      u'before': {u'path': u'/users/demo/DEMO', u'state': u'directory'}}, u'state': u'absent', 
         u'changed': True, u'path': u'/users/demo/DEMO'}", 
      "check value  :True" 
   ] 
} 
 
TASK [install-tomcat : Copy Tomcat to user home] *************************************
******************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.055)       0:00:08.701 ****** 
[WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or 
   {% %}. Found: {{installationOutput.changed}} 
 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.43-41077200718443 `" && echo 
   ansibletmp-1511249534.43-41077200718443="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp25deWs TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.4341077200718443/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.43-41077200718443/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.43-41077200718443/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ 
      "cp", 
      "-r", 
      "/opt/ansible/tomcat/demo", 
      "/users/demo/DEMO/" 
   ],
   "delta": "0:00:00.017923", 
   "end": "2017-11-21 13:02:14.547633", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "cp -r /opt/ansible/tomcat/demo /users/demo/DEMO/", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.529710", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "", 
   "stdout_lines": [] 
} 
 
TASK [install-tomcat : debug] ********************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.260)       0:00:08.961 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": "Copy Tomcat to user home task ended with message {
      'stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.547633', u'stdout': 
      u'', u'cmd': [u'cp', u'-r', u'/opt/ansible/tomcat/demo', u'/users/demo/DEMO/'], u'rc': 0, 
      u'start': u'2017-11-21 13:02:14.529710', u'stderr': u'', u'delta': u'0:00:00.017923', 
      'stdout_lines': []}" 
} 
 
TASK [start-tomcat : Start Tomcat] **************************************************
********************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.044)       0:00:09.006 ****** 
Using module file /usr/lib/python2.7/sitepackages/ansible/modules/commands/command.py 
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root 
<localhost> EXEC /bin/sh -c 'echo ~ && sleep 0' 
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo 
   /root/.ansible/tmp/ansible-tmp-1511249534.63-46501211251197 `" && echo 
   ansibletmp-1511249534.63-46501211251197="` echo 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197 `" ) && sleep 0' 
<localhost> PUT /tmp/tmp9f06MQ TO 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py 
<localhost> EXEC /bin/sh -c 'chmod u+x 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/ 
   /root/.ansible/tmp/ansible-tmp-1511249534.6346501211251197/command.py && sleep 0' 
<localhost> EXEC /bin/sh -c '/usr/bin/python 
   /root/.ansible/tmp/ansible-tmp1511249534.63-46501211251197/command.py; rm -rf 
   "/root/.ansible/tmp/ansibletmp-1511249534.63-46501211251197/" > /dev/null 2>&1 
   && sleep 0' 
changed: [server1] => { 
   "changed": true, 
   "cmd": [ "/users/demo/DEMO/bin/startup.sh" ], 
   "delta": "0:00:00.020024", 
   "end": "2017-11-21 13:02:14.741649", 
   "invocation": { 
      "module_args": { 
         "_raw_params": "/users/demo/DEMO/bin/startup.sh", 
         "_uses_shell": false, 
         "chdir": null, 
         "creates": null, 
         "executable": null, 
         "removes": null, 
         "warn": true 
      } 
   }, 
   "rc": 0, 
   "start": "2017-11-21 13:02:14.721625", 
   "stderr": "", 
   "stderr_lines": [], 
   "stdout": "Tomcat started.", 
   "stdout_lines": [ "Tomcat started." ] 
} 
 
TASK [start-tomcat : debug] *************************************************
********************************************************************** 
task path: /users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.150)       0:00:09.156 ****** 
ok: [server1] => { 
   "changed": false, 
   "msg": [ 
      "Start Tomcat task ended with message: {'
         stderr_lines': [], u'changed': True, u'end': u'2017-11-21 13:02:14.741649', u'stdout': 
         u'Tomcat started.', u'cmd': [u'/users/demo/DEMO/bin/startup.sh'], u'rc': 0, u'start': 
         u'2017-11-21 13:02:14.721625', u'stderr': u'', u'delta': u'0:00:00.020024', 
         'stdout_lines': [u'Tomcat started.']}", 
      "Tomcat started - True" 
   ] 
} 
META: ran handlers 
META: ran handlers 
 
PLAY RECAP ******************************************************************************* 
********************************************************* 
server1  : ok = 9    changed = 4    unreachable = 0    failed = 0 
 
Tuesday 21 November 2017  13:02:14 +0530 (0:00:00.042)       0:00:09.198 ****** 
=============================================================================== 
install-tomcat : Install Tomcat artifacts ------------------------------- 6.76s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:5 -------------- 
Gathering Facts --------------------------------------------------------- 1.52s 
 ------------------------------------------------------------------------------ 
install-tomcat : Copy Tomcat to user home ------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:37 ------------- 

install-tomcat : Clean DEMO environment --------------------------------- 0.26s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:19 ------------- 

start-tomcat : Start Tomcat --------------------------------------------- 0.15s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:5 ----------------

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:11 ------------- 

install-tomcat : debug -------------------------------------------------- 0.06s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:29 ------------- 

install-tomcat : debug -------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/install-tomcat/tasks/main.yml:47 ------------- 

start-tomcat : debug ---------------------------------------------------- 0.04s 
/users/demo/vivek-playbook/roles/start-tomcat/tasks/main.yml:10 ---------------

กด URL ต่อไปนี้และคุณจะถูกนำไปยังหน้าที่แสดงด้านล่าง - http://10.76.0.134:11677/HelloWorld/HelloWorld

สงครามที่นำไปใช้งานมีเพียง servlet ที่แสดงคำว่า“ Hello World” ผลลัพธ์โดยละเอียดจะแสดงเวลาที่ดำเนินการโดยแต่ละงานเนื่องจากรายการที่เพิ่มในไฟล์ ansible.cfg -

[defaults] 
callback_whitelist = profile_tasks

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

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

เงื่อนไข

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

--- 
#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 และดูผลลัพธ์

ในบทนี้เราจะเรียนรู้ว่าอะไรคือการดำเนินการขั้นสูงด้วย Ansible

วิธี จำกัด การดำเนินการตาม Tasks

นี่เป็นกลยุทธ์การดำเนินการที่สำคัญมากโดยที่เราต้องดำเนินการเพียงครั้งเดียวไม่ใช่ทั้งเพลย์บุ๊ก For exampleสมมติว่าคุณต้องการหยุดเซิร์ฟเวอร์เท่านั้น (ในกรณีที่มีปัญหาในการผลิต) จากนั้นโพสต์การใช้โปรแกรมแก้ไขที่คุณต้องการเริ่มต้นเซิร์ฟเวอร์เท่านั้น

ที่นี่ใน playbook ดั้งเดิมหยุดและเริ่มเป็นส่วนหนึ่งของบทบาทที่แตกต่างกันใน playbook เดียวกัน แต่สามารถจัดการได้ด้วยการใช้แท็ก เราสามารถจัดเตรียมแท็กที่แตกต่างกันให้กับบทบาทที่แตกต่างกัน (ซึ่งจะมีงาน) และด้วยเหตุนี้จึงขึ้นอยู่กับแท็กที่มีให้โดยผู้ดำเนินการเท่านั้นที่จะดำเนินการตามบทบาท / งาน ดังนั้นสำหรับตัวอย่างข้างต้นเราสามารถเพิ่มแท็กดังต่อไปนี้ -

- {role: start-tomcat, tags: ['install']}}

คำสั่งต่อไปนี้ช่วยในการใช้แท็ก -

ansible-playbook -i hosts <your yaml> --tags "install" -vvv

ด้วยคำสั่งดังกล่าวจะเรียกเฉพาะบทบาท start-tomcat เท่านั้น แท็กที่ระบุเป็นกรณี ๆ ไป ตรวจสอบว่ามีการส่งการจับคู่แบบตรงทั้งหมดไปยังคำสั่ง

วิธี จำกัด การดำเนินการโดยโฮสต์

มีสองวิธีในการดำเนินการตามขั้นตอนเฉพาะบนโฮสต์เฉพาะ สำหรับบทบาทเฉพาะหนึ่งจะกำหนดโฮสต์ - ว่าโฮสต์เฉพาะใดที่ควรรันบทบาทเฉพาะ

ตัวอย่าง

- hosts: <A> 
   environment: "{{your env}}" 
   pre_tasks: 
      - debug: msg = "Started deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
     
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed deployment. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}" 
 
- hosts: <B> 
   pre_tasks: 
      - debug: msg = "started.... 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}} " 
        
   roles: 
      - {role: <your role>, tags: ['<respective tag>']} 
   post_tasks: 
      - debug: msg = "Completed the task.. 
      Current time is {{ansible_date_time.date}} {{ansible_date_time.time}}"

ตามตัวอย่างข้างต้นขึ้นอยู่กับโฮสต์ที่ให้มาจะมีการเรียกบทบาทตามลำดับเท่านั้น ตอนนี้โฮสต์ A และ B ของฉันถูกกำหนดไว้ในโฮสต์ (ไฟล์สินค้าคงคลัง)

โซลูชันทางเลือก

วิธีแก้ปัญหาอื่นอาจกำหนดโฮสต์ของ playbook โดยใช้ตัวแปรจากนั้นส่งผ่านโฮสต์แอดเดรสเฉพาะผ่าน --extra-vars -

# file: user.yml  (playbook) 
--- 
- hosts: '{{ target }}' 
   user: ... 
playbook contd….

ใช้งาน Playbook

ansible-playbook user.yml --extra-vars "target = "<your host variable>"

หากไม่ได้กำหนด {{target}} Playbook จะไม่ทำอะไรเลย กลุ่มจากไฟล์โฮสต์สามารถส่งผ่านได้หากต้องการ สิ่งนี้ไม่เป็นอันตรายหากไม่ได้ระบุตัวแปรพิเศษไว้

Playbook กำหนดเป้าหมายไปที่โฮสต์เดียว

$ ansible-playbook user.yml --extra-vars "target = <your hosts variable>" --listhosts

กลยุทธ์ที่พบบ่อยที่สุดสำหรับการดีบัก Ansible playbook คือการใช้โมดูลที่ระบุด้านล่าง -

แก้ไขข้อบกพร่องและลงทะเบียน

สองโมดูลนี้เป็นโมดูลที่มีอยู่ใน Ansible เพื่อวัตถุประสงค์ในการดีบักเราจำเป็นต้องใช้ทั้งสองโมดูลอย่างรอบคอบ ตัวอย่างแสดงด้านล่าง

ใช้ Verbosity

ด้วยคำสั่ง Ansible เราสามารถระบุระดับความละเอียดได้ คุณสามารถรันคำสั่งด้วย verbosity ระดับหนึ่ง (-v) หรือสอง (-vv)

จุดสำคัญ

ในส่วนนี้เราจะดูตัวอย่างเพื่อทำความเข้าใจแนวคิดบางส่วน

หากคุณไม่ได้อ้างถึงอาร์กิวเมนต์ที่ขึ้นต้นด้วยตัวแปร ตัวอย่างเช่น,

vars: 
   age_path: {{vivek.name}}/demo/ 
   
{{vivek.name}}

สิ่งนี้จะทำให้เกิดข้อผิดพลาด

วิธีการแก้

vars: 
   age_path: "{{vivek.name}}/demo/" – marked in yellow is the fix. 
 
How to use register -> Copy this code into a yml file say test.yml and run it  
--- 
#Tsting 
- hosts: tomcat-node 
   tasks: 
 
   - shell: /usr/bin/uptime 
      register: myvar 
      - name: Just debugging usage 
         debug: var = myvar

เมื่อฉันรันโค้ดนี้ผ่านคำสั่ง Ansible-playbook -i โฮสต์ test.yml ฉันจะได้ผลลัพธ์ตามที่แสดงด้านล่าง

หากคุณเห็นมันแกวเราได้ลงทะเบียนผลลัพธ์ของคำสั่งลงในตัวแปร - myvar และพิมพ์ผลลัพธ์

ข้อความที่ทำเครื่องหมายเป็นสีเหลืองบอกเราเกี่ยวกับคุณสมบัติของตัวแปร –myvar ที่สามารถใช้สำหรับการควบคุมการไหลเพิ่มเติม ด้วยวิธีนี้เราสามารถค้นหาคุณสมบัติที่เปิดเผยของตัวแปรเฉพาะได้ คำสั่ง debug ต่อไปนี้ช่วยในเรื่องนี้

$ ansible-playbook -i hosts test.yml 

PLAY [tomcat-node] ***************************************************************
**************** ****************************************************************
*************** ****************************** 
 
TASK [Gathering Facts] *****************************************************************
************** *****************************************************************
************** ************************** 
Monday 05 February 2018  17:33:14 +0530 (0:00:00.051) 0:00:00.051 ******* 
ok: [server1] 
 
TASK [command] ******************************************************************
************* ******************************************************************
************* ********************************** 
Monday 05 February 2018  17:33:16 +0530 (0:00:01.697) 0:00:01.748 ******* 
changed: [server1] 
 
TASK [Just debugging usage] ******************************************************************
************* ******************************************************************
************* ********************* 
Monday 05 February 2018  17:33:16 +0530 (0:00:00.226) 0:00:01.974 ******* 
ok: [server1] => { 
   "myvar": { 
      "changed": true, 
      "cmd": "/usr/bin/uptime", 
      "delta": "0:00:00.011306", 
      "end": "2018-02-05 17:33:16.424647", 
      "rc": 0, 
      "start": "2018-02-05 17:33:16.413341", 
      "stderr": "", 
      "stderr_lines": [], 
      "stdout": " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14", 
      "stdout_lines": [ 
         " 17:33:16 up 7 days, 35 min,  1 user,  load average: 0.18, 0.15, 0.14" 
      ] 
   } 
} 
 
PLAY RECAP ****************************************************************************
**********************************************************************************
 ************************************** 
server1 : ok = 3    changed = 1    unreachable = 0    failed = 0

ปัญหาทั่วไปของ Playbook

ในส่วนนี้เราจะเรียนรู้เกี่ยวกับปัญหาทั่วไปบางประการของ Playbook ประเด็นคือ -

  • Quoting
  • Indentation

Playbook เขียนในรูปแบบ yaml และสองข้อข้างต้นเป็นปัญหาที่พบบ่อยที่สุดใน yaml / playbook

Yaml ไม่สนับสนุนการเยื้องตามแท็บและรองรับการเยื้องตามช่องว่างดังนั้นจึงต้องระวังเรื่องเดียวกัน

Note - เมื่อคุณเขียนมันแกวเสร็จแล้วให้เปิดไซต์นี้ (https://editor.swagger.io/) และคัดลอกวางมันเทศของคุณทางด้านซ้ายมือเพื่อให้แน่ใจว่ามันเทศรวบรวมอย่างถูกต้อง นี่เป็นเพียงเกร็ด

Swagger มีคุณสมบัติในการเตือนและข้อผิดพลาด