บทช่วยสอนแบบ Ansible สำหรับผู้เริ่มต้น: Playbook คำสั่งและตัวอย่าง
Ansible คืออะไร?
เบิ้ล เป็นเครื่องมืออัตโนมัติและการจัดการโอเพ่นซอร์สสำหรับการจัดเตรียมซอฟต์แวร์ การจัดการการกำหนดค่า และการปรับใช้ซอฟต์แวร์ Ansible สามารถเรียกใช้และกำหนดค่าระบบที่เหมือน Unix ได้อย่างง่ายดายเช่นกัน Windows ระบบเพื่อให้โครงสร้างพื้นฐานเป็นรหัส มีภาษาโปรแกรมประกาศของตัวเองสำหรับการกำหนดค่าและการจัดการระบบ
Ansible ได้รับความนิยมเนื่องจากความเรียบง่ายในการติดตั้ง ความสะดวกในการใช้งานที่เกี่ยวข้องกับการเชื่อมต่อกับไคลเอนต์ การขาดตัวแทนสำหรับลูกค้า Ansible และทักษะที่หลากหลาย มันทำงานโดยการเชื่อมต่อผ่าน SSH ไปยังไคลเอนต์ ดังนั้นจึงไม่จำเป็นต้องมีเอเจนต์พิเศษบนฝั่งไคลเอ็นต์ และด้วยการพุชโมดูลไปยังไคลเอนต์ โมดูลจะถูกดำเนินการในเครื่องบนฝั่งไคลเอ็นต์ และเอาต์พุตจะถูกส่งกลับไปยังเซิร์ฟเวอร์ Ansible
เนื่องจากใช้ SSH จึงสามารถเชื่อมต่อกับไคลเอนต์ได้อย่างง่ายดายโดยใช้ SSH-Keys ทำให้กระบวนการทั้งหมดง่ายขึ้น รายละเอียดไคลเอนต์ เช่น ชื่อโฮสต์หรือที่อยู่ IP และพอร์ต SSH จะถูกเก็บไว้ในไฟล์ที่เรียกว่าไฟล์อินสตอลเลชั่น เมื่อคุณสร้างไฟล์อินสตอลเลชั่นและกรอกข้อมูลแล้ว Ansible จะสามารถใช้ไฟล์นั้นได้
เหตุใดจึงต้องใช้ Ansible
ต่อไปนี้เป็นข้อดี/ข้อดีที่สำคัญของการใช้ Ansible
- ข้อดีที่สำคัญที่สุดประการหนึ่งของ Ansible ก็คือทุกคนสามารถใช้งานได้ฟรี
- ไม่จำเป็นต้องมีทักษะพิเศษของผู้ดูแลระบบในการติดตั้งและใช้งาน Ansible และเอกสารอย่างเป็นทางการก็ครอบคลุมมาก
- ความเป็นโมดูลเกี่ยวกับปลั๊กอิน โมดูล สินค้าคงคลัง และ playbooks ทำให้ Ansible เป็นเพื่อนที่สมบูรณ์แบบในการจัดสภาพแวดล้อมขนาดใหญ่
- Ansible มีน้ำหนักเบาและสอดคล้องกัน และไม่มีข้อจำกัดใดๆ เกี่ยวกับระบบปฏิบัติการหรือฮาร์ดแวร์พื้นฐาน
- นอกจากนี้ยังมีความปลอดภัยสูงเนื่องจากความสามารถแบบไม่ใช้เอเจนต์และเนื่องจากการใช้คุณสมบัติความปลอดภัยของ OpenSSH
- ข้อดีอีกประการหนึ่งที่สนับสนุนการนำ Ansible มาใช้ก็คือช่วงการเรียนรู้ที่ราบรื่นซึ่งกำหนดโดยเอกสารประกอบที่ครอบคลุม รวมถึงโครงสร้างและการกำหนดค่าที่เรียนรู้ได้ง่าย
ประวัติความเป็นมาของ Ansible
ต่อไปนี้เป็นเครื่องหมายสำคัญจากประวัติศาสตร์ของ ansible:
- ในเดือนกุมภาพันธ์ 2012 โครงการ Ansible ได้เริ่มขึ้น ได้รับการพัฒนาครั้งแรกโดย Michael DeHaan ผู้สร้าง Cobbler และ Func ซึ่งเป็น Fedora Unified Network Controller
- เดิมเรียกว่า AnsibleWorks Inc บริษัทที่ให้เงินทุนสำหรับเครื่องมือ Ansible ถูกซื้อโดย RedHat ในปี 2015 และต่อมาได้ย้ายไปอยู่ภายใต้บริษัทในเครือของ RedHat IBM.
- ในปัจจุบัน Ansible รวมอยู่ในการแจกแจงเช่น Fedora Linux, RHEL, Centos และ Oracle ลินุกซ์
คำศัพท์สำคัญที่ใช้ใน Ansible
-
เซิร์ฟเวอร์ที่ยอมรับได้
เครื่องที่ติดตั้ง Ansible และที่งานและ Playbooks ทั้งหมดจะถูกรัน
-
โมดูล
โดยพื้นฐานแล้ว โมดูลคือคำสั่งหรือชุดของคำสั่ง Ansible ที่คล้ายกันซึ่งมีไว้เพื่อดำเนินการบนฝั่งไคลเอ็นต์
-
งาน
งานคือส่วนที่ประกอบด้วยขั้นตอนเดียวที่ต้องทำให้เสร็จ
-
บทบาท
วิธีการจัดระเบียบงานและไฟล์ที่เกี่ยวข้องที่จะเรียกใช้ในภายหลังในเพลย์บุ๊ก
-
ความจริง
ข้อมูลที่ดึงมาจากระบบไคลเอนต์จากตัวแปรทั่วโลกด้วยการดำเนินการรวบรวมข้อเท็จจริง
-
สินค้าคงคลัง
ไฟล์ที่มีข้อมูลเกี่ยวกับเซิร์ฟเวอร์ไคลเอนต์ Ansible กำหนดไว้ในตัวอย่างภายหลังเป็นไฟล์โฮสต์
-
เล่น
การดำเนินการ Playbook
-
ผู้ดำเนินการ
งานที่ถูกเรียกเฉพาะเมื่อมีผู้แจ้งเท่านั้น
-
แจ้งเตือน
ส่วนประกอบกับงานที่เรียกตัวจัดการหากเอาต์พุตมีการเปลี่ยนแปลง
-
แท็ก
ชื่อที่กำหนดให้กับงานซึ่งสามารถใช้ในภายหลังเพื่อกำหนดงานเฉพาะหรือกลุ่มงานนั้นๆ โดยเฉพาะ
การติดตั้ง Ansible ใน Linux
เมื่อคุณเปรียบเทียบและชั่งน้ำหนักตัวเลือกของคุณแล้ว และตัดสินใจเลือกใช้ Ansible ขั้นตอนต่อไปคือติดตั้งลงในระบบของคุณ เราจะมาดูขั้นตอนการติดตั้งที่แตกต่างกัน ลินุกซ์ การแจกแจงที่ได้รับความนิยมมากที่สุดในบทช่วยสอนเล็กๆ ถัดไป
ติดตั้ง Ansible บนระบบ Centos/RedHat
ขั้นตอน 1) ติดตั้ง repo EPEL
[root@ansible-server ~]# sudo yum install epel-release
ขั้นตอน 2) ติดตั้งแพ็คเกจที่รองรับ
[root@ansible-server ~]# sudo yum install -y ansible
ติดตั้ง Ansible บน Ubuntu/ระบบเดเบียน
ขั้นตอน 1) ดำเนินการอัปเดตแพ็คเกจ
$ sudo apt update
ขั้นตอน 2) ติดตั้งแพ็คเกจซอฟต์แวร์คุณสมบัติทั่วไป
$ sudo apt install software-properties-common
ขั้นตอน 3) ติดตั้งไฟล์เก็บถาวรแพ็คเกจส่วนบุคคลของ Ansible
$ sudo apt-add-repository ppa:ansible/ansible
ขั้นตอน 4) ติดตั้งได้
$ sudo apt update $ sudo apt install ansible
คำสั่งเฉพาะกิจที่เข้าใจได้
วิธีที่ง่ายที่สุดวิธีหนึ่งที่ Ansible สามารถใช้ได้คือการใช้คำสั่งเฉพาะกิจ สิ่งเหล่านี้สามารถใช้ได้เมื่อคุณต้องการออกคำสั่งบางอย่างบนเซิร์ฟเวอร์หรือหลายเซิร์ฟเวอร์ คำสั่ง Ad-hoc จะไม่ถูกเก็บไว้เพื่อใช้ในอนาคต แต่แสดงถึงวิธีที่รวดเร็วในการโต้ตอบกับเซิร์ฟเวอร์ที่ต้องการ
สำหรับบทช่วยสอน Ansible นี้ จะมีการกำหนดค่าไฟล์โฮสต์เซิร์ฟเวอร์ธรรมดาสองไฟล์ ซึ่งประกอบด้วยโฮสต์1 และโฮสต์2
คุณสามารถตรวจสอบให้แน่ใจว่าโฮสต์สามารถเข้าถึงได้จากเซิร์ฟเวอร์ที่รองรับโดยการออกคำสั่ง ping บนโฮสต์ทั้งหมด
[root@ansible-server test_ansible]# ansible -i hosts all -m ping host1 | SUCCESS => { "changed": false, "ping": "pong" } host2 | SUCCESS => { "changed": false, "ping": "pong" }
คำอธิบาย:
- สถานะของคำสั่ง ในกรณีนี้คือ SUCCESS
- โฮสต์ที่คำสั่งทำงาน
- คำสั่งที่ออกผ่านพารามิเตอร์ -m ในกรณีนี้คือ ping
- ด้วยพารามิเตอร์ -i คุณสามารถชี้ไปที่ไฟล์โฮสต์ได้
คุณสามารถออกคำสั่งเดียวกันได้บนโฮสต์ที่ระบุเท่านั้นหากจำเป็น
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2 host2 | SUCCESS => { "changed": false, "ping": "pong" }
คำอธิบาย:
- พารามิเตอร์ขีดจำกัดสามารถใช้เพื่อออกคำสั่งเฉพาะบนโฮสต์ที่ระบุในไฟล์ของโฮสต์เท่านั้น
- ชื่อของโฮสต์ตามที่กำหนดไว้ในไฟล์สินค้าคงคลัง
หากคุณต้องการคัดลอกไฟล์ไปยังหลาย ๆ ปลายทางอย่างรวดเร็ว คุณสามารถใช้โมดูลการคัดลอกในรูปแบบ ansible ซึ่งใช้ SCP ดังนั้นคำสั่งและผลลัพธ์จะมีลักษณะดังนี้:
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile" host1 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/tmp/testfile", "gid": 0, "group": "root", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "root", "size": 0, "src": "/root/.ansible/tmp/ansible-tmp-1562216392.43-256741011164877/source", "state": "file", "uid": 0 } host2 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/tmp/testfile", "gid": 0, "group": "root", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "root", "size": 0, "src": "/root/.ansible/tmp/ansible-tmp-1562216392.6-280302911361278/source", "state": "file", "uid": 0 }
คำอธิบาย:
- กำหนดโมดูลการคัดลอกแล้ว
- อาร์กิวเมนต์ของโมดูลในกรณีนี้คือเส้นทางสัมบูรณ์ของต้นทางและเส้นทางสัมบูรณ์ของปลายทาง
- ผลลัพธ์ของคำสั่ง Ansible สะท้อนถึงความสำเร็จของคำสั่งคัดลอกและรายละเอียดอื่นๆ เช่น แฮชซัม sha1 หรือ md5 สำหรับการตรวจสอบความสมบูรณ์ของไฟล์และข้อมูลเมตา เช่น เจ้าของ ขนาด หรือสิทธิ์ การติดตั้งแพ็คเกจบนเซิร์ฟเวอร์หลายๆ เครื่องนั้นทำได้ง่ายดาย Ansible มีโมดูลต่างๆ มากมายที่โต้ตอบกับโปรแกรมติดตั้งที่ใช้แล้ว เช่น yum, apt, dnf เป็นต้น
ในตัวอย่างถัดไป คุณจะพบวิธีติดตั้งแพ็คเกจผ่านโมดูล yum บนโฮสต์ Centos สองโฮสต์
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present' host1 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.xservers.ro\n * epel: fedora.mirrors.telekom.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: remi.schlundtech.de\n * remi-safe: remi.schlundtech.de\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n" ] } host2 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: mirror.netsite.dk\n * elrepo: mirrors.leadhosts.com\n * epel: mirrors.nav.ro\n * extras: centos.mirrors.telekom.ro\n * remi-php70: mirrors.uni-ruse.bg\n * remi-safe: mirrors.uni-ruse.bg\n * updates: centos.mirror.iphh.net\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n ncdu x86_64 1.14-1.el7 epel 51 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 51 k\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nInstalled:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n" ] }
คำอธิบาย:
- ตัวอย่างนี้ใช้โมดูล Yum
- จะกำหนดอาร์กิวเมนต์ของโมดูล และในกรณีนี้ คุณจะเลือกชื่อของแพ็คเกจและสถานะของแพ็คเกจ หากไม่มีสถานะ แพ็คเกจจะถูกค้นหา และหากพบ ให้ลบออก
- เมื่อเปลี่ยนเป็นสีเหลือง คุณจะเห็นผลลัพธ์ของคำสั่ง ansible ที่สถานะเปลี่ยนไป ซึ่งหมายความว่าในกรณีนี้คือพบและติดตั้งแพ็กเกจแล้ว
- สถานะของคำสั่ง yum install ที่ออกผ่าน ansible ในกรณีนี้ แพ็คเกจ ncdu.x86_64 0:1.14-1.el7 ได้รับการติดตั้งแล้ว
แน่นอนว่าตัวเลือกตัวติดตั้ง yum ทั้งหมดสามารถใช้ได้ผ่านทาง ansible รวมถึงการอัปเดต ติดตั้ง เวอร์ชันล่าสุด หรือลบออก
ในตัวอย่างด้านล่าง มีการออกคำสั่งเดียวกันเพื่อลบแพ็คเกจ ncdu ที่ติดตั้งไว้ก่อนหน้านี้
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent' host1 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n================================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n" ] } host2 | SUCCESS => { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror\nResolving Dependencies\n--> Running transaction check\n---> Package ncdu.x86_64 0:1.14-1.el7 will be erased\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nRemoving:\n ncdu x86_64 1.14-1.el7 @epel 87 k\n\nTransaction Summary\n================================================================================\nRemove 1 Package\n\nInstalled size: 87 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Erasing : ncdu-1.14-1.el7.x86_64 1/1 \n Verifying : ncdu-1.14-1.el7.x86_64 1/1 \n\nRemoved:\n ncdu.x86_64 0:1.14-1.el7 \n\nComplete!\n" ] }
คำอธิบาย:
- ผลลัพธ์ของคำสั่ง yum แสดงว่าแพ็กเกจถูกลบออกแล้ว
คุณสมบัติที่มีประโยชน์และจำเป็นอีกประการหนึ่งที่ Ansible ใช้ในการโต้ตอบกับเซิร์ฟเวอร์ของไคลเอนต์คือการรวบรวมข้อเท็จจริงบางอย่างเกี่ยวกับระบบ ดังนั้น Ansible จึงดึงข้อมูลฮาร์ดแวร์ ซอฟต์แวร์ และการกำหนดเวอร์ชันจากระบบ และจัดเก็บค่าแต่ละค่าในตัวแปรที่สามารถนำมาใช้ในภายหลังได้
หากคุณต้องการข้อมูลโดยละเอียดเกี่ยวกับระบบที่จะแก้ไขผ่าน ansible คุณสามารถใช้คำสั่งถัดไปได้ โมดูลการตั้งค่ารวบรวมข้อเท็จจริงจากตัวแปรระบบ
Playbooks ที่สามารถอ่านได้
Playbooks ที่สามารถอ่านได้ เป็นวิธีการส่งคำสั่งไปยังระบบระยะไกลผ่านสคริปต์ เพลย์บุ๊ก Ansible ใช้ในการกำหนดค่าสภาพแวดล้อมระบบที่ซับซ้อนเพื่อเพิ่มความยืดหยุ่นโดยการรันสคริปต์กับระบบหนึ่งระบบหรือมากกว่านั้น เพลย์บุ๊ก Ansible มักจะเป็นภาษาการกำหนดค่ามากกว่าภาษาการเขียนโปรแกรม
คำสั่ง Playbook แบบ Ansible ใช้รูปแบบ YAML ดังนั้นจึงไม่จำเป็นต้องใช้ไวยากรณ์มากนัก แต่ต้องคำนึงถึงการเยื้อง เหมือนกับที่ชื่อบอกไว้ Playbook คือคอลเลกชั่นบทละคร คุณสามารถกำหนดบทบาทเฉพาะให้กับโฮสต์บางรายและกำหนดบทบาทอื่นๆ ให้กับโฮสต์อื่นๆ ผ่านทาง Playbook ด้วยการทำเช่นนี้ คุณสามารถประสานเซิร์ฟเวอร์หลายเครื่องในสถานการณ์ที่หลากหลายได้ ทั้งหมดใน Playbook เดียว
หากต้องการให้รายละเอียดทั้งหมดชัดเจนก่อนดำเนินการต่อด้วยตัวอย่างคู่มือ Ansible เราต้องกำหนดงานก่อน นี่คืออินเทอร์เฟซสำหรับโมดูล Ansible สำหรับบทบาทและคู่มือ
ตอนนี้ มาเรียนรู้ Playbook ของ Ansible ผ่านตัวอย่างด้วย Playbook เล่มเดียวที่มีการเล่นครั้งเดียว ซึ่งมีหลายภารกิจดังนี้:
--- - hosts: group1 tasks: - name: Install lldpad package yum: name: lldpad state: latest - name: check lldpad service status service: name: lldpad state: started
ในตัวอย่าง Ansible Playbook ข้างต้น group1 ของโฮสต์ในไฟล์ของโฮสต์ถูกกำหนดเป้าหมายสำหรับการติดตั้งแพ็คเกจ lldpad โดยใช้โมดูล yum และหลังจากนั้นบริการ lldpad ที่สร้างขึ้นหลังจากการติดตั้งเริ่มต้นขึ้นโดยใช้โมดูลบริการที่ใช้เป็นส่วนใหญ่เพื่อโต้ตอบกับ systemd ensemble
คำอธิบาย:
- กลุ่มโฮสต์ที่จะเรียกใช้ Playbook
- โมดูล Yum ใช้ในงานนี้สำหรับการติดตั้ง lldpad
- โมดูลบริการใช้เพื่อตรวจสอบว่าบริการเปิดใช้งานและทำงานอยู่หลังการติดตั้งหรือไม่
Playbook ของ Ansible แต่ละอันจะทำงานร่วมกับไฟล์สินค้าคงคลัง ไฟล์สินค้าคงคลังประกอบด้วยรายชื่อเซิร์ฟเวอร์ที่แบ่งออกเป็นกลุ่มเพื่อการควบคุมที่ดีขึ้นสำหรับรายละเอียด เช่น ที่อยู่ IP และพอร์ต SSH สำหรับแต่ละโฮสต์
ไฟล์สินค้าคงคลังที่คุณสามารถใช้สำหรับตัวอย่าง Playbook Ansible นี้มีลักษณะดังนี้ มีสองกลุ่ม ชื่อ group1 และ group2 แต่ละกลุ่มประกอบด้วยโฮสต์1 และโฮสต์2 ตามลำดับ
[group1] host1 ansible_host=192.168.100.2 ansible_ssh_port=22 [group2] host2 ansible_host=192.168.100.3 ansible_ssh_port=22
คำอธิบาย:
- ชื่อกลุ่ม
- ชื่อโฮสต์พร้อมที่อยู่ IP และพอร์ต ssh ในกรณีนี้คือชื่อเริ่มต้นคือ 22
ตัวอย่าง Playbook Ansible ที่มีประโยชน์อีกตัวอย่างหนึ่งซึ่งมีการเล่นสองครั้งสำหรับโฮสต์สองคนคือตัวอย่างถัดไป สำหรับโฮสต์กลุ่มแรก group1 จะมีการเปิดใช้งาน selinux หากเปิดใช้งานอยู่ ข้อความจะปรากฏขึ้นบนหน้าจอของโฮสต์
สำหรับโฮสต์กลุ่มที่สอง แพ็คเกจ httpd จะถูกติดตั้งก็ต่อเมื่อ ansible_os_family คือ RedHat และ ansible_system_vendor คือ HP
Ansible_os_family และ ansible_system_vendor เป็นตัวแปรที่รวบรวมด้วยตัวเลือก Gather_facts และสามารถใช้ได้เหมือนในตัวอย่างนี้แบบมีเงื่อนไข
--- - hosts: group1 tasks: - name: Enable SELinux selinux: state: enabled when: ansible_os_family == 'Debian' register: enable_selinux - debug: Imsg: "Selinux Enabled. Please restart the server to apply changes." when: enable_selinux.changed == true - hosts: group2 tasks: - name: Install apache yum: name: httpd state: present when: ansible_system_vendor == 'HP' and ansible_os_family == 'RedHat'
คำอธิบาย:
- ตัวอย่างของคำสั่ง when ในกรณีนี้ เมื่อประเภท OS เป็น Debian ตัวแปร ansible_os_family ถูกรวบรวมผ่านฟังก์ชัน Gather_facts
- เอาต์พุตงานได้รับการลงทะเบียนเพื่อใช้ในอนาคต โดยมีชื่อเป็น Enable_selinux
- ตัวอย่างอื่นของคำสั่ง when ในกรณีนี้ จะมีข้อความแสดงให้ผู้ใช้โฮสต์ทราบหาก SELinux ได้รับการเปิดใช้งานมาก่อน
- อีกตัวอย่างหนึ่งของ when clause ที่ประกอบด้วยกฎสองข้อ
นอกจากงานแล้ว ยังมีงานเฉพาะบางงานที่เรียกว่าตัวจัดการอีกด้วย ตัวจัดการต้องมีชื่อที่ไม่ซ้ำกันตลอดทั้ง Playbook สิ่งเหล่านี้ทำงานในลักษณะเดียวกับงานปกติ แต่สามารถแจ้งตัวจัดการผ่านตัวแจ้งเตือนได้
หากตัวจัดการไม่ได้รับแจ้งระหว่างการเรียกใช้ Playbook ตัวจัดการจะไม่ทำงาน อย่างไรก็ตาม หากมีงานมากกว่าหนึ่งงานแจ้งเตือนตัวจัดการ ระบบจะทำงานเพียงครั้งเดียวหลังจากงานทั้งหมดเสร็จสิ้นแล้ว
ในตัวอย่างที่แสดงด้านล่าง คุณจะเห็นว่างานเฉพาะมีส่วนแจ้งเตือนซึ่งเรียกใช้งานอื่นอย่างไร หากผลลัพธ์ของงานแรกมีการเปลี่ยนแปลง งานตัวจัดการจะถูกเรียก ตัวอย่างที่ดีที่สุดคือการเปลี่ยนแปลงไฟล์การกำหนดค่าและรีสตาร์ทบริการเฉพาะนั้นอีกครั้ง
--- - hosts: group2 tasks: - name: sshd config file modify port lineinfile: path: /etc/ssh/sshd_config regexp: 'Port 28675' line: '#Port 22' notify: - restart sshd handlers - name: restart sshd service: sshd name: sshd state: restarted
ในกรณีนี้ หากงานแรก "พอร์ตแก้ไขไฟล์ sshd config" มีการเปลี่ยนแปลง ซึ่งหมายความว่าหากพอร์ตไม่ใช่ 28675 ในตอนแรก งานจะได้รับการแก้ไขและงานจะแจ้งให้ผู้จัดการทราบด้วยชื่อเดียวกันเพื่อเรียกใช้ และจะรีสตาร์ทบริการ sshd
คำอธิบาย:
- ตัวอย่างการแจ้งเตือน
- ตัวอย่างของตัวจัดการ
บทบาทที่เข้าใจได้
เมื่อต้องรับมือกับ Playbooks ที่กว้างขวาง การแบ่งงานออกเป็นบทบาทต่างๆ จะง่ายกว่า นอกจากนี้ยังช่วยในการนำบทบาทกลับมาใช้ใหม่ในอนาคต บทบาทคือชุดของงาน ซึ่งสามารถย้ายจาก Playbook หนึ่งไปยังอีกที่หนึ่งได้ โดยสามารถเรียกใช้ได้อย่างอิสระแต่ผ่านไฟล์ Playbook เท่านั้น
บทบาทจะถูกจัดเก็บไว้ในไดเร็กทอรีแยกกันและมีโครงสร้างไดเร็กทอรีเฉพาะ
[root@ansible-server test2]# tree . `-- role1 |-- defaults | `-- main.yml |-- handlers | `-- main.yml |-- meta | `-- main.yml |-- README.md |-- tasks | `-- main.yml |-- tests | |-- inventory | `-- test.yml `-- vars `-- main.yml 7 directories, 8 files
ไฟล์ yaml ในไดเร็กทอรีดีฟอลต์ประกอบด้วยรายการตัวแปรเริ่มต้นที่จะใช้พร้อมกับเพลย์บุ๊ก ไดเร็กทอรีตัวจัดการใช้เพื่อจัดเก็บตัวจัดการ เมตาไดเร็กทอรีควรมีข้อมูลเกี่ยวกับผู้เขียนและการขึ้นต่อกันของบทบาท ในไดเร็กทอรีงาน จะมีไฟล์ yaml หลักสำหรับบทบาท
ไดเรกทอรีการทดสอบประกอบด้วยไฟล์ Playbook yaml ตัวอย่างและไฟล์สินค้าคงคลังตัวอย่าง และส่วนใหญ่จะใช้เพื่อการทดสอบก่อนสร้างบทบาทจริง
ไดเร็กทอรี vars มีไฟล์ yaml ซึ่งจะกำหนดตัวแปรทั้งหมดที่ใช้โดยบทบาท เทมเพลตไดเร็กทอรีและไฟล์ไดเร็กทอรีควรมีไฟล์และเทมเพลตที่จะใช้โดยงานในบทบาท
ในการสร้างไดเรกทอรีสำหรับบทบาท คุณควรใช้คำสั่งต่อไปนี้โดยมีพารามิเตอร์สุดท้ายคือชื่อบทบาท:
[root@ansible-server test2]# ansible-galaxy init role1
Ansible ยังทำงานได้ดีกับเทมเพลต เป็นภาษาสำหรับการสร้างเทมเพลต โดยใช้ Jinja2
ในตัวอย่างถัดไป คุณจะพบว่าเทมเพลต Jinja2 พื้นฐานมีหน้าตาเป็นอย่างไรและใช้ในบทบาทได้
ณ รันไทม์ ขึ้นอยู่กับว่าศูนย์ข้อมูลใดที่เซิร์ฟเวอร์ของคุณตั้งอยู่ คุณสามารถเลือกจากเนมเซิร์ฟเวอร์มากกว่าหนึ่งรายการ โดยแต่ละเนมเซิร์ฟเวอร์จะสอดคล้องกับศูนย์ข้อมูล โดยใช้ตัวแปร “resolver_ip_addresses”
{% for resolver in resolver_ip_addresses %} nameserver {{ resolver }} {% endfor %} options timeout:1 options attempts:5 options rotate
ในตัวอย่างนี้ ในไดเร็กทอรี playbook มีการกำหนดตัวแปรบางตัว รวมถึงตัวแปรชื่อ solver_ip_addresses ที่มีค่าต่างกันขึ้นอยู่กับศูนย์ข้อมูล
- name: Set resolver for server template: src: dns.j2 dest: /etc/resolv.conf group: root owner: root mode: "0644" tag: resolver
คำอธิบาย:
- ชื่อของเทมเพลตที่จะใช้ เทมเพลตอยู่ในเทมเพลต dir ในเส้นทางบทบาท
- เส้นทางปลายทางของชื่อไฟล์ที่จะถูกแทนที่ด้วยเทมเพลตบนฝั่งไคลเอ็นต์
- สิทธิ์ของไฟล์ปลายทาง
งานตามบทบาทยังสามารถมีฟิลด์แท็กซึ่งมีชื่อประกอบอยู่ด้วย มากกว่าหนึ่งงานสามารถใช้แท็กเดียวกันร่วมกันได้ เมื่อเรียกใช้ Playbook ที่สามารถระบุได้ คุณสามารถระบุแท็กได้เช่นกัน เพื่อให้งานเหล่านั้นได้รับการดำเนินการ
กรณีศึกษาที่สามารถเข้าใจได้
ในส่วนนี้ เราจะวิเคราะห์กรณีศึกษา Playbook ที่จำเป็นซึ่งมีสามบทบาท จุดประสงค์ของเรื่องนี้คือเพื่อให้เป็นตัวอย่างที่เป็นประโยชน์ของสิ่งที่เราพูดถึงก่อนหน้านี้ ตัวอย่างบางส่วนที่ใช้ก่อนหน้านี้ในบทช่วยสอน Playbook Ansible นี้จะได้รับการดัดแปลงและใช้ใน Playbook นี้
ด้านล่างนี้คือโครงสร้างไดเร็กทอรีของ Playbook ไฟล์ Yaml ที่จะใช้จะเป็น p4.yml
[root@ansible-server test_ansible]# ls -lrth total 16K -rw-r--r--. 1 root root 0 Jul 3 10:13 testfile -rw-r--r--. 1 root root 203 Jul 3 13:30 p1.yml -rw-r--r--. 1 root root 125 Jul 3 15:00 hosts -rw-r--r--. 1 root root 488 Jul 3 16:40 p2.yml -rw-r--r--. 1 root root 188 Jul 4 17:33 p4.yml drwxr-xr-x. 5 root root 47 Jul 4 17:35 roles [root@ansible-server test_ansible]# cd roles [root@ansible-server roles]# ls -lrth total 12K drwxr-xr-x. 9 root root 4.0K Jul 4 12:52 httpd drwxr-xr-x. 9 root root 4.0K Jul 4 13:55 selinux drwxr-xr-x. 9 root root 4.0K Jul 4 16:54 resolver
Playbook มี 3 บทบาท บทบาทหนึ่งเรียกว่า Resolver ซึ่งจะตั้งค่าเนมเซิร์ฟเวอร์เฉพาะบนเซิร์ฟเวอร์โดยการคัดลอกไฟล์จากเซิร์ฟเวอร์ไปยังปลายทาง /etc/resolv.conf อีกอันหนึ่งเรียกว่า httpd และจะติดตั้งแพ็คเกจ httpd ด้วยโมดูล yum และอันที่สามจะเปิดใช้งาน SELinux และแจ้งให้ผู้ใช้ที่บันทึกไว้ให้รีบูตระบบ แต่ละบทบาทถูกสร้างขึ้นโดยใช้คำสั่ง ansible-galaxy
บทบาทตัวแก้ไข งาน main.yml:
บทบาท Httpd งาน main.yml:
บทบาท Selinux งาน main.yml:
ด้านล่างนี้คือเพลย์บุ๊ก p4.yml ที่กำหนดไว้ เพลย์บุ๊กจะทำงานบนโฮสต์ทั้งหมดหากไม่ได้ระบุไว้เป็นอย่างอื่นในบรรทัดคำสั่ง เพลย์บุ๊กจะทำงานในฐานะผู้ใช้รูทบนพอร์ต 22 (SSH) เพลย์บุ๊กจะรวบรวมข้อเท็จจริงก่อนเรียกใช้บทบาท และเพลย์บุ๊กทั้งสามบทบาทที่กล่าวถึงก่อนหน้านี้ สามารถเรียกใช้บทบาทแต่ละบทบาทได้อย่างอิสระโดยระบุแท็กในบรรทัดคำสั่ง ansible-playbook ด้วยพารามิเตอร์ –t
--- - hosts: all user: root port: 22 gather_facts: True roles: - { role: selinux, tags: selinux } - { role: httpd, tags: httpd } - { role: resolver, tags: resolver }
การรัน Playbook p4.yml บนสองโฮสต์และการตีความเอาต์พุต คำสั่งเดียวกันนี้สามารถรันได้ด้วยพารามิเตอร์ –check สำหรับการทดลองรัน ในกรณีที่คุณต้องการใช้การรับรองความถูกต้องด้วยรหัสผ่าน ให้ใช้พารามิเตอร์ -k
คำอธิบาย:
- คำสั่ง Ansible-playbook ที่รัน p4.yml
- Playbook ข้ามบทบาท SELinux เนื่องจากมีการเปิดใช้งานอยู่แล้ว
- Ansible พบว่ามีการติดตั้งแพ็คเกจ httpd แล้ว ดังนั้นจึงส่งคืนได้
- ตั้งค่าตัวแก้ไขแล้ว และตัวแก้ไขบทบาทได้รับการเปลี่ยนแปลงสถานะ
แผ่นโกงคำสั่ง Ansible
ติดตั้ง EPEL repo บนระบบ Centos/RHEL
[root@ansible-server ~]# sudo yum install epel-release
ติดตั้งแพ็คเกจที่รองรับบนระบบ Centos/RHEL
[root@ansible-server ~]# sudo yum install -y ansible
ดำเนินการอัปเดตแพ็คเกจบน Debian/Ubuntu ระบบ
$ sudo apt update
ติดตั้งแพ็คเกจซอฟต์แวร์คุณสมบัติทั่วไปบน Debian/Ubuntu ระบบ
$ sudo apt install software-properties-common
ติดตั้งแพ็คเกจส่วนตัวของ Ansible บน Debian/Ubuntu ระบบ
$ sudo apt-add-repository ppa:ansible/ansible
ติดตั้ง Ansible บน Debian/Ubuntu ระบบ
$ sudo apt update $ sudo apt install ansible
ออกคำสั่ง ping บนเซิร์ฟเวอร์ทั้งหมดที่กำหนดไว้ในไฟล์สินค้าคงคลังชื่อโฮสต์
[root@ansible-server test_ansible]# ansible -i hosts all -m ping
ออกคำสั่ง ping บนโฮสต์ 2 เท่านั้น
[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
คัดลอกไฟล์ “testfile” บนโฮสต์ทั้งหมดในไฟล์สินค้าคงคลัง
[root@ansible-server test_ansible]# ansible -i hosts all -m copy -a "src=/root/test_ansible/testfile dest=/tmp/testfile"
ติดตั้งแพ็คเกจ ncdu บนโฮสต์ทั้งหมด
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=present'
ลบแพ็คเกจ ncdu บนโฮสต์ทั้งหมด
[root@ansible-server test_ansible]# ansible -i hosts all -m yum -a 'name=ncdu state=absent'
สร้างโครงสร้างไดเร็กทอรีสำหรับบทบาทที่ชื่อ Role1
[root@ansible-server test2]# ansible-galaxy init role1
Playbook p4.yml แบบทดลองรัน
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml --check
รัน Playbook p4.yml ด้วยการตรวจสอบสิทธิ์ด้วยรหัสผ่านสำหรับโฮสต์ทั้งหมด
[root@ansible-server test_ansible]# ansible-playbook -i hosts p4.yml -k
สรุป
ในโลกที่มีเทคโนโลยีเปลี่ยนแปลงอย่างต่อเนื่องด้วยอัตราที่รวดเร็วและเติบโตรวดเร็วมากในเวลาเดียวกัน ผู้ดูแลระบบและวิศวกร DevOps จะต้องคิดหาวิธีที่แตกต่างกันในการจัดการงานประจำให้เป็นอัตโนมัติและจัดการเซิร์ฟเวอร์จำนวนมาก
ในขณะที่มีหลาย ๆ ทางเลือกแทน Ansible (เชฟ, Puppet) ที่ทำสิ่งเดียวกันแต่มีความแตกต่างบางประการ Ansible สามารถก้าวขึ้นมาเหนือสิ่งอื่นใดได้ด้วยความเรียบง่าย การรักษาความปลอดภัยที่ได้รับการปรับปรุง และที่สำคัญที่สุดคือช่วงการเรียนรู้ที่ราบรื่น เนื่องจากคุณสมบัติเหล่านี้และการนำ Ansible มาใช้อย่างรวดเร็ว เราจึงสร้างบทช่วยสอนที่เต็มไปด้วยตัวอย่างเพื่อให้คุณได้รับประสบการณ์การทำงานครั้งแรกกับ Ansible ได้อย่างราบรื่นยิ่งขึ้น
ในบทช่วยสอนพื้นฐานเกี่ยวกับ Ansible นี้ เราได้อธิบายเกี่ยวกับ Ansible และพูดถึงประวัติของมันเล็กน้อย เราได้กล่าวถึงจุดแข็งของ Ansible และข้อดีที่ Ansible สามารถนำมาใช้ในการทำงานอัตโนมัติและการประสานงานโครงสร้างพื้นฐานขนาดต่างๆ เราได้กำหนดคำศัพท์ที่สำคัญที่ใช้กับ Ansible และกำหนดโครงสร้างของคู่มือ Ansible ตัวอย่างโดยละเอียดมาพร้อมกับข้อมูลทั้งหมดพร้อมคำอธิบายโดยละเอียด