2016-03-03 18 views
5

Tôi bị kẹt. Googled địa ngục ra khỏi Web và không thể tìm thấy một câu trả lời.Làm cách nào để phân biệt giữa dàn dựng/sản xuất với khoảng không quảng cáo động?

Tôi đã sử dụng Ansible trong nhiều năm nhưng luôn có khoảng không quảng cáo tĩnh. Để phân biệt giữa các môi trường khác nhau như dàn dựng và sản xuất, tôi đã sử dụng các tệp khoảng không quảng cáo tĩnh khác nhau, tương ứng là stagingproduction. Khi tôi cần đến các máy chủ cung cấp dàn, tôi muốn làm:

ansible-playbook site.yml -i staging 

Khi tôi muốn làm tương tự cho sản xuất, tôi muốn làm:

ansible-playbook site.yml -i production 

Cả dàn dựng và sản xuất cần biến với nhau giá trị, vì vậy tôi có group_vars/staginggroup_vars/production. Tất cả tốt và theo thực hành tốt nhất.

Bây giờ, tôi cần cung cấp EC2 phiên bản trong AWS. Tôi đang sử dụng this AWS guide. Tôi có một playbook với hai vở kịch. Đầu tiên là chạy với localhost, tạo/tìm các phiên bản EC2 bắt buộc trong AWS và điền một nhóm với add_host. Lần chơi thứ hai sử dụng nhóm đó để chạy với các cá thể EC2 được phát hiện trong lần chơi đầu tiên. Tất cả theo hướng dẫn đó.

Tất cả đều hoạt động tốt ngoại trừ một điều. Tôi không có ý tưởng làm thế nào để xác định môi trường để cung cấp và do đó các biến bắt buộc không được tải từ group_vars/(staging|production). Về cơ bản, những gì tôi muốn là một cái gì đó tương tự như -i (staging|production) Tôi đã sử dụng tất cả những năm này với hàng tồn kho tĩnh, nhưng có vẻ như việc sử dụng -i không có ý nghĩa bởi vì khoảng không quảng cáo là động. Tôi muốn một cách để có thể tải các biến số từ group_vars/staging hoặc group_vars/production dựa trên một đối số mà tôi chuyển đến ansible-playbook khi tôi chạy biến đó.

Tôi làm như thế nào? Thực hành tốt nhất là gì?

+0

Có lẽ bạn có thể làm điều gì đó với các sách chơi riêng? Một cái gì đó như production.yml và staging.yml. Những cuốn sách sau đó sẽ bao gồm site.yml, nhưng cũng bao gồm các vv cụ thể của env. –

Trả lời

3

Trong khi tôi không chắc chắn làm thế nào để làm điều đó với moduel EC2 ansible như chúng ta không sử dụng nó để xây dựng hộp từ mức ansible, có một cách đơn giản để có được những gì bạn muốn với ec2 external inventory script và đơn giản thiết lập trong inventories/main của bạn. Những gì bạn cần làm là thiết lập ec2.pyec2.ini bên trong số inventories của bạn để nó sẽ được sử dụng làm nguồn của các phiên bản. Đảm bảo bỏ ghi chú group_by_tag_keys = True bên trong số ec2.ini.

Bước tiếp theo là phân biệt trường hợp nào xảy ra ở đâu. Mặc dù có nhiều phương pháp lựa chọn có sẵn trong ec2.py, tôi thích gắn thẻ cụ thể từng trường hợp cho phù hợp. Vì vậy, tất cả các trường hợp của tôi có một thẻ gọi là environment được điền phù hợp (trong trường hợp của bạn nó sẽ là dàn dựng hoặc sản xuất). Sau đó, tất cả còn lại là để xử lý nó bên trong của bạn inventories/main, và đây là một ví dụ nhỏ làm thế nào để làm điều đó.

Trước tiên, bạn phải xác định nhóm sản phẩm nào cho thẻ bạn muốn sử dụng:

[tag_environment_staging] 

[tag_environment_production] 

vì vậy chúng tôi sau này có thể tham khảo đối với họ. Sau đó tất cả những gì còn lại cần làm là chỉ định các nhóm đó là trẻ em cho các giai đoạn thích hợp. Vì vậy, sau đó tệp tối thiểu của chúng tôi sẽ trông giống như sau:

[tag_environment_staging] 

[tag_environment_production] 

[staging:children] 
tag_environment_staging 

[production:children] 
tag_environment_production 

Và ở đó bạn đi.Kể từ bây giờ, mọi ví dụ được lấy từ ec2 thông qua tập lệnh kiểm kê động kèm theo thẻ môi trường sẽ được khớp với cấu hình thích hợp trong group_vars. Tất cả bạn phải nhớ rằng khi giao dịch với hàng tồn kho năng động, bạn muốn có điểm -i tại inventories thư mục thay vì tệp cụ thể để nó hoạt động đúng.

+0

Các phần như '[tag_environment_staging]' đã giả định rằng có các trường hợp được gắn thẻ. Điều gì xảy ra nếu tôi muốn sử dụng Ansible để thực sự * tạo * các thẻ đó và * tag * instances với chúng? Để làm điều đó đúng, tôi cần một số biến 'env' thành' staging' * trước * Tôi thậm chí còn bắt đầu tìm nạp dữ liệu từ AWS. Trước khi tôi chạy playbook, tài khoản AWS của chúng tôi rất sạch sẽ và không có gì ở đó cả. –

+0

Gắn thẻ chính nó là dễ dàng và [đặt ra gọn gàng trong tài liệu] (http://docs.ansible.com/ansible/guide_aws.html#provisioning). Sau đó, tất nhiên bạn cần phải chuyển sang playbook những gì sắp xếp của giai đoạn bạn đang triển khai, đó là một cách sử dụng khá đơn giản của extra_vars hoặc env. –

+0

Tôi có bộ biến - hơn một chục biến - cho mỗi môi trường. Tôi có vượt qua mỗi người trong số họ với '-e' mỗi lần tôi cần cung cấp/triển khai cho từng môi trường không? Đó chính là điều mà câu hỏi đặt ra là: làm cách nào để tạo ra 'group_vars/(dàn dựng | sản xuất) 'kỳ diệu bao gồm cách họ làm khi sử dụng hàng tồn kho tĩnh? –

2

Tôi có vấn đề tương tự với khoảng không quảng cáo động nhưng đối với Openstack. Các giải pháp tôi đã đưa ra cho đến nay là sử dụng một biến môi trường để xác định xem tôi muốn nhắm mục tiêu các dàn dựng hoặc môi trường sản xuất. Nó cũng có thể áp dụng cho trường hợp của bạn. Trong thiết lập của chúng tôi $OS_PROJECT_NAMEstage hoặc prod. Trong ansible.cfg thiết

inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py 

Sau đó, chúng tôi có các biến nhóm cụ thể môi trường dưới

inventories/(stage|prod)/group_vars/ 

Nhược điểm là bạn phải có kịch bản kiểm kê ở hai nơi hoặc có nó symlinked. Cũng hãy coi chừng rằng các nhóm nhóm tìm thấy liên quan đến thư mục playbook sẽ vẫn ghi đè lên nhóm các nhóm kiểm kê.

+1

Đây là cách tiếp cận tôi thấy tốt nhất sau những ngày tìm kiếm trên Internet và đọc sách ... Điều kỳ lạ là khía cạnh khá quan trọng này của Ansible không được ghi chép đầy đủ. – DejanLekic

Các vấn đề liên quan