วิธีใช้ Ansible เพื่อจัดการทรัพยากร AWS ของคุณ

คุณไม่ชอบที่จะสามารถโบกไม้กายสิทธิ์และชั้นทรัพยากรในบัญชี AWS ของคุณได้ในทันทีทันใดและน่าอัศจรรย์ในชีวิตที่กำหนดค่าไว้อย่างสมบูรณ์แบบพร้อมที่จะตอบสนองความต้องการโครงสร้างพื้นฐานที่ซับซ้อนของคุณหรือไม่?

หากคุณมีประสบการณ์กับ AWS อยู่แล้วคุณจะรู้ว่าการทำงานผ่านหน้าเว็บหลังจากหน้าเว็บในคอนโซลการจัดการของ Amazon นั้นเจ็บปวดเพียงใดในขณะที่คุณจัดเตรียมบริการด้วยตนเอง และแม้แต่ AWS CLI ซึ่งเป็นขั้นตอนใหญ่ก็สามารถเพิ่มความซับซ้อนและความพยายามในการผสมผสานได้

ไม่ได้หมายความว่า AWS เองไม่ได้แก้ไขปัญหาด้วยคลาสของเครื่องมือการจัดเตรียมที่มีประสิทธิภาพซึ่งรวมถึง CloudFormation และ Elastic Kubernetes Service (สิ่งที่ฉันพูดในหลักสูตร "การใช้ Docker บน AWS" ที่ Pluralsight) แต่ทั้งสองตัวเลือกเหล่านี้ไม่ได้อยู่ใกล้กับโครงสร้างพื้นฐานที่มีอยู่ของคุณหรือใช้วิธีการทำงานที่คุ้นเคยเหมือนอย่าง Ansible

หากคุณใช้ Ansible สำหรับการดำเนินงานในองค์กรของคุณอยู่แล้วการเสียบเข้ากับบัญชี AWS ของคุณบางครั้งอาจเป็นวิธีที่รวดเร็วและไม่เจ็บปวดที่สุดในการโยกย้ายการดำเนินการไปยังระบบคลาวด์

ทำความเข้าใจเกี่ยวกับข้อได้เปรียบของ Ansible / AWS

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

ก่อนที่เราจะเปิดตัว Ansible Playbook "Hello World" แบบธรรมดาก่อนอื่นให้ตรวจสอบให้แน่ใจว่าคุณมีสภาพแวดล้อมการทำงานที่กำหนดค่าไว้อย่างเหมาะสมซึ่ง Ansible สามารถสื่อสารกับเพื่อนใหม่ทั้งหมดในบัญชี AWS ของคุณได้

การเตรียมสภาพแวดล้อมในท้องถิ่น

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

ในสมัยก่อนเมื่อ playbook ทำงานกับเซิร์ฟเวอร์จริง Ansible จะใช้การเชื่อมต่อ SSH ที่มีอยู่เพื่อเข้าสู่ระบบโฮสต์ระยะไกลอย่างปลอดภัยและดำเนินการสร้างแอปพลิเคชันของคุณ แต่จะใช้ไม่ได้กับปริมาณงานของ AWS คุณจะเห็นว่าเนื่องจากยังไม่มีอินสแตนซ์ EC2 และโครงสร้างพื้นฐานอื่น ๆ ที่คุณต้องการเปิดตัวจึงไม่มีการเชื่อมต่อ SSH "ที่มีอยู่" Ansible จะใช้ Boto 3 ซึ่งเป็นชุดพัฒนาซอฟต์แวร์ (หรือ SDK) ที่ใช้โดย AWS ซึ่งอนุญาตให้โค้ด Python สื่อสารกับ AWS API

การใช้ AWS CLI เพื่อเชื่อมต่อ Ansible

คุณไม่จำเป็นต้องรู้ว่าทั้งหมดนั้นทำงานอย่างไร แต่ต้องมีเพื่อให้สามารถทำงานได้ ด้วยเหตุนี้คุณจะต้องติดตั้งอินเทอร์เฟซบรรทัดคำสั่ง AWS (CLI) เราจะไม่ใช้ CLI เองสำหรับสิ่งที่สำคัญ แต่การติดตั้งจะทำให้เรามีการอ้างอิงทั้งหมดที่เราต้องการ คุณสามารถดูวิธีทำให้สิ่งนี้ใช้งานได้กับระบบปฏิบัติการเวอร์ชันล่าสุดที่คุณใช้จากหน้าเอกสาร AWS

การทำงานกับ Python package manager PIP เป็นวิธียอดนิยมในการทำสิ่งนี้ให้เสร็จสิ้น นี่คือวิธีที่คุณจะติดตั้ง PIP จากนั้น AWS CLI บนเครื่อง Ubuntu:

sudo apt update sudo apt install python3-pip pip3 install awscli

ฉันควรสังเกตว่าเมื่อฉันเขียนสิ่งนี้ Python 2 ยังมีชีวิตอยู่ ... แต่ก็แค่ ดังนั้นบางครั้งอาจยังมี Python 2 และ Python 3 เวอร์ชันแยกกันติดตั้งอยู่ในระบบของคุณ เนื่องจาก Python 2 จะเลิกใช้งานโดยสมบูรณ์ในไม่ช้าคุณอาจไม่ต้องกังวลเกี่ยวกับการระบุ python3 หรือ pip3 ด้วยคำสั่งของคุณซึ่งควรเป็นไปโดยอัตโนมัติ

เมื่อติดตั้ง CLI แล้วให้เรียกใช้aws configureและป้อนรหัสคีย์การเข้าถึง AWS และคีย์การเข้าถึงลับ

aws configure cat .aws/credentials

คุณสามารถรับคีย์ได้จากหน้า Your Security Credentials ใน AWS Management Console นี่คือลักษณะของคีย์เหล่านั้น (อย่าได้รับความคิดที่ผิด ๆ สิ่งเหล่านี้ไม่ถูกต้อง):

AccessKeyId: AKIALNZTQW6H3EFBRLHQ SecretAccessKey: f26B8touguUBELGpdyCyc9o0ZDzP2MEUWNC0JNwA

เพียงจำไว้ว่าคีย์คู่หนึ่งที่ออกให้กับผู้ใช้รูทของบัญชี AWS ของคุณให้การเข้าถึงบัญชี AWS ทั้งหมดของคุณโดยสมบูรณ์ ใครก็ตามที่ครอบครองข้อมูลประจำตัวเหล่านั้นจะสามารถเรียกเก็บค่าบริการตัวเลขหกและเจ็ดได้อย่างรวดเร็วดังนั้นโปรดใช้ความระมัดระวังในการใช้และจัดเก็บข้อมูลเหล่านี้ ตามหลักการแล้วคุณจะดีกว่าในการจำกัดความเสี่ยงด้วยการสร้างผู้ดูแลระบบในบริการ AWS Identify and Access Management (IAM) ที่มีอำนาจ จำกัด และใช้คีย์ที่ออกให้กับผู้ใช้นั้น

ทำไมฉันถึงทำเช่นนี้ ค่าของการเติมไฟล์ข้อมูลรับรอง AWS ของฉันคือ Ansible ฉลาดพอที่จะค้นหาและหากไม่มีคีย์การตรวจสอบสิทธิ์อื่น ๆ ในสภาพแวดล้อมระบบก็จะใช้สิ่งเหล่านี้ เร็ว ๆ นี้คุณจะเห็นว่าจะสะดวกเพียงใด อย่างไรก็ตามคุณควรทราบวิธีอื่น ๆ ในการจัดการการพิสูจน์ตัวตนสำหรับ Ansible playbooks เช่นการใช้ansible-vaultหรือโดยการสร้างแล้วเรียกใช้ไฟล์ aws_keys.yml แต่สิ่งหนึ่งที่คุณไม่ควรทำอย่างแน่นอนคือการฮาร์ดโค้ดคีย์ในไฟล์ playbook ของคุณโดยเฉพาะอย่างยิ่งหากคุณวางแผนที่จะส่งไปยังที่เก็บออนไลน์เช่น GitHub ฉันจะทดสอบ CLI อย่างรวดเร็วเพื่อให้แน่ใจว่าเราสามารถเชื่อมต่อกับ AWS ได้อย่างถูกต้อง คำสั่งง่ายๆนี้จะแสดงรายการบัคเก็ต S3 ที่ฉันมีในบัญชีนี้

aws s3 ls

ตอนนี้เราพร้อมที่จะติดตั้ง ansible ผมจะไปกับ pip3 ฉันสามารถใช้ที่เก็บ Ubuntu apt ปกติได้อย่างง่ายดาย แต่ส่วนใหญ่มักจะติดตั้งเวอร์ชันที่เก่ากว่าเล็กน้อย ขึ้นอยู่กับการเชื่อมต่อเครือข่ายของคุณซึ่งจะใช้เวลาหนึ่งหรือสองนาที แต่ฉันจะข้ามส่วนใหญ่ไป

$ pip3 install ansible 

ฉันจะยืนยันว่าติดตั้งอย่างถูกต้องโดยเรียกใช้ ansible --version สิ่งนี้แสดงให้เราเห็นเวอร์ชันที่สร้างขึ้นซึ่งกำหนดค่าโมดูล Ansible โดยค่าเริ่มต้นจะถูกบันทึกในตำแหน่งใดตำแหน่งหนึ่งจากสองตำแหน่งนี้ในระบบไฟล์ซึ่งโมดูลอื่น ๆ จะพร้อมใช้งานที่นี่และที่สำคัญที่สุดคือที่ปฏิบัติการ Ansible นั้นอยู่ ภายในไดเร็กทอรี / local / bin / ภายใต้โฮมไดเร็กทอรีของผู้ใช้ของฉัน ผู้ใช้ของฉันที่นี่เรียกว่า ubuntu คุณยังสามารถดูได้ว่าเรากำลังใช้ Python 3 เวอร์ชันล่าสุดที่ดี

$ ansible --version ansible 2.8.5 config file = None configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] ansible python module location = /home/ubuntu/.local/lib/python3.6/site-packages/ansible executable location = /home/ubuntu/.local/bin/ansible python version = 3.6.8 (default, Aug 20 2019, 17:12:48) [GCC 8.3.0] 

อีกหนึ่งขั้นตอน. ดังที่ได้กล่าวไว้ก่อนหน้านี้ Ansible จะเชื่อมต่อกับ AWS โดยใช้ boto SDK ดังนั้นเราจะต้องติดตั้งแพ็คเกจ boto และ boto 3 ฉันจะไปกับ PIP สำหรับอันนี้ด้วย

$ pip3 install boto boto3 

เมื่อนำขึ้นเครื่องแล้วเราก็พร้อมที่จะทำของจริง ซึ่งจะเริ่มในส่วนถัดไป

การทดสอบ Ansible ด้วย Simple Playbook

นี่จะเป็นหลักฐานการสาธิตแนวคิดที่ง่ายมาก ฉันจะสร้างไฟล์สองสามไฟล์แนะนำคุณเกี่ยวกับไวยากรณ์จากนั้นจึงเริ่มการทำงาน ก่อนอื่นฉันจะใช้โปรแกรมแก้ไขข้อความธรรมดาเพื่อสร้างไฟล์โฮสต์โดยปกติไฟล์โฮสต์จะบอก Ansible ว่าสามารถค้นหาเซิร์ฟเวอร์ระยะไกลที่คุณต้องการจัดเตรียมได้ที่ไหน แต่เนื่องจากในกรณีของ AWS ทรัพยากรที่จะเป็นโฮสต์ของเรายังไม่มีเราเพียงแค่ชี้ Ansible ไปที่ localhost และ boto จะจัดการการเชื่อมต่อเบื้องหลัง เนื้อหาของไฟล์นั้นจะมีลักษณะดังนี้:

[local] localhost 

Next, I'll create a playbook file that I'll call test-ansible.yml. The yml extension, of course, indicates that this file must be formatted using YAML markup language syntax. As you can see from the file text I've pasted just below, that'll begin with three dashes marking the start of the file and then an indented dash introducing a set of definitions. The value of "hosts" could be one or more remote computers but, as I've said, we'll leave that up to the local system to figure out. The same goes for our connection.

The next section includes the tasks we want Ansible to perform. This one will use the aws_s3 module to create a new bucket on Amazon's S3 Simple Storage Service in the us-east-1 region. I have to give it this ugly name because S3 buckets require globally unique names - if a name you choose clashes with any one of the countless millions of names already out there, the operation will fail.

--- - name: Test s3 hosts: local connection: local tasks: - name: Create new bucket aws_s3: bucket: testme817275b mode: create region: us-east-1 

I run the playbook by calling the ansible-playbook command using -i to specify the hosts file, and then pointing to the test.yml file. Ansible should give us some feedback in just a moment or two. If we're successful, you'll see "0" as the value of "failed" and at least "1" as the value of "ok".

$ ansible-playbook -i hosts test-ansible.yml PLAY [Test s3] ****************************************************** TASK [Create new bucket] ******************************************** changed: [localhost] PLAY RECAP ********************************************************** localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 

If I check my list of buckets once more, I should - and do - see the new one:

$ aws s3 ls 2018-12-30 15:19:24 elasticbeanstalk-us-east-1-297972716276 2018-10-12 04:09:37 mysite548.com 2019-09-24 15:53:26 testme817275b 

That's a very brief intro to setting up an Ansible environment. We saw how using Ansible with Amazon's automatically provisioned resources is going to work differently than it would with traditional Ansible hosts. You're going to require a different set of authentication and inventory control tools. We walked through the process of setting up an Ansible environment and connecting it to AWS, and then running a simple playbook. Short and sweet.

This article comes from my book "Manage AWS Resources Using Ansible". There's more technology goodness - in the form of books, courses, and articles - available on my website, bootstrap-it.com.