ทีมดูแลระบบไอทีที่มีประสบการณ์ในการใช้เชลล์สคริปต์เพื่อแก้ปัญหาของพวกเขากำลังพิจารณาที่จะเริ่มใช้ Ansible แทน
มีความแตกต่างและเหตุผลที่ดีในการเริ่มใช้ Ansible vs. เพื่อดำเนินการเขียนเชลล์สคริปต์ต่อไปหรือไม่
ทีมดูแลระบบไอทีที่มีประสบการณ์ในการใช้เชลล์สคริปต์เพื่อแก้ปัญหาของพวกเขากำลังพิจารณาที่จะเริ่มใช้ Ansible แทน
มีความแตกต่างและเหตุผลที่ดีในการเริ่มใช้ Ansible vs. เพื่อดำเนินการเขียนเชลล์สคริปต์ต่อไปหรือไม่
คำตอบ:
ฉันไม่เคยใช้ Ansible แต่หลังจากสองสามสัปดาห์ฉันพยายามคิดว่า Ansible ที่ดีนั้นสามารถเปรียบเทียบกับ shell scrips - ซึ่งพิสูจน์ได้อย่างน้อยในกรณีของฉันว่าแคมเปญโฆษณาที่หลอกหลอนพวกเขาทำงานมีประสิทธิภาพ! หลังจากความพยายามไม่สำเร็จหลายครั้ง - ซึ่งพิสูจน์ว่าเอกสารของพวกเขาล้มเหลวในการตอบคำถามที่ชัดเจนที่สุด - ฉันคิดว่าในที่สุดฉันก็เข้าใจ:
ตอนนี้เรามาดูวิดีโอแนะนำและสุ่มไปเป็นผู้ใช้ใหม่ที่มีศักยภาพผ่านวัสดุแนะนำเพื่อ Ansible และลองเปรียบเทียบกับสิ่งที่โปรแกรมเมอร์เชลล์ผู้ชำนาญสามารถผลิตชั้นวางได้ทันที
ข้อสรุปของฉันคือการเขียนสคริปต์เชลล์โดยทั่วไป Ansible นำเสนอ 1. ความเป็นไปได้ในการตรวจสอบว่าระบบเห็นด้วยกับสถานะที่ต้องการ 2. ความสามารถในการรวมเข้ากับ Ansible Tower ซึ่งเป็นระบบการจ่ายเงินที่ดูเหมือนจะรวมถึงความสามารถในการตรวจสอบ ในบางกรณีที่สำคัญเช่นเมื่อใช้รูปแบบเซิร์ฟเวอร์ที่ไม่เปลี่ยนรูปแบบจุดที่ 1 อาจไม่ได้มีประโยชน์มากดังนั้นรายการจึงค่อนข้างบาง
ข้อสรุปของฉันคือประโยชน์ที่นำเสนอโดย Ansible มากกว่าการเขียนสคริปต์เชลล์ตามเอกสารที่นำเสนออาจมีเหตุผลในบางกรณีที่มองโลกในแง่ดีที่ครอบคลุมโดยโมดูลที่มีอยู่ แต่มีขนาดเล็กหรือแม้กระทั่งสมมุติในกรณีทั่วไป สำหรับโปรแกรมเมอร์ที่มีทักษะเชลล์อาจได้รับประโยชน์เหล่านี้โดยส่วนใหญ่มีความสมดุลในด้านอื่น ๆ ของการแลกเปลี่ยน
แต่นี่อาจเป็นเพียงการพิสูจน์ว่าเนื้อหาการแนะนำนั้นแย่แค่ไหน!
มีความเป็นวิดีโอเริ่มต้นอย่างรวดเร็ว มันเริ่มต้นด้วยหน้าเว็บที่อ้างว่า…สิ่งเหล่านี้ไม่ได้อ้างสิทธิ์จริง ๆ นี่เป็นรายการหัวข้อย่อยสิ่งประดิษฐ์ที่ใช้กันทั่วไปเพื่อระงับการตัดสินที่สำคัญในการนำเสนอ
1.1 ระบบอัตโนมัติที่มนุษย์สามารถอ่านได้ - ข้อมูลจำเพาะเป็นเอกสารทางเทคนิค
name: upgrade all packages
yum:
name: '*'
state: latest
อ่านง่ายกว่าการเรียกใช้yum ที่สอดคล้องกันที่พบใน shell-script หรือไม่ นอกจากนี้ทุกคนที่มีการติดต่อกับ AppleScript ก็จะหัวเราะเมื่อพวกเขาอ่าน“ ระบบอัตโนมัติที่มนุษย์สามารถอ่านได้”
1.2 ไม่จำเป็นต้องมีทักษะการเข้ารหัสพิเศษ - การเข้ารหัสคืออะไรหากไม่ได้เขียนข้อกำหนดอย่างเป็นทางการ? พวกเขามีเงื่อนไขตัวแปรดังนั้นมันไม่ได้เข้ารหัสอย่างไร และทำไมฉันถึงต้องการบางสิ่งบางอย่างที่ฉันไม่สามารถเขียนโปรแกรมได้ คำสั่งไม่ถูกต้องอย่างมีความสุข!
1.3 งานที่ดำเนินการตามลำดับ - บางทีผู้สนใจรัก codegolfบางคนอาจทราบภาษาที่ใช้งานในความผิดปกติ แต่การดำเนินงานตามลำดับนั้นดูไม่ค่อยโดดเด่น
1.4 รับผลได้อย่างรวดเร็ว - โปรแกรมเมอร์ที่มีทักษะเชลล์กำลังทำงานอย่างมีประสิทธิภาพในขณะนี้ ข้อโต้แย้งนี้รุนแรงพอ ๆ กับอาร์กิวเมนต์เริ่มต้น
เคล็ดลับการขายที่ได้รับความนิยมในการขายสิ่งของคือการหลอกคนให้เชื่อว่าพวกเขาจะได้รับ“ พลัง” ของสิ่งประดิษฐ์เหล่านี้ ประวัติความเป็นมาของการโฆษณารถยนต์หรือเครื่องดื่มไอโซโทนิกควรเป็นตัวอย่างที่น่าเชื่อถือ
Ansible สามารถทำ "การปรับใช้แอพ" - แต่เชลล์สคริปต์ทำอย่างแน่นอน "การจัดการการกำหนดค่า" แต่นี่เป็นเพียงคำแถลงจุดประสงค์ของเครื่องมือไม่ใช่ฟีเจอร์และ "เวิร์กโฟลว์การประสานงาน" ซึ่งดูเหมือนว่าจะอวดรู้ แต่ไม่มีตัวอย่างเลย เหนือสิ่งที่GNU Parallelสามารถทำได้
ในการเติมคอลัมน์นั้นพวกเขาเขียนด้วยมารยาทที่แตกต่างกันสามแบบซึ่งสิ่งนี้ต้องการเพียงssh เท่านั้นซึ่งทุกคนรู้ดีว่าเป็นdaemonและไม่มีอะไรเกี่ยวข้องกับตัวแทนเหล่านี้ที่แผ่ขยายการจัดการการกำหนดค่าโลก!
ส่วนที่เหลือของวิดีโอแนะนำสินค้าคงเหลือซึ่งเป็นรายการทรัพยากรคงที่ (เช่นเซิร์ฟเวอร์) และสาธิตวิธีการปรับใช้ Apache บนเซิร์ฟเวอร์สามเครื่องพร้อมกัน สิ่งนี้ไม่ตรงกับวิธีการทำงานของฉันซึ่งทรัพยากรมีความเคลื่อนไหวสูงและสามารถระบุได้โดยการใช้เครื่องมือบรรทัดคำสั่งจากผู้ให้บริการคลาวด์ของฉันและใช้ฟังก์ชั่นเชลล์โดยใช้|
โอเปอเรเตอร์ไพพ์ นอกจากนี้ฉันไม่ได้ปรับใช้ Apache บนเซิร์ฟเวอร์สามเครื่องพร้อมกัน แต่ฉันสร้างอิมเมจอินสแตนซ์ต้นแบบที่ฉันใช้เพื่อเริ่มต้น 3 อินสแตนซ์ซึ่งเป็นเรพลิคาที่แน่นอนจากอีกอันหนึ่ง ดังนั้น "การเตรียมการ" ส่วนหนึ่งของการโต้แย้งจึงไม่ได้เกี่ยวข้องกันมากนัก
EC2 เป็นบริการคำนวณจาก Amazon มีปฏิสัมพันธ์กับมันได้รับการสนับสนุนโดยบางโมดูลเบิ้ล (ผู้ให้บริการคลาวด์ที่ได้รับความนิยมอื่น ๆ ก็มีให้เช่นกัน):
# demo_setup.yml
- hosts: localhost
connection: local
gather_facts: False
tasks:
- name: Provision a set of instances
ec2:
key_name: my_key
group: test
instance_type: t2.micro
image: "{{ ami_id }}"
wait: true
exact_count: 5
count_tag:
Name: Demo
instance_tags:
Name: Demo
register: ec2
เชลล์สคริปต์ที่สอดคล้องกันนั้นจะเหมือนกับ YAML ที่ถูกแทนที่ด้วย JSON:
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --image-id …
}
หรือเวอร์ชัน JSON
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --cli-input-json "$(provision_a_set_of_instances__json)"
}
provision_a_set_of_instances__json()
{
cat <<EOF
{
"ImageId": …
}
EOF
}
ทั้งสองเวอร์ชันมีความเหมือนกันส่วนใหญ่ของเพย์โหลดคือการแจกแจงของค่าเริ่มต้นในโครงสร้าง YAML หรือ JSON
ส่วนที่ใหญ่ที่สุดของคู่มือนี้ไม่แสดงคุณลักษณะที่น่าสนใจใด ๆ : แนะนำตัวแปร (IIRC, เชลล์สคริปต์ยังมีตัวแปร)!, และโมดูล Ansible จัดการกับ mysql ดังนั้นถ้าแทนที่จะค้นหาหลังจาก "ฉันจะสร้างผู้ใช้ mysql อย่างไร ด้วยสิทธิพิเศษใน XY” และจบลงด้วยสิ่งที่ชอบ
# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF
คุณค้นหาหลังจาก“ฉันจะสร้างผู้ใช้ MySQL ที่มีสิทธิ์ในการ XY ในเบิ้ล ” และจบลงด้วย
- name: Create Application DB User
mysql_user: name={{ dbuser }} password={{ upassword }}
priv=*.*:ALL host='%' state=present
ความแตกต่างยังคงมีความหมายไม่มาก ในหน้านั้นเรายังค้นพบว่า Ansible มีภาษาเมตาโปรแกรมมิ่งเทมเพลต
{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}
เมื่อฉันเห็นสิ่งนี้ฉันจะอยู่ในเขตความสะดวกสบายของฉัน การเขียนโปรแกรมเมตาแบบง่าย ๆ สำหรับภาษาที่ประกาศนี้เป็นกระบวนทัศน์ทางทฤษฎีเหมือนกับ BSD Makefiles! สิ่งที่ฉันเกิดขึ้นกับการตั้งโปรแกรมอย่างกว้างขวางข้อความที่ตัดตอนมานี้แสดงให้เราเห็นว่าสัญญาของการทำงานกับไฟล์ YAML เสีย (ดังนั้นฉันจึงไม่สามารถรัน playbooks ของฉันผ่านตัวแยกวิเคราะห์ YAML เช่น ) นอกจากนี้ยังแสดงให้เราเห็นว่า Ansible ต้องถกกันถึงความละเอียดอ่อนของลำดับการประเมิน: เราต้องตัดสินใจว่าตัวแปรจะถูกขยายในส่วน "ที่เปิดเผย" ของภาษาหรือที่ meta-part ของภาษา การเขียนโปรแกรมเชลล์ทำได้ง่ายกว่าไม่มีการเขียนโปรแกรมเมตานอกเหนือจากการจัดหาสคริปต์อย่างชัดเจน eval
หรือภายนอก ข้อความที่ตัดตอนมาเทียบเท่ากับสมมติฐานจะเป็น
enumerate_group 'monitoring' | {
while read host; do
…
done
}
ซึ่งความซับซ้อนในการเปรียบเทียบกับตัวแปร Ansible น่าจะยอมรับได้: มันใช้โครงสร้างที่เรียบง่ายปกติและน่าเบื่อจากภาษา
สุดท้ายเราพบสิ่งที่กลายเป็นคุณสมบัติที่น่าสนใจจริงๆแรกของ Ansible:“ ทรัพยากร Ansible เป็นแบบจำลองของรัฐที่ต้องการ ดังนั้นจึงไม่จำเป็นต้องทดสอบว่าเริ่มให้บริการหรือไม่แพคเกจติดตั้งหรืออื่น ๆ Ansible เป็นระบบที่จะทำให้แน่ใจว่าสิ่งเหล่านี้เป็นจริงอย่างชัดเจน แต่จงยืนยันสิ่งเหล่านี้ใน playbooks ของคุณ” ตอนนี้มันเริ่มน่าสนใจเล็กน้อย แต่:
นอกเหนือจากสถานการณ์มาตรฐานจำนวนหนึ่งที่ถูกนำไปใช้อย่างง่ายดายโดยโมดูลที่มีอยู่ฉันจะต้องป้อนบิตที่ใช้ในการทดสอบด้วยตัวเองซึ่งอาจจะเกี่ยวข้องกับคำสั่งเชลล์บางส่วน
การตรวจสอบความสอดคล้องของการติดตั้งอาจไม่เกี่ยวข้องกันมากในบริบทที่มีการใช้รูปแบบเซิร์ฟเวอร์ที่ไม่เปลี่ยนรูปแบบ: โดยทั่วไปแล้วระบบทั้งหมดที่ทำงานอยู่จะถูกวางไข่จากอิมเมจต้นแบบ (เช่นอิมเมจอินสแตนซ์หรืออิมเมจ Docker เป็นต้น) ใหม่แทน
วัสดุเบื้องต้นจาก Ansibleไม่สนใจคำถามของการบำรุงรักษา โดยพื้นฐานแล้วไม่มีระบบพิมพ์เชลล์สคริปต์จะมีความง่ายในการบำรุงรักษา JavaScript, Lisp หรือ Python: การปรับโครงสร้างที่กว้างขวางสามารถทำได้สำเร็จด้วยความช่วยเหลือของชุดทดสอบอัตโนมัติที่กว้างขวาง ที่กล่าวว่าในขณะที่การเขียนสคริปต์เชลล์เป็นภาษากลางจากการกำหนดค่าระบบและการบำรุงรักษาเกือบทุกภาษาการเขียนโปรแกรมมีส่วนต่อประสานกับเชลล์ ดังนั้นจึงเป็นไปได้โดยสิ้นเชิงที่จะใช้ประโยชน์จากความสามารถในการบำรุงรักษาของภาษาขั้นสูงโดยใช้ภาษาเหล่านี้เพื่อประสานบิตส่วนต่าง ๆ ของการกำหนดค่าเชลล์ สำหรับ OCaml ฉันเขียนRashell ที่เป็นหลักให้รูปแบบการโต้ตอบทั่วไปสำหรับกระบวนการย่อยซึ่งทำให้การแปลสคริปต์การกำหนดค่าเป็น OCaml เป็นเรื่องเล็กน้อย
ด้านข้างจาก Ansible โครงสร้างที่อ่อนแอมากของ playbooks และการปรากฏตัวของคุณสมบัติการเขียนโปรแกรมเมตาทำให้สถานการณ์เลวร้ายอย่างที่มันเป็นสำหรับเชลล์สคริปต์ด้วยจุดลบที่ไม่ชัดเจนว่าจะเขียนหน่วยทดสอบสำหรับ Ansible อย่างไร และอาร์กิวเมนต์ของการแนะนำ ad-hoc ภาษาระดับสูงกว่าไม่สามารถเลียนแบบได้
เอกสารของ Ansible ดึงความสนใจไปที่ความจำเป็นในการเขียนขั้นตอนการกำหนดค่า idempotent แม่นยำยิ่งขึ้นควรเขียนขั้นตอนการกำหนดค่าเพื่อให้ลำดับขั้นตอนabaสามารถทำให้เป็นabได้ง่ายขึ้นนั่นคือเราไม่จำเป็นต้องทำขั้นตอนการกำหนดค่าซ้ำ นี่คือเงื่อนไขที่แข็งแกร่งกว่า idempotency เนื่องจาก Ansible อนุญาตให้ playbooks ใช้คำสั่งเชลล์โดยพลการ Ansible เองจึงไม่สามารถรับประกันได้ว่าสภาพที่แข็งแรงกว่านี้จะได้รับการเคารพ สิ่งนี้ต้องอาศัยวินัยของโปรแกรมเมอร์เท่านั้น
เมื่อคุณใช้วิธีนี้แม้ว่า Ansible จะมีข้อได้เปรียบโดยธรรมชาติประโยชน์ของการใช้เครื่องมือที่คุ้นเคย (ในกรณีนี้คือการเขียนสคริปต์เชลล์) จะต้องมีน้ำหนักเกิน ฉันไม่คิดว่าจะมีคำตอบที่ชัดเจนสำหรับเรื่องนี้
หากทีมสามารถบรรลุสิ่งที่ Ansible เสนอด้วยกระสุน:
จากนั้นพวกเขาอาจจะยึดติดกับสิ่งที่พวกเขารู้
ท้ายที่สุดคุณสามารถใช้ "guards" ใน BASH คุณสามารถค้นหางานที่มีอยู่ของ BASH จำนวนมากได้ที่นั่นเพื่อแก้ปัญหาการกำหนดค่าเซิร์ฟเวอร์ที่หลากหลาย คุณสามารถเข้าใกล้สิ่งที่ Ansible / Salt / Chef-Zero เสนอให้คุณได้โดยไม่ต้องเปลี่ยนโซลูชันที่มีอยู่ทั้งหมดของคุณไปยังเครื่องมือเหล่านั้น
มันเป็นการกระทำที่สมดุลระหว่างแนวโน้มของ NIH (ไม่ได้ประดิษฐ์ขึ้นที่นี่) และสร้างสคริปต์ที่ดีและสร้างผลงานได้ดี
ข้อควรพิจารณาประการสุดท้ายที่ควรคำนึงถึง: เทคโนโลยีของคุณจะวัดกองซ้อนได้อย่างไรเมื่อคุณพยายามสรรหาคนเข้าร่วมทีมมากขึ้น การค้นหาคนที่มีประสบการณ์ Ansible นั้นง่ายกว่าการหาคนที่มีประสบการณ์ในเครื่องมือ CM ของสคริปต์ที่ปลูกในบ้านของคุณ นี่ไม่ใช่การพิจารณาทางเทคนิคอย่างเคร่งครัด แต่เป็นวัฒนธรรมมากกว่า คุณต้องการที่จะเป็นองค์กรที่แปลกประหลาดที่ประดิษฐ์ Ansible ของตัวเองหรือคุณต้องการที่จะเป็นองค์กรที่เหมาะสมที่พบเครื่องมือที่เหมาะสมสำหรับงานหรือไม่ การตัดสินใจเหล่านั้นส่งผลต่อความสามารถของคุณในการวาดพรสวรรค์
คำตอบข้างต้นครอบคลุมส่วนหนึ่งของมัน แต่พลาดองค์ประกอบที่สำคัญอย่างหนึ่ง: การออกแบบบรรจบกัน ฉันเขียนบางคำเมื่อไม่นานมานี้เกี่ยวกับสิ่งนี้ในบริบทของ Chef ที่https://coderanger.net/thinking/แต่เวอร์ชันสั้นคือสคริปต์ทุบตีเป็นชุดของคำแนะนำในขณะที่ Playbook Ansible (หรือสูตรเชฟ, Salt state, etc) เป็นคำอธิบายของสถานะที่ต้องการ ด้วยการจัดทำเอกสารสถานะที่คุณต้องการแทนที่จะทำตามขั้นตอนที่คุณต้องการเพื่อไปที่นั่นคุณสามารถรับมือกับสถานะเริ่มต้นได้มากขึ้น นี่เป็นหัวใจสำคัญของทฤษฎีสัญญาว่ามีการอธิบายไว้ใน CFEngine มานานแล้วและการออกแบบที่เรา (เครื่องมือจัดการการกำหนดค่า) ได้ทำสำเนาทั้งหมดตั้งแต่นั้นมา
tl; dr Ansible code บอกว่าคุณต้องการ bash code บอกว่าจะทำอะไรได้บ้าง
สิ่งหนึ่งที่ควรค่าแก่การสังเกตว่าคุณจะมีปัญหาน้อยลงในการใช้งานเพลย์บุ๊ค ansible บนโฮสต์ระยะไกลก็เช่นกัน เนื่องจากเป็นเหตุผลหลักในการรัน ansible เมื่อคุณใช้เชลล์สคริปต์คุณยังจำเป็นต้องมีสคริปต์สคริปต์ scp'ing ไปยังโฮสต์ระยะไกล
มันเป็นปี 2019 และฉันเพิ่งใช้เวลาสองสามวันไปกับช่วงการเรียนรู้ที่เกี่ยวกับการ ansible และนี่คือความจริงที่แท้จริง: Ansible ไม่คุ้มกับปัญหา
ยังไม่เสร็จสมบูรณ์มันไม่ทำงานบน windows และการรวมกันของ YAML config และข้อความแสดงข้อผิดพลาดที่ทำให้เข้าใจผิดจะทำให้ตาของคุณมีเลือดออก ดูเหมือนว่าเกือบจะน่ากลัวอย่างจงใจและฉันก็หมายความว่าอย่างจริงจัง เห็นได้ชัดว่าเป็นผลิตภัณฑ์ของโครงการด้านนักพัฒนาที่น่าผิดหวัง น่าจะเป็นฮิปสเตอร์
หากคุณไม่ต้องการคุณสมบัติใด ๆ เลยเกินกว่าการตั้งสำรองและคุณจะจัดสรรเฉพาะในระบบปฏิบัติการเดียวเท่านั้น เพื่อเห็นแก่ pities เขียน shell.script ที่เหมาะสม
ณ ตอนนี้โครงการทั้งหมดทำให้ฉันนึกถึงฟอรัม linux ก่อนโดยที่ noobs ได้รับคำสั่งให้ RTFM และดูถูกว่าทำไมมีคนไม่สามารถเขียน GUI สำหรับการตั้งค่ากราฟิก คุณแค่ไม่เข้าใจใช่มั้ย คุณควรติดกับหน้าต่าง ... บางทีฉันอาจจะหาคู่ .. มีความสุข VI-ing
ใช้นักเทียบท่า ในสิ่งที่ชอบ นักเทียบท่านั้นเรียบง่ายและทรงพลัง
แต่ถ้าหากคุณต้องเตรียมแร่ดีบุกไว้ล่วงหน้า ทางเลือกที่แท้จริงคืออะไร?
อืม ... ยังไม่มีเลย แต่ฉันจะสัญญากับคุณว่าหากไม่มีสิ่งที่ดีกว่านี้อีกจะมีในไม่ช้า เพราะไม่ว่าแฟนบอยจะผลักมันแรงแค่ไหนและให้อภัยกับความล้มเหลว ... มันเป็น 5 ใน 10 ของความพยายาม
SCP ขึ้นสคริปต์ทุบตีและช่วยตัวเองให้รอด