Thứ năm, 26/02/2015 | 00:00 GMT+7

Cách tự động thêm server mới vào hệ thống quản lý cấu hình của bạn


Giới thiệu

Sử dụng dịch vụ metadata DigitalOcean, administrator có thể cung cấp hướng dẫn cho phép các server mới tự động cấu hình . Mặc dù điều này hữu ích nhưng nhiều tổ chức muốn xử lý tất cả cấu hình cơ sở hạ tầng của họ trong một công cụ quản lý cấu hình như Chef hoặc Puppet.

Trong hướng dẫn này, ta sẽ trình bày cách khởi động server DigitalOcean bằng dịch vụ metadata và CloudInit để kết nối với triển khai quản lý cấu hình hiện có. Cấu hình thực của server sau đó có thể được xử lý bởi dịch vụ quản lý cấu hình. Ta sẽ trình bày cách khởi động cả hai nút Chef và Puppet.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn sẽ phải làm quen với dịch vụ metadata DigitalOcean. Bạn có thể tìm hiểu thêm về cách nhập thông tin vào và truy xuất thông tin từ dịch vụ metadata trong hướng dẫn này .

Hướng dẫn này sẽ tận dụng một loại tập lệnh được gọi là cloud-config được sử dụng khi khởi động lần đầu tiên bởi dịch vụ CloudInit trên Server để thực hiện cấu hình chạy lần đầu. Bạn nên làm quen cơ bản với các tập lệnh cloud-config , cú pháp và hành vi của chúng để hiểu rõ hơn về cách sửa đổi các tập lệnh được trình bày trong hướng dẫn này. Bạn có thể tìm thấy phần giới thiệu về tập lệnh cấu hình cloud tại đây . Để có ví dụ thực tế hơn (cùng với một số thảo luận về các hạn chế của định dạng), bạn có thể đọc hướng dẫn của ta về cách thực hiện một số tác vụ cơ bản bằng cách sử dụng cloud-config tại đây .

Sử dụng tập lệnh cấu hình cloud để khởi động nút đầu bếp

Sử dụng dịch vụ metadata DigitalOcean, bạn có thể dễ dàng kết nối các server mới của bạn vào cơ sở hạ tầng do Chef kiểm soát hiện có với cloud-config lệnh cloud-config .

Để thêm server mới của bạn vào hệ thống này, bạn phải có một server Chef được cấu hình mà server mới của bạn có thể liên hệ để nhận hướng dẫn cấu hình. Nếu bạn cần trợ giúp triển khai server Chef và máy trạm quản lý, bạn có thể làm theo hướng dẫn này để bắt đầu.

Kế hoạnh tổng quát

Khi một server mới được đưa lên mạng, nó phải được đặt dưới sự kiểm soát của server Chef. Thông thường, điều này có thể được thực hiện bằng cách kết nối với server mới bằng lệnh quản lý knife và sử dụng lệnh con bootstrap . Điều này sẽ kết nối với server mới, cài đặt client Chef và thông tin xác thực cho phép nút mới kết nối với server Chef. Sau đó, ứng dụng client Chef kết nối với server , tự xác thực, nhận thông tin xác thực của ứng dụng client mới, kéo cấu hình của nó xuống từ server và thực hiện bất kỳ hành động nào cần thiết để đưa chính nó vào trạng thái mong muốn.

Trong hướng dẫn này, ta sẽ sử dụng tập lệnh cloud-config để thay thế bước khởi động thủ công, cho phép nút mới tự động kết nối với server Chef, tự xác thực, nhận thông tin đăng nhập của ứng dụng client và thực hiện chạy ứng dụng client Chef ban đầu. Server sẽ tự động thực hiện việc này khi khởi động lần đầu mà không cần bất kỳ hỗ trợ thủ công nào từ administrator .

Thu thập dữ liệu cần thiết từ file cấu hình dao

Để tập lệnh cloud-config của ta khởi động thành công, nó cần quyền truy cập vào thông tin đăng nhập thường có sẵn cho lệnh knife .Cụ thể, ta cần những thông tin sau:

  • Tên xác thực The Chef
  • Khóa xác thực
  • URL nơi có thể truy cập server Chef

Tất cả thông tin này có sẵn, ở định dạng chính xác, trong file cấu hình knife trên máy trạm được sử dụng để quản lý cơ sở hạ tầng Chef. Bên trong Chef repo, nên có một folder ẩn được gọi là .chef chứa file này.

Giả sử rằng Chef repo của bạn nằm trong folder chính của bạn trên máy trạm và được gọi là chef-repo , bạn có thể xuất nội dung của file bằng lệnh :

cat ~/chef-repo/.chef/knife.rb

Các phần thông tin bạn cần được đánh dấu bên dưới:

current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
node_name                "jellingwood"
client_key               "#{current_dir}/jellingwood.pem"
validation_client_name   "digitalocean-validator"
validation_key           "#{current_dir}/digitalocean-validator.pem"
chef_server_url          "https://your_server.com/organizations/digitalocean"
syntax_check_cache_path  "#{ENV['HOME']}/.chef/syntaxcache"
cookbook_path            ["#{current_dir}/../cookbooks"]

Tên xác thực và URL server Chef có thể được lấy trực tiếp từ file . Sao chép các giá trị này để bạn có thể sử dụng chúng trong file cloud-config .

Khoá validation_key chỉ đến vị trí khoá thực sự được giữ. Trong ví dụ trên, điều này cho biết nó nằm trong cùng folder với file knife.rb và được gọi là digitalocean-validator.pem . Điều này có thể sẽ khác đối với cấu hình của bạn.

Ta cần nội dung của file này, vì vậy hãy sử dụng lại lệnh cat . Sửa đổi lệnh để trỏ nó đến vị trí được cung cấp cho khóa trình xác thực của bạn:

cat ~/chef-repo/.chef/digitalocean-validator.pem

Bạn sẽ thấy một private key RSA:

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA3O60HT5pwEo6xUwcZ8WtExBUhoL3bTjlsvHVXg1JVmBUES+f
V9jLu2N00uSZEDZneCIQyHLBXnqD/UNvWEPNvPzt1ecXzmw2BytB7lPDW4/F/8tJ
vAVrKqC7B04VFGmcFY2zC8gf8BWmX8CNRDQooM7UO5OWe/H6GDGPPRIITerO3GrU

. . .

sWyRAoGBAKNc/ZUM8ljRV0UJxQ9nbdozXRZjtUaNgXMNiw+oP2HYYdHrlkKnGHYJ
Js63rvjpq8pocjE8YI+2H0v4/4uWqW8GEBfrWbLMzGsYPnRyiHR5+hgjCUU50RB3
eFoNbURwLYcq2Z/IAQZpDpJWpofz3OVMpMXtei1cIflrAAd2wtWO
-----END RSA PRIVATE KEY-----

Sao chép toàn bộ khóa xác thực để bạn có thể sử dụng nó trong tập lệnh cloud-config ngay lập tức.

Cài đặt ứng dụng client Cloud-Config Chef cơ bản

Khi bạn có dữ liệu ở trên, bạn có thể xây dựng tập lệnh. Cấu hình Chef có thể được thực hiện thông qua một module cloud-config chuyên dụng cloud-config tên là chef . cloud-config phải chứa YAML hợp lệ và phải có #cloud-config làm dòng đầu tiên của script.

Bắt đầu, tập lệnh của bạn sẽ giống như sau:

#cloud-config
chef:

Tài liệu cloud-config tuyên bố có thể cài đặt ứng dụng client Chef từ Ruby gem, một gói hoặc sử dụng phương pháp cài đặt “omnibus” truyền thống. Tuy nhiên, trong thực tế, cả phương thức gem và package đều có xu hướng không thành công, vì vậy ta sẽ sử dụng phương pháp “omnibus”. Mặc dù thường không cần thiết, ta cũng sẽ liệt kê rõ ràng vị trí của trình cài đặt omnibus.

Ta sẽ đặt force_install thành “false”. Bằng cách này, nếu vì lý do nào đó, ứng dụng client Chef đã được cài đặt trên hình ảnh (ví dụ: nếu bạn đang triển khai từ một ảnh chụp nhanh), ứng dụng client sẽ không được cài đặt lại. Lúc này, tập lệnh của ta trông giống như sau:

#cloud-config
chef:
  install_type: "omnibus"
  omnibus_url: "https://www.opscode.com/chef/install.sh"
  force_install: false

Tiếp theo, ta có tùy chọn chọn tên cho server mới trong cơ sở hạ tầng Chef bằng cách sử dụng chỉ thị node_name . Nếu bạn không đặt điều này, Chef sẽ sử dụng tên server của server , vì vậy đây là tùy chọn. Tuy nhiên, điều này phải là duy nhất trong môi trường Đầu bếp của bạn.

Sau đó, ta có thể thêm tất cả thông tin kết nối mà ta đã lấy từ máy trạm Chef của bạn . Ta sẽ đặt tùy chọn server_url vào vị trí của server Chef chính xác như trong file knife.rb Điều này cũng đúng với tùy chọn validation_name .

Đối với khóa xác thực, ta sẽ sử dụng ký hiệu ống YAML ( | ) để nhập toàn bộ khóa xác thực mà ta tìm thấy trên máy trạm:

#cloud-config
chef:
  install_type: "omnibus"
  omnibus_url: "https://www.opscode.com/chef/install.sh"
  force_install: false
  node_name: "new_node"
  server_url: "https://your_server.com/organizations/digitalocean"
  validation_name: "digitalocean-validator"
  validation_key: |
    -----BEGIN RSA PRIVATE KEY-----
    MIIEowIBAAKCAQEA3O60HT5pwEo6xUwcZ8WtExBUhoL3bTjlsvHVXg1JVmBUES+f
    V9jLu2N00uSZEDZneCIQyHLBXnqD/UNvWEPNvPzt1ecXzmw2BytB7lPDW4/F/8tJ
    vAVrKqC7B04VFGmcFY2zC8gf8BWmX8CNRDQooM7UO5OWe/H6GDGPPRIITerO3GrU

    . . .

    sWyRAoGBAKNc/ZUM8ljRV0UJxQ9nbdozXRZjtUaNgXMNiw+oP2HYYdHrlkKnGHYJ
    Js63rvjpq8pocjE8YI+2H0v4/4uWqW8GEBfrWbLMzGsYPnRyiHR5+hgjCUU50RB3
    eFoNbURwLYcq2Z/IAQZpDpJWpofz3OVMpMXtei1cIflrAAd2wtWO
    -----END RSA PRIVATE KEY-----

Đến đây, tập lệnh của bạn có tất cả các xác thực cần thiết để kết nối với server Chef của bạn và tạo thông tin xác thực khách hàng.

Cấu hình Môi trường Chef, run_list và Thuộc tính

Mặc dù các chi tiết trên cung cấp đủ thông tin để client kết nối với server Chef, nhưng ta chưa cung cấp cho nút này bất kỳ thông tin nào về cách thực sự tự cấu hình. Ta cũng có thể cung cấp thông tin này trong tập lệnh cloud-config .

Để chỉ định môi trường mà nút mới sẽ được đặt vào, hãy sử dụng tùy chọn environment . Nếu điều này không được đặt, môi trường _default sẽ được đặt, đây là mặc định chung cho các node Chef chưa được cấp môi trường khác.

chef:
  environment: "staging"

run_list của ta có thể được chỉ định như một danh sách đơn giản các mục mà khách hàng nên áp dụng theo thứ tự. Đây có thể là công thức nấu ăn hoặc role .

chef:
  run_list:
    - "recipe[lamp]"
    - "role[backend-web]"

Bạn có thể chỉ định các thuộc tính ban đầu của nút mới bằng cách sử dụng cấu trúc phân cấp initial_attributes . Điều này sẽ đặt các thuộc tính ban đầu sẽ ảnh hưởng đến cách run_list được áp dụng:

chef:
  initial_attributes:
    lamp:
      apache:
        port: 80
      mysql:
        username: webclient
        pass: $#fjeaiop34S

Khi được nối với tập lệnh cloud-config trước đó, nó có thể trông giống như sau:

#cloud-config
chef:
  install_type: "omnibus"
  omnibus_url: "https://www.opscode.com/chef/install.sh"
  force_install: false
  node_name: "new_node"
  server_url: "https://your_server.com/organizations/digitalocean"
  validation_name: "digitalocean-validator"
  validation_key: |
    -----BEGIN RSA PRIVATE KEY-----
    MIIEowIBAAKCAQEA3O60HT5pwEo6xUwcZ8WtExBUhoL3bTjlsvHVXg1JVmBUES+f
    V9jLu2N00uSZEDZneCIQyHLBXnqD/UNvWEPNvPzt1ecXzmw2BytB7lPDW4/F/8tJ
    vAVrKqC7B04VFGmcFY2zC8gf8BWmX8CNRDQooM7UO5OWe/H6GDGPPRIITerO3GrU

    . . .

    sWyRAoGBAKNc/ZUM8ljRV0UJxQ9nbdozXRZjtUaNgXMNiw+oP2HYYdHrlkKnGHYJ
    Js63rvjpq8pocjE8YI+2H0v4/4uWqW8GEBfrWbLMzGsYPnRyiHR5+hgjCUU50RB3
    eFoNbURwLYcq2Z/IAQZpDpJWpofz3OVMpMXtei1cIflrAAd2wtWO
    -----END RSA PRIVATE KEY-----
  environment: "staging"
  run_list:
    - "recipe[lamp]"
    - "role[backend-web]"
  initial_attributes:
    lamp:
      apache:
        port: 80
      mysql:
        username: webclient
        pass: $#fjeaiop34S

Chuyển hướng kết quả và cấu hình chạy ứng dụng client Chef

Tập lệnh trên chứa tất cả các thông tin cần thiết trong phần chef: Tuy nhiên, có một số điều khác ta nên làm bằng cách sử dụng một số module cloud-config khác.

Đầu tiên, ta nên xác định rằng ta muốn chuyển hướng kết quả từ mọi lệnh và lệnh con vào log kết quả của quy trình CloudInit. Điều này được đặt tại /var/log/cloud-init-output.log theo mặc định. Ta có thể làm điều này với module output như sau:

output: {all: '| tee -a /var/log/cloud-init-output.log'}

Điều khác ta muốn làm là cài đặt trình khách Chef để thực sự chạy sau khi nó đã được cài đặt và cấu hình. Tại thời điểm viết bài này, phương pháp cài đặt omnibus không tự động thực hiện việc này.

Ta có thể buộc hành vi này bằng cách đợi cho đến khi file thực thi chef-client được cài đặt trên server trước khi gọi lệnh. Sử dụng một vòng lặp bash đơn giản, ta sẽ kiểm tra sự tồn tại của file này sau mỗi năm giây. Khi nó được tìm thấy, ta sẽ chạy chef-client hàng để triển khai cấu hình ban đầu mà ta đã chỉ định.

Mô-đun runcmd được dùng để đưa ra các lệnh tùy ý. Đó là vị trí lý tưởng cho vòng lặp bash của ta :

runcmd:
  - while [ ! -e /usr/bin/chef-client ]; do sleep 5; done; chef-client

Ngoài ra, theo tùy chọn, bạn có thể thêm một chỉ thị cloud-config khác để định tuyến điểm cuối metadata sau lần khởi động đầu tiên. Điều này rất hữu ích vì ta đang đặt private key vào dữ liệu user của bạn . Không cần định tuyến null điểm cuối metadata , mọi user trên server cũng có thể truy cập điều này. Thực hiện điều này bằng cách thêm:

disable_ec2_metadata: true

Kết hợp những điều này với tập lệnh mà ta đã xây dựng cho đến nay, ta có thể có được tập lệnh hoàn chỉnh cần thiết để khởi động nút của ta và kết nối nó với cơ sở hạ tầng Chef của ta :

#cloud-config
chef:
  install_type: "omnibus"
  omnibus_url: "https://www.opscode.com/chef/install.sh"
  force_install: false
  node_name: "new_node"
  server_url: "https://your_server.com/organizations/digitalocean"
  validation_name: "digitalocean-validator"
  validation_key: |
    -----BEGIN RSA PRIVATE KEY-----
    MIIEowIBAAKCAQEA3O60HT5pwEo6xUwcZ8WtExBUhoL3bTjlsvHVXg1JVmBUES+f
    V9jLu2N00uSZEDZneCIQyHLBXnqD/UNvWEPNvPzt1ecXzmw2BytB7lPDW4/F/8tJ
    vAVrKqC7B04VFGmcFY2zC8gf8BWmX8CNRDQooM7UO5OWe/H6GDGPPRIITerO3GrU

    . . .

    sWyRAoGBAKNc/ZUM8ljRV0UJxQ9nbdozXRZjtUaNgXMNiw+oP2HYYdHrlkKnGHYJ
    Js63rvjpq8pocjE8YI+2H0v4/4uWqW8GEBfrWbLMzGsYPnRyiHR5+hgjCUU50RB3
    eFoNbURwLYcq2Z/IAQZpDpJWpofz3OVMpMXtei1cIflrAAd2wtWO
    -----END RSA PRIVATE KEY-----
  environment: "staging"
  run_list:
    - "recipe[lamp]"
    - "role[backend-web]"
  initial_attributes:
    lamp:
      apache:
        port: 80
      mysql:
        username: webclient
        pass: $#fjeaiop34S
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
  - while [ ! -e /usr/bin/chef-client ]; do sleep 5; done; chef-client
disable_ec2_metadata: true

Tập lệnh trên có thể được điều chỉnh khi cần thiết cho mỗi server mới trong cơ sở hạ tầng của bạn.

Sử dụng tập lệnh cấu hình cloud để khởi động nút rối

Nếu cơ sở hạ tầng của bạn dựa vào Puppet để quản lý cấu hình, bạn có thể sử dụng module puppet để thay thế. Giống như ví dụ Chef, việc khởi động nút Puppet bao gồm việc sử dụng cloud-config để gắn server mới vào cơ sở hạ tầng quản lý cấu hình hiện có.

Trước khi bắt đầu, bạn nên cấu hình server Puppet master cho cơ sở hạ tầng của bạn . Nếu bạn cần trợ giúp để cài đặt và chạy server Puppet , hãy xem hướng dẫn này .

Kế hoạnh tổng quát

Khi một server Puppet mới được đưa trực tuyến, một tác nhân Puppet được cài đặt để nó có thể giao tiếp với server Puppet . Tác nhân này chịu trách nhiệm nhận và áp dụng thông tin chỉ định trạng thái mong muốn của nút. Để thực hiện việc này, tác nhân kết nối với chính, tải lên dữ liệu về chính nó, kéo danh mục hiện tại mô tả trạng thái mong muốn xuống và thực hiện các hành động cần thiết để đạt được trạng thái đó.

Tuy nhiên, trước khi điều này xảy ra, trong lần chạy đầu tiên, tác nhân phải tự đăng ký với server chính. Nó tạo ra một yêu cầu ký certificate và gửi nó đến cái để ký. Thông thường, tác nhân sẽ kết nối lại định kỳ với chính cho đến khi certificate được ký, nhưng bạn có thể cấu hình Puppet của bạn để tự động ký các yêu cầu đến với các đặc điểm nhất định nếu điều đó phù hợp với môi trường của bạn ( ta sẽ đề cập đến vấn đề này sau).

Sử dụng tập lệnh cloud-config của ta , ta sẽ cấu hình server mới với thông tin mà nó cần để kết nối với server lần đầu tiên. Tại thời điểm đó, nó có thể truy xuất chi tiết cấu hình từ server Puppet master dưới dạng một danh mục.

Thu thập dữ liệu cần thiết từ Puppet Master

Điều đầu tiên ta cần làm trước khi xây dựng file cloud-config của bạn là thu thập dữ liệu từ server chính của Puppet mà ta cần kết nối. Ta chỉ cần một vài thông tin.

Đầu tiên, bạn cần lấy domain đủ điều kiện của server Puppet master (FQDN). Bạn có thể thực hiện việc này bằng lệnh :

hostname -f

Trong hầu hết các trường hợp, nó sẽ trả về thông tin như sau:

puppet.example.com

Bạn cũng có thể kiểm tra file cấu hình chính Puppet của bạn để xem liệu tùy chọn dns_alt_names được đặt chưa:

cat /etc/puppet/puppet.conf
. . .

dns_alt_names = puppet,puppet.example.com

. . .

Nếu certificate SSL của trình điều khiển puppet của bạn được tạo sau khi cài đặt các tùy chọn này, chúng cũng có thể sử dụng được.

Vật phẩm khác mà ta cần thu thập là certificate của cơ quan cấp certificate Puppet master. Bạn có thể tìm thấy điều này trong /var/lib/puppet/ssl/certs/ca.pem hoặc /var/lib/puppet/ssl/ca/ca_crt.pem :

sudo cat /var/lib/puppet/ssl/certs/ca.pem

Kết quả trông như sau :

-----BEGIN CERTIFICATE-----
MIIFXjCCA0agAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDDBFQdXBw
ZXQgQ0E6IHB1cHBldDAeFw8xNTAyMTkxOTA0MzVaFw0yMDAyMTkxOTA0MzVaMBwx
GjAYBgNVBAMMEVB1cHBldCBDQTogcHVwcGV0MIICIjANBgkqhkiG9w0BAQEFAAOC

. . .

arsjZT5/CtIhtP33Jl3mCp7U2F6bsk4/GDGRaAsFXjJHvBbL93NzgpkZ7elf0zUP
rOcSGrDrUuzuJk8lEAtrZr/IfAgfKKXPqbyYF95V1qN3OMY+aTcrK20XTydKVWSe
l5UfYGY3S9UJFrSn9aBsZzN+10HXPkaFKo7HxpztlYyJNI8UVSatcRF4aYYqt9KR
UClnR+2WxK5v7ix0CVd4/KpYH/6YivvyTwxrhjF2AksZKg==
-----END CERTIFICATE-----

Sao chép toàn bộ certificate . Ta sẽ đưa thông tin này vào file cloud-config của bạn để các server mới của ta có thể xác minh chúng đang kết nối với chính Puppet .

Khi bạn có những thông tin này, bạn có thể bắt đầu xây dựng file cloud-config để server mới có thể tự cắm vào cơ sở hạ tầng Puppet hiện có.

Cài đặt nút rối cấu hình cloud cơ bản

cloud-config hình cloud-config cho các node Puppet mới khá đơn giản. Tất cả cấu hình dành riêng cho Puppet đều nằm trong phần puppet: của file . Như với mọi file cloud-config , dòng đầu tiên phải chứa #cloud-config riêng:

#cloud-config
puppet:

Bên dưới điều này, chỉ có hai phần phụ. Đầu tiên là khóa ca_cert . Điều này sẽ sử dụng ký tự ống dẫn để bắt đầu một khối văn bản YAML để certificate CA có thể được cung cấp toàn bộ dưới dạng một khối được thụt lề:

#cloud-config
puppet:
  ca_cert: |
    -----BEGIN CERTIFICATE-----
    MIIFXjCCA0agAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDDBFQdXBw
    ZXQgQ0E6IHB1cHBldDAeFw8xNTAyMTkxOTA0MzVaFw0yMDAyMTkxOTA0MzVaMBwx
    GjAYBgNVBAMMEVB1cHBldCBDQTogcHVwcGV0MIICIjANBgkqhkiG9w0BAQEFAAOC

    . . .

    arsjZT5/CtIhtP33Jl3mCp7U2F6bsk4/GDGRaAsFXjJHvBbL93NzgpkZ7elf0zUP
    rOcSGrDrUuzuJk8lEAtrZr/IfAgfKKXPqbyYF95V1qN3OMY+aTcrK20XTydKVWSe
    l5UfYGY3S9UJFrSn9aBsZzN+10HXPkaFKo7HxpztlYyJNI8UVSatcRF4aYYqt9KR
    UClnR+2WxK5v7ix0CVd4/KpYH/6YivvyTwxrhjF2AksZKg==
    -----END CERTIFICATE-----

Đảm bảo bao gồm toàn bộ certificate cùng với các điểm đánh dấu đầu và cuối và thụt lề thích hợp.

Phần thứ hai dưới puppet: ô là phần conf: Điều này được sử dụng để chỉ định các cặp key-value sẽ được nối vào một file puppet.conf chung. Các cặp key-value phải được đặt dưới tiêu đề phần giống như chúng sẽ có trong file puppet.conf .

Ví dụ, ít nhất, server mới cần biết địa chỉ của server chính của Puppet . Trong file puppet.conf , điều này được tìm thấy trong phần [agent] , như sau:

. . .

[agent]
server = puppet.example.com

. . .

Để chỉ định điều này trong cú pháp cloud-config , bạn sẽ thêm điều này vào những gì ta có cho đến nay:

#cloud-config
puppet:
  ca_cert: |
    -----BEGIN CERTIFICATE-----
    MIIFXjCCA0agAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDDBFQdXBw
    ZXQgQ0E6IHB1cHBldDAeFw8xNTAyMTkxOTA0MzVaFw0yMDAyMTkxOTA0MzVaMBwx
    GjAYBgNVBAMMEVB1cHBldCBDQTogcHVwcGV0MIICIjANBgkqhkiG9w0BAQEFAAOC

    . . .

    arsjZT5/CtIhtP33Jl3mCp7U2F6bsk4/GDGRaAsFXjJHvBbL93NzgpkZ7elf0zUP
    rOcSGrDrUuzuJk8lEAtrZr/IfAgfKKXPqbyYF95V1qN3OMY+aTcrK20XTydKVWSe
    l5UfYGY3S9UJFrSn9aBsZzN+10HXPkaFKo7HxpztlYyJNI8UVSatcRF4aYYqt9KR
    UClnR+2WxK5v7ix0CVd4/KpYH/6YivvyTwxrhjF2AksZKg==
    -----END CERTIFICATE-----
  conf:
    agent:
      server: "puppet.example.com"

Lưu ý phần conf: nằm cùng dòng với phần ca_cert và không phải là một phần tử con. Đây là mức tối thiểu cần thiết để kết nối với Puppet master. Bất kỳ mục cấu hình bổ sung nào được tìm thấy trong puppet.conf đều có thể được thêm theo cách tương tự bằng cách trước tiên tạo một cấp cho tên phần và sau đó xác định cặp key-value .

Sau đó, ta nên chuyển hướng tất cả kết quả trong tương lai đến file cloud-init-output.log và thêm một dòng runcmd có thể so sánh với dòng mà ta đã thêm cho cấu hình Chef. Điều này sẽ đợi cho đến khi tác nhân Puppet được cài đặt, sau đó kích hoạt và khởi động lại nó. Ta cũng có thể định tuyến điểm cuối metadata sau lần chạy đầu tiên giống như ta đã làm trong phần Chef. Các chỉ thị cloud-config dòng này nên được đặt bên ngoài bất kỳ phần module nào khác:

. . .

  conf:
    agent:
      server: "puppet.example.com"
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
  - while [ ! -e /usr/bin/puppet ]; do sleep 5; done; puppet agent --enable; service puppet restart
disable_ec2_metadata: true

Với thông tin này, server mới có thể kết nối với server chính của Puppet và sau đó tạo yêu cầu ký certificate ứng dụng client để chuyển đến server . Theo mặc định, các certificate ứng dụng client phải được ký theo cách thủ công trên Puppet master. Khi việc này được thực hiện xong, vào khoảng thời gian cập nhật tác nhân Puppet tiếp theo (cứ 30 phút một lần theo mặc định), nút sẽ kéo xuống cấu hình của nó từ trình chính Puppet . Sau đó, ta sẽ trình bày một chút cách triển khai cơ chế tự động ký tương đối an toàn để tránh sự chậm trễ này.

Xác định Certname cho Node

Một trong những giá trị có thể được đặt vào file puppet.conf của server mới là một trường hợp duy nhất. Trong file cloud-config , tùy chọn certname có thể thay thế các giá trị từ môi trường nếu các biến nhất định được cung cấp. Các biến sau được công nhận:

  • %i : ID version của server . Điều này sẽ được lấy từ http://169.254.169.254/metadata/v1/id khi server được tạo. Nó tương ứng với ID server được sử dụng để xác định duy nhất các server .
  • %f : FQDN của server .

Với ý nghĩ này, cài đặt certname phổ biến sẽ trông giống như sau:

#cloud-config
puppet:

. . .

  conf:
    agent:
      server: "puppet.example.com"
      certname: "%i.%f"

Điều này sẽ tạo ra một certname có mẫu tương tự như sau:

   |-Server ID
   |
   |            |-Fully Qualified Domain Name
   |            |
|-----||-------------------|
123456.testnode.example.com

Việc có ID server như một phần của tên certname có thể hữu ích cho việc cấu hình tự động ký vào Puppet an toàn như ta sẽ thấy trong phần tiếp theo.

Triển khai tự động ký certificate puppet

Nếu bạn muốn triển khai hệ thống tự động ký certificate để tránh sự can thiệp của administrator , có một số tùy chọn. Trước tiên, bạn phải cài đặt điều này trên server Puppet master của bạn .

Trong puppet.conf file trên server thạc sĩ Múa rối, bạn có thể cài đặt các autosign tùy chọn dưới [master] phần của file . Điều này có thể nhận một vài giá trị khác nhau:

  • true : Điều này sẽ yêu cầu server Puppet master ký mọi certificate request đến mà không cần thực hiện bất kỳ kiểm tra nào. Điều này cực kỳ nguy hiểm trong môi trường thực vì bất kỳ server nào cũng có thể nhận được CSR đã ký và xâm nhập vào cơ sở hạ tầng của bạn.
  • <whitelist_filename> : Tùy chọn thứ hai là chỉ định một file sẽ hoạt động như một danh sách trắng gồm các server lưu trữ hoặc các biểu thức chính quy của server . Trình điều khiển puppet sẽ kiểm tra các yêu cầu ký certificate đối với danh sách này để xem liệu certificate có được ký hay không. Điều này không được khuyến khích vì tên certificate có thể bị giả mạo dễ dàng.
  • <policy_executable> : Tùy chọn thứ ba là chỉ định một tập lệnh hoặc file thực thi có thể chạy để xác định xem có nên ký yêu cầu ký certificate hay không. Puppet sẽ chuyển tên cert vào làm đối số và toàn bộ CSR vào thông qua đầu vào chuẩn. Nếu trạng thái thoát bằng 0 được trả về, certificate đã được ký. Nếu trạng thái khác được đưa ra, certificate sẽ không được ký.

Tự động ký dựa trên policy là cách an toàn nhất để triển khai ký khóa tự động vì nó cho phép bạn tùy ý phức tạp trong cách bạn phân biệt giữa các yêu cầu hợp lệ và không hợp lệ .

Để chứng minh tính năng ký tự động dựa trên policy , bạn có thể thêm biến certname vào cloud-config của bạn , bao gồm biến %i instance ID. Ta sẽ sử dụng %i.%f để nó cũng bao gồm tên server đã chọn:

#cloud-config
puppet:
  conf:
    agent:
      server: "puppet.example.com"
      certname: "%i.%f"
  ca_cert: |

   . . .

cloud-config hoàn chỉnh của bạn bây giờ có thể trông giống như sau:

#cloud-config
puppet:
  conf:
    agent:
      server: "puppet.example.com"
      certname: "%i.%f"
  ca_cert: |
    -----BEGIN CERTIFICATE-----
    MIIFXjCCA0agAwIBAgIBATANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDDBFQdXBw
    ZXQgQ0E6IHB1cHBldDAeFw8xNTAyMTkxOTA0MzVaFw0yMDAyMTkxOTA0MzVaMBwx
    GjAYBgNVBAMMEVB1cHBldCBDQTogcHVwcGV0MIICIjANBgkqhkiG9w0BAQEFAAOC

    . . .

    arsjZT5/CtIhtP33Jl3mCp7U2F6bsk4/GDGRaAsFXjJHvBbL93NzgpkZ7elf0zUP
    rOcSGrDrUuzuJk8lEAtrZr/IfAgfKKXPqbyYF95V1qN3OMY+aTcrK20XTydKVWSe
    l5UfYGY3S9UJFrSn9aBsZzN+10HXPkaFKo7HxpztlYyJNI8UVSatcRF4aYYqt9KR
    UClnR+2WxK5v7ix0CVd4/KpYH/6YivvyTwxrhjF2AksZKg==
    -----END CERTIFICATE-----
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
  - while [ ! -e /usr/bin/puppet ]; do sleep 5; done; puppet agent --enable; service puppet restart
disable_ec2_metadata: true

Trên server chính của Puppet , ta sẽ phải cài đặt một tập lệnh xác thực. Vì Ruby đã được cài đặt cho Puppet, ta có thể tạo một script Ruby đơn giản.

Vì ta đang sử dụng định dạng %i.%f cho tên certname , ta có thể kiểm tra xem phần đầu tiên của tên certname (phần trước dấu chấm đầu tiên) có tương ứng với ID server hợp lệ cho account của ta hay không. Đây chỉ là một kiểm tra đơn giản, trên thực tế không làm được gì nhiều ngoài file danh sách trắng. Tuy nhiên, bạn có thể điều chỉnh ý tưởng này phức tạp hơn nhiều nếu muốn.

Để làm điều này, ta cần mã thông báo truy cập cá nhân từ phần “Ứng dụng & API” của console DigitalOcean. Bạn cũng cần cài đặt một trong các thư viện DigitalOcean Ruby. Dưới đây, ta sẽ chỉ cho bạn một số tập lệnh đơn giản sử dụng các ứng dụng client BargeServerKit DigitalOcean Ruby.

Nếu bạn muốn sử dụng ứng dụng client Barge, hãy cài đặt viên ngọc trên server Puppet của bạn bằng lệnh :

sudo gem install barge

Tập lệnh sau được dùng để kiểm tra xem phần đầu tiên của tên certname trong yêu cầu ký certificate có tương ứng với ID server hợp lệ hay không:

#!/usr/bin/env ruby

require 'barge'

TOKEN = 'YOUR_DIGITALOCEAN_API_TOKEN'

server_ids = []
certname = ARGV[0]
id_string = certname.slice(0...(certname.index('.')))
id_to_check = id_string.to_i

client = Barge::Client.new(access_token: TOKEN)
server = client.server.all

server.server.each do |server|
        server_ids << server.id
end

Kernel.exit(server_ids.include?(id_to_check))

Thay vào đó, nếu bạn muốn sử dụng ServerKit, ứng dụng client DigitalOcean Ruby chính thức, bạn có thể cài đặt đá quý bằng lệnh :

sudo gem install server_kit

Lưu ý đá quý ServerKit chỉ hợp lệ cho Ruby 2.0 trở lên, vì vậy điều này có thể không khả thi khi sử dụng version Ruby đi kèm với Puppet.

Kịch bản của ServerKit có thể được chuyển thể như thế này:

#!/usr/bin/env ruby

require 'server_kit'

TOKEN = 'YOUR_DIGITALOCEAN_API_TOKEN'

server_ids = []
certname = ARGV[0]
id_string = certname.slice(0...(certname.index('.')))
id_to_check = id_string.to_i

client = ServerKit::Client.new(access_token: TOKEN)
server = client.server.all

server.each do |server|
        server_ids << server.id
end

Kernel.exit(server_ids.include?(id_to_check))

Bạn có thể đặt tập lệnh tương ứng với đá quý mà bạn đã cài đặt trong file có tên /etc/puppet/validate.rb và đánh dấu nó là có thể thực thi bằng lệnh :

sudo chmod +x /etc/puppet/validate.rb

Sau đó, bạn có thể thêm phần sau vào file puppet.conf của bạn (nằm tại /etc/puppet/puppet.conf nếu sử dụng Mã nguồn mở):

. . .

[master]
autosign = /etc/puppet/validate.rb

. . .

Khởi động lại dịch vụ Apache để thực hiện policy ký mới:

sudo service apache2 restart

Bây giờ, khi trình chủ Puppet của bạn nhận được các yêu cầu ký certificate , nó sẽ kiểm tra xem phần đầu tiên của tên certificate có tương ứng với tên Server hợp lệ trong account của bạn hay không. Đây là một ví dụ sơ bộ về cách bạn có thể xác thực các yêu cầu bằng cách sử dụng file thực thi.

Kết luận

Bằng cách tận dụng các tập lệnh cloud-config , bạn có thể dễ dàng khởi động các server mới của bạn và chuyển giao chúng cho hệ thống quản lý cấu hình hiện có của bạn. Điều này cho phép bạn kiểm soát cơ sở hạ tầng của bạn ngay lập tức thông qua các công cụ hiện có trước khi thực hiện những thay đổi quan trọng ngoài phạm vi giải pháp quản lý của bạn.


Tags:

Các tin liên quan