Câu trả lời:
Tôi chưa bao giờ sử dụng Ansible nhưng kể từ một vài tuần, tôi cố gắng tìm hiểu xem Ansible có thể tốt như thế nào so với scrips Shell Điều đó chứng tỏ, ít nhất là trong trường hợp của tôi, rằng các chiến dịch quảng cáo ám ảnh mà họ chạy có hiệu quả! Sau nhiều lần thử không thành công, điều này chứng tỏ tài liệu của họ thất bại như thế nào khi trả lời một trong những câu hỏi rõ ràng nhất mà tôi nghĩ rằng cuối cùng tôi đã hiểu được:
Bây giờ, chúng ta hãy xem video giới thiệu và đi ngẫu nhiên như một người dùng mới tiềm năng thông qua tài liệu giới thiệu về Ansible ans hãy so sánh nó với những gì một lập trình viên có trình độ có thể tạo ra ngay lập tức.
Kết luận của tôi là về kịch bản shell, Ansible về cơ bản cung cấp 1. Khả năng kiểm tra xem hệ thống có đồng ý với trạng thái mong muốn không, 2. khả năng tích hợp với Ansible Tower, một hệ thống trả tiền dường như bao gồm khả năng giám sát. Trong một số trường hợp quan trọng, như khi triển khai mẫu máy chủ bất biến, điểm 1 có lẽ không hữu ích lắm, vì vậy danh sách, khá mỏng.
Kết luận của tôi là những lợi ích mà Ansible mang lại đối với kịch bản shell, như tài liệu trình bày về chúng, có thể hợp lý trong một số ít trường hợp lạc quan được bao phủ bởi các mô-đun có sẵn nhưng nhỏ hoặc thậm chí là giả thuyết trong trường hợp chung. Đối với một lập trình viên có trình độ tay nghề cao có lẽ, những lợi ích này rất có thể được cân bằng bởi các khía cạnh khác của sự đánh đổi.
Nhưng điều này có lẽ chỉ chứng minh tài liệu giới thiệu tệ đến mức nào!
Có một video bắt đầu nhanh chóng . Nó bắt đầu với một trang tuyên bố rằng, đây cũng không phải là những tuyên bố thực sự, đây là những danh sách gạch đầu dòng, một vật phẩm thường được sử dụng để đình chỉ phán quyết quan trọng trong các bài thuyết trình (vì logic không được hiển thị, nên nó không thể bị chỉ trích!)
1.1 Tự động hóa có thể đọc được của con người - Thông số kỹ thuật là tài liệu kỹ thuật, làm sao có thể
name: upgrade all packages
yum:
name: '*'
state: latest
dễ đọc hơn lời gọi yum tương ứng được tìm thấy trong shell-script? Hơn nữa, bất cứ ai có liên hệ với AppleScript đều chết cười khi họ đọc cuốn sách tự động hóa có thể đọc được của con người.
1.2 Không yêu cầu kỹ năng mã hóa đặc biệt - Mã hóa là gì nếu không viết thông số kỹ thuật chính thức? Họ có điều kiện, biến số, vì vậy, làm thế nào mà nó không mã hóa? Và tại sao tôi cần một cái gì đó tôi không thể lập trình, từ đó sẽ không linh hoạt? Tuyên bố là hạnh phúc không chính xác!
1.3 Các nhiệm vụ được thực hiện theo thứ tự - Chà, có thể một số người hâm mộ codegolf nhận thức được các ngôn ngữ thực thi các nhiệm vụ trong tình trạng rối loạn, nhưng thực thi các nhiệm vụ theo thứ tự hầu như không có vẻ gì đặc biệt.
1.4 Nhận năng suất nhanh chóng - Các lập trình viên có tay nghề hiện đang làm việc hiệu quả. Đối số phản biện này cũng nghiêm trọng như đối số ban đầu.
Một thủ thuật bán hàng phổ biến để bán đồ tạo tác là đánh lừa mọi người tin rằng họ sẽ có được quyền lực của các sản phẩm này. Lịch sử quảng cáo cho xe hơi hoặc đồ uống đẳng trương nên cung cấp một danh sách các ví dụ thuyết phục.
Ở đây Ansible có thể thực hiện triển khai ứng dụng trên mạng - nhưng kịch bản shell chắc chắn làm được, quản lý cấu hình của Google, nhưng đây chỉ là một tuyên bố về mục đích của công cụ, không phải là một tính năng và quy trình phối hợp công việc của Trọ có vẻ hơi tự phụ nhưng không có ví dụ nào ngoài những gì GNU Parallel có thể làm.
Để điền vào cột, họ đã viết bằng ba cách khác nhau rằng điều này chỉ cần ssh, mà mọi người đều biết là một daemon và không liên quan gì đến các tác nhân này trong việc quản lý cấu hình thế giới!
Phần còn lại của video giới thiệu hàng tồn kho, là danh sách tài nguyên tĩnh (như máy chủ) và trình bày cách triển khai Apache trên ba máy chủ cùng một lúc. Điều này thực sự không phù hợp với cách tôi làm việc, nơi tài nguyên rất năng động và có thể được liệt kê bằng công cụ dòng lệnh được cung cấp bởi nhà cung cấp đám mây của tôi và được sử dụng bởi các hàm shell của tôi bằng cách sử dụng |
toán tử đường ống . Ngoài ra, tôi không triển khai Apache trên ba máy chủ cùng một lúc, thay vào đó, tôi xây dựng một hình ảnh cá thể chủ mà sau đó tôi sử dụng để bắt đầu 3 cá thể là bản sao chính xác một trong những máy chủ khác. Vì vậy, phần dàn xếp của người Viking trong cuộc tranh luận có vẻ không phù hợp lắm.
EC2 là dịch vụ điện toán từ Amazon, tương tác với nó được hỗ trợ bởi một số mô-đun Ansible . (Các nhà cung cấp điện toán đám mây phổ biến khác cũng được cung cấp):
# 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
Kịch bản shell tương ứng về cơ bản sẽ giống hệt với YAML được thay thế bởi JSON:
provision_a_set_of_instances()
{
aws --output=text ec2 run-instances --image-id …
}
hoặc phiên bản 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
}
Cả hai phiên bản về cơ bản là giống hệt nhau, phần lớn tải trọng là phép liệt kê các giá trị khởi tạo trong cấu trúc YAML hoặc JSON.
Phần lớn nhất của hướng dẫn này không hiển thị bất kỳ tính năng thực sự thú vị nào: nó giới thiệu các biến (IIRC, shell script cũng có các biến)!, Và một mô-đun Ansible xử lý mysql, do đó, thay vì tìm kiếm sau, làm cách nào để tạo một người dùng mysql với các đặc quyền trên XY Lần và kết thúc bằng một cái gì đó như
# Create Application DB User
mysql --host "${mysql_host}" --user "${mysql_user}" --password "${mysql_password}" "${mysql_table}" <<EOF
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
EOF
bạn tìm kiếm sau khi làm thế nào để tôi tạo một người dùng mysql với các đặc quyền trên XY trong một trò chơi ansible và kết thúc bằng
- name: Create Application DB User
mysql_user: name={{ dbuser }} password={{ upassword }}
priv=*.*:ALL host='%' state=present
Sự khác biệt có lẽ vẫn không có ý nghĩa lắm. Trên trang đó, chúng tôi cũng phát hiện ra rằng Ansible có ngôn ngữ lập trình meta mẫu
{% for host in groups['monitoring'] %}
-A INPUT -p tcp -s {{ hostvars[host].ansible_default_ipv4.address }} --dport 5666 -j ACCEPT
{% endfor %}
Khi tôi nhìn thấy điều này, tôi thực sự ở trong vùng thoải mái của tôi. Kiểu lập trình meta đơn giản cho các ngôn ngữ khai báo này hoàn toàn giống với mô hình lý thuyết giống như BSD Makefiles! Điều mà tôi tình cờ đã lập trình rộng rãi Đoạn trích này cho chúng ta thấy rằng lời hứa làm việc với tệp YAML đã bị phá vỡ (vì vậy tôi không thể chạy các playbook của mình thông qua trình phân tích cú pháp YAML, ví dụ ). Nó cũng cho chúng ta thấy rằng Ansible phải thảo luận về nghệ thuật tinh tế của trật tự đánh giá: chúng ta phải quyết định xem các biến có được mở rộng tại phần khai báo của ngôn ngữ hay của phần ngôn ngữ hay không bắt buộc của ngôn ngữ. Ở đây lập trình shell đơn giản hơn, không có lập trình meta, ngoài nguồn cung cấp kịch bản rõ ràng eval
hoặc bên ngoài. Đoạn trích vỏ tương đương giả thuyết sẽ là
enumerate_group 'monitoring' | {
while read host; do
…
done
}
có độ phức tạp so với biến thể Ansible có thể chấp nhận được: nó chỉ sử dụng các cấu trúc đơn giản, thông thường, nhàm chán từ ngôn ngữ.
Cuối cùng, chúng ta gặp những gì hóa ra là tính năng thực sự thú vị đầu tiên của Ansible: Tài nguyên Ansible là mô hình của trạng thái mong muốn. Như vậy, không cần thiết phải kiểm tra các dịch vụ được bắt đầu, các gói được cài đặt hay những thứ khác. Ansible là hệ thống sẽ đảm bảo những điều này là đúng. Thay vào đó, hãy khẳng định những điều này trong vở kịch của bạn. Bây giờ nó bắt đầu hơi thú vị, nhưng:
Ngoài một số tình huống tiêu chuẩn dễ dàng thực hiện bởi các mô-đun có sẵn, tôi sẽ phải tự cung cấp các bit thực hiện kiểm tra, điều này có thể sẽ liên quan đến một số lệnh shell.
Việc kiểm tra sự phù hợp của các cài đặt có thể không phù hợp lắm trong bối cảnh mẫu máy chủ bất biến được triển khai: nơi tất cả các hệ thống đang chạy thường được sinh ra từ một hình ảnh chính (ví dụ hình ảnh hoặc hình ảnh docker) và không bao giờ được cập nhật - chúng được thay thế bởi mới thay thế.
Các tài liệu giới thiệu từ Ansible bỏ qua câu hỏi về khả năng bảo trì. Về cơ bản không có hệ thống loại, kịch bản lệnh shell có thể dễ dàng duy trì JavaScript, Lisp hoặc Python: chỉ có thể thực hiện tái cấu trúc mở rộng với sự trợ giúp của một thử nghiệm tự động mở rộng - hoặc ít nhất là các thiết kế cho phép thử nghiệm tương tác dễ dàng. Điều đó nói rằng, trong khi shell script là ngôn ngữ chung từ cấu hình và bảo trì hệ thống, gần như mỗi ngôn ngữ lập trình có một giao diện với shell. Do đó, hoàn toàn khả thi để tận dụng lợi thế bảo trì của các ngôn ngữ nâng cao, bằng cách sử dụng chúng để kết dính các bit khác nhau của các bit cấu hình shell. Đối với OCaml, tôi đã viết Rashell về cơ bản cung cấp một số mẫu tương tác phổ biến cho các quy trình con, điều này làm cho việc dịch các tập lệnh cấu hình sang OCaml về cơ bản là tầm thường.
Về phía Ansible, cấu trúc playbook rất yếu và sự hiện diện của tính năng lập trình meta làm cho tình huống về cơ bản trở nên tồi tệ như đối với kịch bản shell, với điểm trừ là không rõ ràng làm thế nào để viết bài kiểm tra đơn vị cho Ansible và đối số giới thiệu ad-hoc một ngôn ngữ cấp cao hơn có thể được bắt chước.
Tài liệu của Ansible thu hút sự chú ý về sự cần thiết của việc viết các bước cấu hình tạm thời. Chính xác hơn, các bước cấu hình nên được viết để trình tự bước aba có thể được đơn giản hóa thành ab , tức là chúng ta không cần lặp lại bước cấu hình. Đây là một điều kiện mạnh hơn so với idempotency. Vì Ansible cho phép Playbook sử dụng các lệnh shell tùy ý, bản thân Ansible không thể đảm bảo rằng điều kiện mạnh hơn này được tôn trọng. Điều này chỉ dựa vào kỷ luật của lập trình viên.
Khi bạn đặt nó theo cách này, ngay cả khi Ansible có một số lợi thế vốn có, lợi ích của việc sử dụng các công cụ quen thuộc (trong trường hợp này là kịch bản shell) phải được đánh giá cao hơn. Tôi không nghĩ rằng có một câu trả lời rõ ràng cho điều đó.
Nếu nhóm có thể đạt được những điều Ansible cung cấp với shell:
sau đó họ có thể có thể gắn bó với những gì họ biết.
Rốt cuộc, bạn có thể thực hiện "vệ sĩ" trong BASH. Bạn có thể tìm thấy rất nhiều công việc BASH hiện có để giải quyết nhiều tác vụ cấu hình máy chủ (về cơ bản là bất kỳ Dockerfile nào có 90% mã cài đặt bash). Bạn có thể nhận được khá gần với những gì Ansible / Salt / Chef-Zero cung cấp cho bạn mà không cần phải chuyển toàn bộ giải pháp hiện có của bạn sang các công cụ đó.
Đó là một hành động cân bằng giữa các khuynh hướng của NIH (không được phát minh ở đây) và đưa ra các kịch bản tốt, được thiết lập để ủng hộ một giải pháp mạnh mẽ hơn.
Một lưu ý cuối cùng cần ghi nhớ: làm thế nào để ngăn xếp công nghệ của bạn đo lường khi bạn cố gắng tuyển thêm người vào nhóm. Tìm kiếm những người có trải nghiệm Ansible dễ dàng hơn rất nhiều so với tìm kiếm những người có kinh nghiệm trong công cụ CM scripting tại nhà cụ thể của bạn. Đây không hoàn toàn là một xem xét kỹ thuật, hơn nữa là một văn hóa. Bạn có muốn trở thành một org kỳ lạ phát minh ra Ansible của chính nó, hay bạn muốn trở thành một org hợp lý tìm ra công cụ phù hợp cho công việc? Những quyết định đó ảnh hưởng đến khả năng vẽ tài năng của bạn.
Câu trả lời trên bao gồm một phần của nó nhưng bỏ lỡ một trong những yếu tố quan trọng: thiết kế hội tụ. Tôi đã viết một số từ trước đây về điều này trong bối cảnh của Chef tại https://coderanger.net/thinking/ nhưng phiên bản ngắn là một tập lệnh bash là một tập hợp các hướng dẫn, trong khi một Playbook Ansible (hoặc công thức Chef, Salt trạng thái, vv) là một mô tả về trạng thái mong muốn. Bằng cách ghi lại trạng thái bạn muốn thay vì các bước bạn muốn thực hiện để đến đó, bạn có thể đối phó với nhiều trạng thái bắt đầu hơn. Đây là trung tâm của Lý thuyết Hứa hẹn như đã nêu trong CFEngine từ lâu và một thiết kế mà chúng tôi (các công cụ quản lý cấu hình) tất cả đã được sao chép kể từ đó.
tl; dr Mã Ansible nói những gì bạn muốn, mã bash nói cách làm một việc.
Một điều đáng chú ý là bạn sẽ có ít vấn đề hơn trong việc chạy các playbook ansible của mình trên các máy chủ từ xa. Vì đó là lý do chính để chạy ansible. Khi bạn đang sử dụng shell scripting, bạn vẫn cần có một cách để script scp'ing đến máy chủ từ xa.
Đó là năm 2019 và tôi vừa trải qua một vài ngày cho một đường cong học tập có thể hiểu được và đây là sự thật tuyệt đối: Ansible không đáng để gặp rắc rối.
chưa kết thúc, nó không chạy trên windows và sự kết hợp giữa cấu hình YAML và thông báo lỗi gây hiểu lầm sẽ khiến mắt bạn chảy máu. Có vẻ như gần như cố tình khủng khiếp và tôi có nghĩa là nghiêm túc. Đây rõ ràng là sản phẩm của một dự án phía nhà phát triển sysadins thất vọng. Có lẽ là một hipster.
Nếu bạn không yêu cầu any.of các tính năng của nó ngoài việc cung cấp và bạn chỉ được cung cấp trên một HĐH cụ thể. Vì lợi ích, hãy viết một shell.script đàng hoàng.
Ngay bây giờ, toàn bộ dự án làm tôi nhớ đến các diễn đàn linux ban đầu, nơi các noobs được nói với RTFM và chế giễu vì đã hỏi tại sao ai đó không thể viết GUI để định cấu hình cài đặt đồ họa. Bạn không hiểu nó phải không? Bạn nên bám vào cửa sổ ... có lẽ tôi sẽ giao phối .. hạnh phúc VI-ing.
Sử dụng Docker. Ưu tiên cho bất cứ điều gì. Docker cực kỳ đơn giản và mạnh mẽ.
Nhưng nếu bạn hoàn toàn phải cung cấp trên thiếc có sẵn thì sao? Các lựa chọn thay thế thực sự là gì?
Chà ... không có gì cả. Nhưng tôi sẽ hứa với bạn điều này, trừ khi ansible trở nên tốt hơn, sẽ sớm thôi. Bởi vì dù các fanboy có đẩy nó mạnh đến đâu, và tha thứ cho những thất bại của nó ... đó là 5 trên 10 cho nỗ lực.
SCP lên một kịch bản bash, và tự cứu mình khỏi rắc rối.