บทช่วยสอนแบบ 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 บนระบบ Centos/RedHat

ติดตั้ง 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"
}

คำสั่งเฉพาะกิจที่เข้าใจได้

คำอธิบาย:

  1. สถานะของคำสั่ง ในกรณีนี้คือ SUCCESS
  2. โฮสต์ที่คำสั่งทำงาน
  3. คำสั่งที่ออกผ่านพารามิเตอร์ -m ในกรณีนี้คือ ping
  4. ด้วยพารามิเตอร์ -i คุณสามารถชี้ไปที่ไฟล์โฮสต์ได้


คุณสามารถออกคำสั่งเดียวกันได้บนโฮสต์ที่ระบุเท่านั้นหากจำเป็น

[root@ansible-server test_ansible]# ansible -i hosts all -m ping --limit host2
host2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

คำสั่งเฉพาะกิจที่เข้าใจได้

คำอธิบาย:

  1. พารามิเตอร์ขีดจำกัดสามารถใช้เพื่อออกคำสั่งเฉพาะบนโฮสต์ที่ระบุในไฟล์ของโฮสต์เท่านั้น
  2. ชื่อของโฮสต์ตามที่กำหนดไว้ในไฟล์สินค้าคงคลัง

หากคุณต้องการคัดลอกไฟล์ไปยังหลาย ๆ ปลายทางอย่างรวดเร็ว คุณสามารถใช้โมดูลการคัดลอกในรูปแบบ 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
}

คำสั่งเฉพาะกิจที่เข้าใจได้

คำอธิบาย:

  1. กำหนดโมดูลการคัดลอกแล้ว
  2. อาร์กิวเมนต์ของโมดูลในกรณีนี้คือเส้นทางสัมบูรณ์ของต้นทางและเส้นทางสัมบูรณ์ของปลายทาง
  3. ผลลัพธ์ของคำสั่ง 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"
    ]
}

คำสั่งเฉพาะกิจที่เข้าใจได้

คำอธิบาย:

  1. ตัวอย่างนี้ใช้โมดูล Yum
  2. จะกำหนดอาร์กิวเมนต์ของโมดูล และในกรณีนี้ คุณจะเลือกชื่อของแพ็คเกจและสถานะของแพ็คเกจ หากไม่มีสถานะ แพ็คเกจจะถูกค้นหา และหากพบ ให้ลบออก
  3. เมื่อเปลี่ยนเป็นสีเหลือง คุณจะเห็นผลลัพธ์ของคำสั่ง ansible ที่สถานะเปลี่ยนไป ซึ่งหมายความว่าในกรณีนี้คือพบและติดตั้งแพ็กเกจแล้ว
  4. สถานะของคำสั่ง 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"
    ]
}

คำสั่งเฉพาะกิจที่เข้าใจได้

คำอธิบาย:

  1. ผลลัพธ์ของคำสั่ง 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

Playbooks ที่สามารถอ่านได้

ในตัวอย่าง Ansible Playbook ข้างต้น group1 ของโฮสต์ในไฟล์ของโฮสต์ถูกกำหนดเป้าหมายสำหรับการติดตั้งแพ็คเกจ lldpad โดยใช้โมดูล yum และหลังจากนั้นบริการ lldpad ที่สร้างขึ้นหลังจากการติดตั้งเริ่มต้นขึ้นโดยใช้โมดูลบริการที่ใช้เป็นส่วนใหญ่เพื่อโต้ตอบกับ systemd ensemble

คำอธิบาย:

  1. กลุ่มโฮสต์ที่จะเรียกใช้ Playbook
  2. โมดูล Yum ใช้ในงานนี้สำหรับการติดตั้ง lldpad
  3. โมดูลบริการใช้เพื่อตรวจสอบว่าบริการเปิดใช้งานและทำงานอยู่หลังการติดตั้งหรือไม่

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

Playbooks ที่สามารถอ่านได้

คำอธิบาย:

  1. ชื่อกลุ่ม
  2. ชื่อโฮสต์พร้อมที่อยู่ 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'

Playbooks ที่สามารถอ่านได้

คำอธิบาย:

  1. ตัวอย่างของคำสั่ง when ในกรณีนี้ เมื่อประเภท OS เป็น Debian ตัวแปร ansible_os_family ถูกรวบรวมผ่านฟังก์ชัน Gather_facts
  2. เอาต์พุตงานได้รับการลงทะเบียนเพื่อใช้ในอนาคต โดยมีชื่อเป็น Enable_selinux
  3. ตัวอย่างอื่นของคำสั่ง when ในกรณีนี้ จะมีข้อความแสดงให้ผู้ใช้โฮสต์ทราบหาก SELinux ได้รับการเปิดใช้งานมาก่อน
  4. อีกตัวอย่างหนึ่งของ 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 ที่สามารถอ่านได้

คำอธิบาย:

  1. ตัวอย่างการแจ้งเตือน
  2. ตัวอย่างของตัวจัดการ

บทบาทที่เข้าใจได้

เมื่อต้องรับมือกับ 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	

บทบาทที่เข้าใจได้

คำอธิบาย:

  1. ชื่อของเทมเพลตที่จะใช้ เทมเพลตอยู่ในเทมเพลต dir ในเส้นทางบทบาท
  2. เส้นทางปลายทางของชื่อไฟล์ที่จะถูกแทนที่ด้วยเทมเพลตบนฝั่งไคลเอ็นต์
  3. สิทธิ์ของไฟล์ปลายทาง

งานตามบทบาทยังสามารถมีฟิลด์แท็กซึ่งมีชื่อประกอบอยู่ด้วย มากกว่าหนึ่งงานสามารถใช้แท็กเดียวกันร่วมกันได้ เมื่อเรียกใช้ 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

กรณีศึกษาที่สามารถเข้าใจได้

คำอธิบาย:

  1. คำสั่ง Ansible-playbook ที่รัน p4.yml
  2. Playbook ข้ามบทบาท SELinux เนื่องจากมีการเปิดใช้งานอยู่แล้ว
  3. Ansible พบว่ามีการติดตั้งแพ็คเกจ httpd แล้ว ดังนั้นจึงส่งคืนได้
  4. ตั้งค่าตัวแก้ไขแล้ว และตัวแก้ไขบทบาทได้รับการเปลี่ยนแปลงสถานะ

แผ่นโกงคำสั่ง 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 ตัวอย่างโดยละเอียดมาพร้อมกับข้อมูลทั้งหมดพร้อมคำอธิบายโดยละเอียด