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 มีคุณสมบัติในการเตือนและข้อผิดพลาด