Salt (còn được gọi là SaltStack ) là một hệ thống quản lý cấu hình và điều phối dựa trên Python. Salt sử dụng mô hình master/client trong đó một máy chủ Salt master chuyên dụng quản lý một hoặc nhiều máy chủ Salt minion . Hai trong số các công việc chính của Salt là:

  • Thực hiện lệnh từ xa trên một nhóm minion
  • Áp dụng trạng thái Salt cho một tập hợp các minion (thường được gọi là quản lý cấu hình )

Hướng dẫn này sẽ giới thiệu những khái niệm cốt lõi mà Salt sử dụng để thực hiện những công việc này.

Bậc thầy và tay sai

Salt master là một máy chủ hoạt động như một trung tâm chỉ huy và điều khiển cho các minion của nó, và là nơi các lệnh thực thi từ xa của Salt được chạy. Ví dụ, lệnh này báo cáo mức sử dụng đĩa hiện tại cho mỗi minion mà master điều khiển:

salt '*' disk.usage

Có nhiều lệnh khác có sẵn. Lệnh này cài đặt NGINX trên minion có tên webserver1:

salt 'webserver1' pkg.install nginx

Salt minion là máy chủ thực sự chạy các ứng dụng và dịch vụ của bạn. Mỗi minion có một ID được chỉ định cho nó (có thể tự động tạo từ tên máy chủ của minion) và Salt master có thể tham chiếu đến ID này để nhắm mục tiêu các lệnh đến các minion cụ thể .

Ghi chú: Khi sử dụng Salt, bạn nên cấu hình và quản lý máy chủ minion của mình từ máy chủ chính càng nhiều càng tốt, thay vì đăng nhập trực tiếp vào máy chủ qua SSH hoặc giao thức khác.

Để kích hoạt tất cả các chức năng này, máy chủ Salt master chạy một daemon có tên là salt-master và các máy chủ Salt minion chạy một daemon có tên là salt-minion .

Xác thực

Giao tiếp giữa master và minion được thực hiện qua giao thức truyền tải ZeroMQ và mọi giao tiếp đều được mã hóa bằng cặp khóa công khai/riêng tư. Một cặp khóa được tạo ra bởi minion khi Salt được cài đặt lần đầu tiên trên đó, sau đó minion sẽ gửi khóa công khai của mình đến master. Bạn sẽ cần chấp nhận khóa của minion từ master; sau đó giao tiếp có thể tiếp tục giữa hai bên.

Thực hiện từ xa

Salt cung cấp một loạt các mô-đun thực thi từ xa rất rộng . Mô-đun thực thi là một tập hợp các hàm liên quan mà bạn có thể chạy trên các minion của mình từ master . Ví dụ:

salt 'webserver1' npm.install gulp

Trong lệnh này npmlà module và installlà hàm . Lệnh này cài đặt gói Gulp Node.js thông qua Node Package Manager (NPM). Các hàm khác trong module npmxử lý việc gỡ cài đặt các gói NPM, liệt kê các gói NPM đã cài đặt và các tác vụ liên quan.

Các mô-đun thực thi mà Salt cung cấp đại diện cho các tác vụ quản trị hệ thống mà bạn sẽ thực hiện trong shell, bao gồm nhưng không giới hạn ở:

Ghi chú: Bạn cũng có thể viết mô-đun thực thi của riêng mình.

cmd.run

Hàm này cmd.runđược sử dụng để chạy các lệnh tùy ý trên minion của bạn từ máy chủ:

salt '*' cmd.run 'ls -l /etc'

Thao tác này sẽ trả về nội dung của /etcmỗi minion.

Ghi chú: Nếu có thể, tốt hơn là sử dụng các mô-đun thực thi thay vì “trả tiền” bằng cmd.run.

Các trạng thái, công thức và tệp hàng đầu

Phần trước đã mô tả cách sử dụng thực thi từ xa để thực hiện các hành động cụ thể trên một minion. Với thực thi từ xa, bạn có thể quản lý một minion bằng cách nhập một loạt các lệnh như vậy.

Salt cung cấp một cách khác để cấu hình một minion trong đó bạn khai báo trạng thái mà minion nên ở . Kiểu cấu hình này được gọi là trạng thái Salt và phương pháp này thường được gọi là quản lý cấu hình .

Sự khác biệt giữa hai phong cách này rất tinh tế; để minh họa, sau đây là cách cài đặt NGINX được diễn giải theo từng phương pháp:

  • Thực hiện từ xa : “Cài đặt NGINX trên minion”
  • Quản lý cấu hình : “NGINX phải được cài đặt trên minion”

Trạng thái muối được định nghĩa trong các tệp trạng thái . Sau khi bạn đã ghi lại các trạng thái của mình, sau đó bạn áp dụng chúng cho một minion. Salt phân tích tệp trạng thái và xác định những gì cần làm để đảm bảo minion đáp ứng các khai báo của trạng thái.

Ghi chú: Điều này đôi khi dẫn đến cùng một lệnh sẽ được chạy thông qua thực thi từ xa, nhưng đôi khi thì không. Trong ví dụ NGINX, nếu Salt thấy NGINX đã được cài đặt trước đó, nó sẽ không gọi lại trình quản lý gói khi trạng thái được áp dụng.

Giải phẫu của một State

Sau đây là một ví dụ về tệp trạng thái đảm bảo rằng: rsync và curl đã được cài đặt; NGINX đã được cài đặt; và NGINX đã được chạy và được bật để chạy khi khởi động:

network_utilities:
  pkg.installed:
    - pkgs:
      - rsync
      - curl

nginx_pkg:
  pkg.installed:
    - name: nginx

nginx_service:
  service.running:
    - name: nginx
    - enable: True
    - require:
      - pkg: nginx_pkg

Tệp trạng thái kết thúc bằng phần mở rộng .sls(SaLt State). Tệp trạng thái có thể có một hoặc nhiều khai báo trạng thái , là các phần cấp cao nhất của tệp ( network_utilitiesnginx_pkg, và nginx_servicetrong ví dụ trên). ID khai báo trạng thái là tùy ý, vì vậy bạn có thể đặt tên theo ý muốn.

Các khai báo trạng thái chứa các mô-đun trạng thái . Các mô-đun trạng thái khác với các mô-đun thực thi nhưng thường thực hiện các công việc tương tự. Ví dụ, một pkgmô-đun trạng thái tồn tại với các hàm tương tự như pkgmô-đun thực thi, như với pkg.installedhàm trạng thái và pkg.installhàm thực thi. Giống như các mô-đun thực thi, Salt cung cấp một loạt các mô-đun trạng thái để bạn sử dụng.

Ghi chú: Các khai báo trạng thái không nhất thiết phải được áp dụng theo thứ tự xuất hiện trong tệp trạng thái, nhưng bạn có thể chỉ định rằng một khai báo phụ thuộc vào một khai báo khác bằng tùy requirechọn. Đây là trường hợp trong ví dụ trên; Salt sẽ không cố gắng chạy và kích hoạt NGINX cho đến khi nó được cài đặt.

Tệp trạng thái thực chất chỉ là tập hợp các từ điển, danh sách, chuỗi và số sau đó được Salt diễn giải. Theo mặc định, Salt sử dụng cú pháp YAML để biểu diễn trạng thái.

Các tệp trạng thái thường được lưu trên hệ thống tệp của máy chủ Salt, nhưng chúng cũng có thể được lưu trữ ở các vị trí máy chủ tệp khác , như kho lưu trữ Git (cụ thể là GitHub).

Áp dụng một trạng thái cho một Minion

Để áp dụng trạng thái cho minion, hãy sử dụng state.applyhàm từ master:

salt `webserver1` state.apply webserver_setup

Lệnh này áp dụng webserver_setup.slstrạng thái ví dụ cho một minion có tên là webserver1. Khi áp dụng trạng thái, .slshậu tố không được đề cập. Tất cả các khai báo trạng thái trong tệp trạng thái đều được áp dụng.

Công thức Salt 

Công thức chỉ là tập hợp các trạng thái cùng nhau cấu hình một ứng dụng hoặc thành phần hệ thống trên một minion. Công thức thường được tổ chức trên nhiều .slstệp khác nhau. Việc chia nhỏ các trạng thái của công thức trên nhiều tệp khác nhau có thể giúp bạn tổ chức công việc dễ dàng hơn. Khai báo trạng thái có thể bao gồm và tham chiếu đến các khai báo trên các tệp khác.

Các công thức đủ chung chung thường được chia sẻ trên GitHub để người khác sử dụng. Tổ chức SaltStack duy trì một bộ sưu tập các công thức phổ biến . Tài liệu của Salt có hướng dẫn về cách sử dụng công thức được lưu trữ trên GitHub.

Định nghĩa về công thức khá mơ hồ và Salt không yêu cầu cấu trúc cụ thể của công thức.

Tập tin hàng đầu

Ngoài việc áp dụng thủ công các trạng thái cho minion, Salt còn cung cấp cho bạn một cách để tự động lập bản đồ các trạng thái nào nên được áp dụng cho các minion khác nhau. Bản đồ này được gọi là tệp top .

Sau đây là một tập tin đầu trang đơn giản:

base:
  '*':
    - universal_setup

  'webserver1':
    - webserver_setup

baseđề cập đến môi trường Salt . Bạn có thể chỉ định nhiều hơn một môi trường tương ứng với các giai đoạn khác nhau trong công việc của mình; ví dụ: phát triển, QA, sản xuất, v.v. baselà mặc định.

Các nhóm minion được chỉ định theo môi trường và các trạng thái được liệt kê cho mỗi nhóm minion. Ví dụ tệp trên cùng nêu rằng một universal_setuptrạng thái nên được áp dụng cho tất cả minion ( '*'), và webserver_setuptrạng thái nên được áp dụng cho webserver1minion.

Nếu bạn chạy state.applyhàm mà không có đối số, thì Salt sẽ kiểm tra tệp trên cùng và áp dụng tất cả các trạng thái trong đó theo ánh xạ bạn đã tạo:

salt '*' state.apply

Ghi chú: Hành động này được gọi một cách thông tục là highstate .

Lợi ích của Quản lý Trạng thái và Cấu hình

Việc xác định cấu hình của bạn theo trạng thái giúp việc quản trị hệ thống dễ dàng hơn:

  • Việc thiết lập trạng thái sẽ giảm thiểu lỗi của con người vì bạn không cần phải nhập lệnh thủ công từng cái một.
  • Áp dụng trạng thái cho minion nhiều lần thường không dẫn đến bất kỳ thay đổi nào ngoài lần áp dụng đầu tiên. Salt hiểu khi nào trạng thái đã được triển khai trên minion và sẽ không thực hiện các hành động không cần thiết.
  • Nếu bạn cập nhật tệp trạng thái và áp dụng vào minion, Salt sẽ phát hiện và chỉ áp dụng các thay đổi, giúp việc cập nhật hệ thống của bạn hiệu quả hơn.
  • Một trạng thái có thể được tái sử dụng và áp dụng cho nhiều minion, điều này sẽ tạo ra cấu hình giống hệt nhau trên các máy chủ khác nhau.
  • Tệp trạng thái có thể được nhập vào hệ thống kiểm soát phiên bản, giúp bạn theo dõi những thay đổi trong hệ thống theo thời gian.

Nhắm mục tiêu vào Minion

Bạn có thể so khớp với ID của minion bằng cách sử dụng shell style globbing. Điều này hoạt động ở cả dòng lệnh hoặc trong tệp trên cùng.

Những ví dụ này sẽ áp dụng webserver_setuptrạng thái cho tất cả các minion có ID bắt đầu bằng webserver(ví dụ: webserver1webserver2, v.v.):

  • Dòng lệnh:salt 'webserver*' state.apply webserver_setup
  • Tệp tin đầu tiên:
base:
  'webserver*':
    - webserver_setup

Biểu thức chính quy và danh sách cũng có thể được sử dụng để so khớp với ID minion.

Grains

Grains của Salt cung cấp quyền truy cập vào thông tin được tạo ra và lưu trữ trên minion. Ví dụ bao gồm hệ điều hành, tên miền, địa chỉ IP, v.v. của minion. Bạn cũng có thể chỉ định dữ liệu hạt tùy chỉnh trên minion, như được nêu trong tài liệu của Salt.

Bạn có thể sử dụng dữ liệu hạt để nhắm mục tiêu đến các minion từ dòng lệnh. Lệnh này cài đặt httpd trên tất cả các minion chạy CentOS:

salt -G 'os:CentOS' pkg.install httpd

Bạn cũng có thể sử dụng hạt trong tệp trên cùng:

base:
  'os:CentOS':
    - match: grain
    - centos_setup

Thông tin về hạt thường không quá năng động, nhưng thỉnh thoảng nó có thể thay đổi và Salt sẽ làm mới dữ liệu hạt khi có thay đổi. Để xem dữ liệu hạt của minion:

salt '*' grains.items

Lưu trữ dữ liệu và bí mật trong Pillar

Tính năng trụ cột của Salt lấy dữ liệu được xác định trên Salt master và phân phối cho các minion. Một mục đích sử dụng chính của trụ cột là lưu trữ bí mật, chẳng hạn như thông tin đăng nhập tài khoản. Trụ cột cũng là nơi hữu ích để lưu trữ dữ liệu không bí mật mà bạn không muốn ghi trực tiếp vào tệp trạng thái của mình.

Ghi chú: Ngoài việc lưu trữ dữ liệu trụ cột trên máy chủ chính, bạn cũng có thể lưu trữ dữ liệu ở những vị trí khác, như trong kho lưu trữ Git hoặc Vault của Hashicorp .

Giả sử bạn muốn tạo người dùng hệ thống trên một minion và gán các shell khác nhau cho mỗi người dùng. Nếu bạn mã hóa thông tin này vào một tệp trạng thái, bạn sẽ cần một khai báo mới cho mỗi người dùng. Nếu bạn lưu trữ dữ liệu trong pillar thay vào đó, thì bạn có thể chỉ cần tạo một khai báo trạng thái và đưa dữ liệu pillar vào đó bằng tính năng tạo mẫu Jinja của Salt .

Ghi chú: Salt Pillar đôi khi bị nhầm lẫn với Salt Grains, vì cả hai đều lưu trữ dữ liệu được sử dụng trong trạng thái và thực thi từ xa. Dữ liệu mà grain duy trì có nguồn gốc từ các minion, trong khi dữ liệu trong pillar có nguồn gốc từ master (hoặc một backend khác) và được chuyển đến các minion.

Giải phẫu của dữ liệu trụ cột

Dữ liệu trụ cột được lưu giữ trong .slscác tệp được viết theo cú pháp YAML giống như các trạng thái:

users:
  joe:
    shell: /bin/zsh
  amy:
    shell: /bin/bash
  sam
    shell: /bin/fish

Tương tự như các tệp trạng thái, một tệp hàng đầu (riêng biệt với tệp hàng đầu của trạng thái của bạn) ánh xạ dữ liệu trụ cột thành các phần tử con:

base:
  'webserver1':
    - user_info

Mẫu Jinja

Để đưa dữ liệu trụ cột vào trạng thái của bạn, hãy sử dụng cú pháp mẫu của Jinja . Trong khi Salt sử dụng cú pháp YAML cho các tệp trạng thái và trụ cột, các tệp này trước tiên được diễn giải là các mẫu Jinja (theo mặc định).

Tệp trạng thái mẫu này sử dụng dữ liệu trụ cột từ phần trước để tạo người dùng hệ thống và thiết lập shell cho từng người dùng:

{% for user_name, user_info in pillar['users'].iteritems() %}
{{ user_name }}:
  user.present:
    - shell: {{ user_info['shell'] }}
{% endfor %}

Salt sẽ biên dịch tệp trạng thái thành thứ trông như thế này trước khi áp dụng cho minion:

joe:
  user.present:
    - shell: /bin/zsh

amy:
  user.present:
    - shell: /bin/bash

sam:
  user.present:
    - shell: /bin/fish

Bạn cũng có thể sử dụng Jinja để tương tác với dữ liệu hạt trong các trạng thái của bạn. Trạng thái ví dụ này sẽ cài đặt Apache và điều chỉnh tên cho gói theo hệ điều hành:

install_apache:
  pkg.installed:
    {% if grains['os'] == 'CentOS' %}
    - name: httpd
    {% else %}
    - name: apache
    {% endif %}

Ghi chú: Ngoài tài liệu của Salt về Jinja, tài liệu chính thức của Jinja cũng nêu chi tiết cú pháp mẫu.

Đèn hiệu

Hệ thống beacon là một cách để theo dõi nhiều quy trình hệ thống khác nhau trên Salt minion. Có một số mô-đun beacon có sẵn.

Beacon có thể kích hoạt lò phản ứng , sau đó có thể giúp thực hiện thay đổi hoặc khắc phục sự cố. Ví dụ, nếu phản hồi của dịch vụ hết thời gian, hệ thống lò phản ứng có thể khởi động lại dịch vụ.

Bắt đầu với Salt

Bây giờ bạn đã quen với một số thuật ngữ và thành phần cơ bản của Salt, hãy chuyển sang hướng dẫn Bắt đầu với Salt – Cài đặt và thiết lập cơ bản để thiết lập cấu hình nhằm bắt đầu chạy lệnh và cung cấp máy chủ minion.

Tài liệu SaltStack cũng chứa một trang về các biện pháp thực hành tốt nhất cần lưu ý khi làm việc với Salt. Bạn nên xem lại trang này và triển khai các biện pháp thực hành đó vào quy trình làm việc của riêng bạn bất cứ khi nào có thể.

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.