Làm thế nào tôi nên lưu trữ các biến môi trường của tôi?


11

Đây là một câu hỏi rất rộng về các phương pháp và lời khuyên liên quan đến các biến / cấu trúc môi trường. Nhưng cuối cùng tôi đang tìm kiếm câu trả lời cho câu hỏi rất cụ thể về 'Tôi nên lưu trữ các biến môi trường của mình như thế nào?'

Trước hết là một số làm rõ:

  • Một môi trường với tôi có thể từ 3 đến 10 máy chủ và là cách chứa cơ sở hạ tầng cụ thể của khách hàng.
  • Bên trong mỗi môi trường có một vài biến chủ yếu được tạo tự động từ một vài đầu vào chính (tên, kích thước, v.v.).

Vì hiện tại chúng tôi đang lưu trữ tất cả các biến môi trường của chúng tôi trong một cấu trúc như vậy:

<playbook>.yml                   # Various playbooks for deployment
roles/windows                    # Ansible role for Ubuntu
roles/ubuntu                     # Ansible role for Ubuntu
config/hosts/<name>.yml          # Ansible inventory
config/hosts/vars/<name>.json    # Environment specific variables 

Ngay bây giờ cấu hình được khởi tạo như một mô hình con trong kho git ở trên. Vì tệp biến thay đổi khá thường xuyên, điều này đã gây ra sự cố với dữ liệu thay đổi, một lần, hai lần hoặc thậm chí ba lần giữa các lần xác nhận, việc thay đổi ngày càng khó theo dõi.

Theo cá nhân tôi thấy nó sẽ phát triển về phía trước, chúng ta nên tìm cách lưu trữ tất cả các biến khách hàng của mình theo cách tập trung / có thể mở rộng và sau đó móc vào đó với một kho lưu trữ động với .

Tôi hiểu rằng có một vài công nghệ dường như là một phần của những gì có thể được yêu cầu như Lãnh sự nhưng chúng dường như hoạt động tốt nhất trong môi trường phục vụ một ứng dụng lớn thay vì nhiều ứng dụng khác nhau nhỏ hơn một chút.

Về cơ bản, tôi thấy chúng tôi phải viết một kịch bản kiểm kê và sau đó chuyển tất cả dữ liệu của chúng tôi vào một số cơ sở dữ liệu được xây dựng không nhằm mục đích và sau đó tiếp tục như thể không có gì thay đổi. Tôi thấy điều này có thể hình dung như một cách để có khả năng cắt giảm rất nhiều dữ liệu chúng ta hiện đang lưu trữ và có lẽ xem xét các cách lưu trữ dữ liệu khác nhau thay vì chỉ mở rộng những gì phục vụ lại.

Tôi hy vọng ai đó có một số loại kinh nghiệm trong việc triển khai cơ sở hạ tầng dưới dạng mã khi phải xử lý nhiều môi trường nhỏ hơn so với một, hai hoặc ba môi trường lớn.

Bất kỳ đề xuất?

Câu trả lời:


13

Tôi đã có hai lần thực hiện các biến môi trường theo cách có thể mở rộng và cả hai đều không hoàn hảo bởi vì, như tôi đã khám phá ra, là một điều rất khó để làm đúng. Tôi sẽ đưa ra một bản tóm tắt về cả hai kinh nghiệm của tôi dưới đây:

Yếu tố chung

  • Các biến môi trường được lưu trữ trong một kho lưu trữ riêng biệt từ mã nguồn ban đầu (chúng được gửi cùng nhau nhưng vẫn dựa trên các repos riêng)
  • Có một quá trình "xây dựng" riêng cho tạo phẩm và đó là các biến.
  • không một quá trình phát hành riêng lẻ cho các biến môi trường. Nếu bạn muốn thay đổi các biến môi trường, bạn cần trải qua các bảng đánh giá thay đổi tương tự và thông thường

Sử dụng cặp lãnh sự KV

Các biến môi trường được tải từ kho lưu trữ giả (không bao giờ là repo git gốc) và được tải vào cây cặp KV được đặt tên, ví dụ

/env/dev1/my/application/v1.1.1

Trong đó dev1 trước là tên của môi trường, my / application là không gian tên ứng dụng và v1.1.1 là phiên bản của các biến môi trường sẽ sử dụng.

Để các nhà phát triển tất cả những điều này là vô hình. Trong thời gian chạy, nền tảng kiểm tra xem môi trường có tồn tại trong cụm lãnh sự hiện tại không (nếu nó không có vấn đề gì và nó bị lỗi), thì nó sẽ kiểm tra cây con cho không gian tên ứng dụng (theo cách này không thể có ô nhiễm chéo trong đó một ứng dụng tham chiếu các vars ứng dụng khác) sau đó số phiên bản của cấu hình được lấy từ nhãn được kết nối với tạo phẩm có thể triển khai. Cập nhật nhãn này là điều quan trọng ở đây bởi vì nếu chúng ta mất cả hai trung tâm dữ liệu sản xuất, chúng ta có thể bảo vệ môi trường một lần nữa bằng cách đọc dữ liệu meta từ các tạo phẩm có thể triển khai của chúng ta và tải tất cả các biến môi trường vào cửa hàng KV.

Luôn luôn có vấn đề với Cách tiếp cận này Các nhà phát triển, và ý tôi là mỗi lần, đã tìm ra cách để thay đổi cấu hình vào môi trường có tác động đáng kể đến cách ứng dụng sẽ chạy. Bởi vì nó luôn luôn dễ dàng được thay đổi cấu hình được phê duyệt hơn thay đổi mã.

Lưu trữ một Artifact "Triển khai" với các biến được nhúng

Điều này kết hợp chặt chẽ phiên bản chính xác của tạo tác với phiên bản cấu hình. Nếu bạn thay đổi cấu hình thì bạn phải xây dựng lại tạo tác triển khai này.

Bản thân phần tử triển khai thực chất là một tệp yaml chứa URL tới tệp nhị phân có thể tin cậy và tất cả các cấu hình được đính kèm.

Nền tảng chứa thành phần để đọc các biến và sau đó đưa chúng vào cây quy trình của ứng dụng khi nó khởi động.

Điều này cho đến nay đã thành công hơn rất nhiều vì có một cổ vật chúng ta có thể theo dõi lịch sử và chúng ta có thể giữ bất kỳ bảng đánh giá nào và nói rằng "đây là hiện vật duy nhất chúng ta quan tâm, chúng ta không cần nhìn vào bất kỳ thay đổi nào khác, chỉ thay đổi đối với điều này "(ví dụ: Phiên bản ứng dụng để triển khai, bao gồm các biến môi trường, v.v.

Điều này khiến các nhà phát triển cố gắng hơn một chút để thử và xây dựng logic vào ứng dụng của họ, điều này sẽ thay đổi hành vi của nó dựa trên các biến để họ có thể thay đổi mà không cần trải qua các chu kỳ thử nghiệm thích hợp.

Điểm thưởng

Xem xét bí mật ứng dụng. Giải pháp của chúng tôi cho đến nay là cung cấp khóa RSA công khai mà các nhóm phát triển sử dụng để mã hóa kho lưu trữ khóa Java mở rộng (hầu như mọi ngôn ngữ đều có thư viện ở đâu đó có thể đọc các kho lưu trữ khóa Java), sau đó được coi như một loại tạo tác thứ ba và được kéo lên máy chủ, được giải mã bằng khóa riêng của nền tảng của chúng tôi và được cung cấp cho ứng dụng vào thời gian chạy.

Phải thừa nhận quản lý bí mật là con giun của riêng nó. Nhưng nó có lẽ đáng để xem xét.


2
Re: bí mật ứng dụng, tôi khuyên bạn nên xem Vault ( vaultproject.io ) vì đây cũng là một phần của chuỗi công cụ của Hashicorp và tích hợp khá gọn gàng với Consul (và các công cụ khác từ hộp đó)
Michael Bravo

Tôi thực sự đã bị choáng ngợp bởi vault khi biết công cụ hashicorp tuyệt vời thường như thế nào. Về cơ bản, ba lỗ hổng lớn trong sản phẩm của họ so với phần còn lại của thị trường - 1. 'Bí mật cho những bí mật' về cơ bản là những gì mô hình đạt được. Tôi nhận được shending hoặc sử dụng một HSM. Nhưng thực chất đó chỉ là giao dịch bí mật. 2. Khả năng tương thích công cụ, không giống như các công cụ khác của họ không có hỗ trợ cho plugin 3. Giá cả. Tôi đã không tin điều đó khi nói với công ty rằng tôi nghĩ rằng kho tiền là đắt đỏ. Họ đã từ chối các sản phẩm vì quá rẻ, nó đã gây rối. Nhưng hầm rất nhiều đến nỗi họ thậm chí không xem xét nó.
hvindin 17/03/2017

Điều đáng chú ý là chỉ cấm chi phí nếu bạn sử dụng phiên bản trả phí . Sản phẩm cốt lõi của Vault là nguồn mở. Tất nhiên họ không liệt kê giá cho các phiên bản pro / doanh nghiệp trên trang web của họ, vì vậy tôi không biết nó có thể hợp lý như thế nào đối với các phiên bản đó.
Adrian

Hừm, tôi đã không nhận thấy sự thiếu sót từ nhận xét của mình, mặc dù công bằng mà nói, hai vấn đề đầu tiên của tôi với vault vẫn đứng vững. Mặc dù, để đủ điều kiện, đó là những suy nghĩ của tôi về vault so với các sản phẩm hashicorp khác, tất cả chúng tôi nghĩ là khá tuyệt vời. So với các sản phẩm khác trên thị trường, chức năng tương tự có thể ngang bằng, chỉ vì một số lý do đắt hơn rất nhiều so với dự kiến.
hvindin

Bạn có thể đưa ra một ví dụ về "xây dựng logic vào ứng dụng của họ sẽ thay đổi hành vi của nó dựa trên các biến để họ có thể thay đổi mà không cần trải qua các chu kỳ thử nghiệm thích hợp."? Nghe có vẻ như một cái gì đó thực sự phổ biến, nhưng tôi không thể tưởng tượng ra một ví dụ cụ thể.
kenchew

3

Nếu môi trường của bạn là trên mỗi khách hàng, tôi sẽ đề nghị trong trường hợp cụ thể của bạn để có một kho lưu trữ cho mỗi khách hàng . . Bạn sẽ git mô đun mã vào các kho lưu trữ. Tôi có thể sẽ làm điều đó trong nhiều kho lưu trữ. Một cho các vai trò và mô-đun có thể tìm thấy, một cho các kịch bản bảo trì và triển khai, một cho mỗi ứng dụng chính chạy trong môi trường.

Bây giờ bạn có thể tùy ý thực sự phân tách mã hoặc bằng cách ghim mô hình con vào thẻ cụ thể để phát hành , đảm bảo rằng mã quản lý môi trường của khách hàng sẽ không thay đổi trừ khi được kiểm tra và phát hành.

Nếu bạn đang sử dụng kho lưu trữ tạo tác , hãy đảm bảo rằng các tạo phẩm được tạo đúng phiên bản và các phiên bản đó được chỉ định trong các biến môi trường đúng cách.

Tự động hóa rất quan trọng vì các biến môi trường không nên được cập nhật bởi con người nếu có thể, nhưng được tạo bởi các tập lệnh. Đảm bảo rằng gần như không có cập nhật thủ công trong kho của mỗi khách hàng và nhà phát triển chỉ cập nhật kho lưu trữ mã. Nếu họ muốn thực hiện thay đổi cấu hình, thì nên thực hiện một trong các tập lệnh tạo, sau đó được chạy để tạo các biến và diff được cam kết vào kho lưu trữ của khách hàng. Nó trả tiền để thiết lập tích hợp liên tục cho quá trình này. Nếu không có điều này tại một số điểm sẽ có quá nhiều kho lưu trữ để duy trì .


Chỉ có một ý kiến ​​phản đối: các bí mật không nên vào kho lưu trữ kiểm soát phiên bản trừ khi nó có hỗ trợ kiểm soát truy cập nghiêm ngặt. Git không - bất cứ ai kéo kho lưu trữ đều có thể thấy các bí mật, đây có thể là một vấn đề - chúng không còn là bí mật nữa.
Dan Cornilescu

Nắm bắt tốt. Đó là bí mật được mã hóa. Các khóa giải mã là tramient.
Jiri Klouda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.