Tập tin trạng thái Salt 

Nền tảng SaltStack bao gồm hai thành phần chính: Một công cụ thực thi từ xa xử lý giao tiếp hai chiều cho bất kỳ nút nào trong cơ sở hạ tầng của bạn (master và minion) và một hệ thống quản lý cấu hình duy trì tất cả các nút cơ sở hạ tầng ở trạng thái được xác định. Hệ thống quản lý cấu hình của Salt được gọi là hệ thống Salt State . Trạng thái Salt được khai báo trong tệp Salt State (SLS) bằng cú pháp YAML và biểu diễn thông tin mà Salt cần để cấu hình minion. Công thức Salt là tập hợp các tệp SLS có liên quan sẽ đạt được cấu hình chung.

Trang GitHub của SaltStack chứa các công thức Salt cho các cấu hình thường dùng, như tạo và quản lý chứng chỉ SSL/TLS, cài đặt và cấu hình Apache HTTP Server, cài đặt và cấu hình trang web WordPress và nhiều công thức hữu ích khác. Bạn có thể dễ dàng thêm bất kỳ công thức nào được viết sẵn này vào cây trạng thái Salt của riêng bạn bằng GitHub.

Hướng dẫn này sẽ sử dụng GitHub để phân nhánh và sửa đổi công thức múi giờ của SaltStack , sau đó sử dụng công thức trên máy chủ Salt để cấu hình múi giờ trên hai minion.

Trước khi bạn bắt đầu

  1. Nếu bạn mới sử dụng SaltStack, hãy đọc Hướng dẫn sử dụng Salt cho người mới bắt đầu để làm quen với các khái niệm cơ bản về Salt.
  2. Tải Git về máy tính cục bộ của bạn bằng cách làm theo hướng dẫn Cách cài đặt Git trên Linux, Mac hoặc Windows của chúng tôi .
  3. Làm quen với Git bằng hướng dẫn Bắt đầu với Git của chúng tôi .
  4. Hãy đảm bảo rằng bạn đã cấu hình git trên máy tính cục bộ của mình.
  5. Sử dụng 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 một Salt Master và hai Salt minion: một chạy Ubuntu 18.04 và một chạy CentOS 7.
  6. Hoàn thành các phần trong hướng dẫn Thiết lập và bảo mật phiên bản máy tính của chúng tôi để tạo tài khoản người dùng chuẩn, tăng cường quyền truy cập SSH và xóa các dịch vụ mạng không cần thiết.

Ghi chú: Các bước trong hướng dẫn này yêu cầu quyền root. Hãy đảm bảo chạy các bước bên dưới với sudo tiền tố. Để biết thêm thông tin về quyền, hãy xem hướng dẫn Người dùng và Nhóm của chúng tôi .

Tổng quan về Công thức múi giờ SaltStack

Trong phần này, chúng ta sẽ xem xét kỹ hơn về SaltStack timezone-formula, có thể được sử dụng để cấu hình múi giờ của minion. Tổng quan cấp cao về tất cả các tệp trạng thái của công thức và các mẫu Jinja sẽ được cung cấp. Các phương pháp hay nhất của Salt khuyến nghị rằng các công thức nên tách dữ liệu mà trạng thái cần khỏi chính trạng thái đó để tăng tính linh hoạt và khả năng tái sử dụng của các tệp trạng thái. Chúng ta sẽ quan sát cách thực hiện điều này trong công thức múi giờ.

  1. Trong trình duyệt của bạn, hãy điều hướng đến timezone-formulatrang GitHub của SaltStack . READMETệp được hiển thị và chứa thông tin cơ bản về công thức. Nó ghi chú các chi tiết sau:
    • Mục đích của công thức: để cấu hình múi giờ.
    • Các trạng thái có sẵn:timezone
    • Các giá trị mặc định được cung cấp:timezone: 'Europe/Berlin' utc: True
    Tệp kho lưu trữ FORMULAbao gồm các thông tin chi tiết bổ sung, bao gồm các họ hệ điều hành được hỗ trợ (Debian, RedHat, SUSE, Arch, FreeBSD), tóm tắt, mô tả và số bản phát hành.
  2. Khi xem timezone-formula, hãy nhấp vào timezonethư mục để xem nội dung của nó. Bạn sẽ thấy các tệp sau:Xem các tập tin công thức múi giờ
  3. Hãy xem nội dung của init.slstệp xác định trạng thái múi giờ:
# This state configures the timezone.

{%- set timezone = salt['pillar.get']('timezone:name', 'Europe/Berlin') %}
{%- set utc = salt['pillar.get']('timezone:utc', True) %}
{% from "timezone/map.jinja" import confmap with context %}

timezone_setting:
  timezone.system:
    - name: {{ timezone }}
    - utc: {{ utc }}

timezone_packages:
  pkg.installed:
    - name: {{ confmap.pkgname }}

timezone_symlink:
  file.symlink:
    - name: {{ confmap.path_localtime }}
    - target: {{ confmap.path_zoneinfo }}{{ timezone }}
    - force: true
    - require:
      - pkg: {{ confmap.pkgname }}

Salt sẽ diễn giải tên của tệp này là timezone, vì bất kỳ init.slstệp nào trong thư mục con đều được tham chiếu theo đường dẫn của thư mục đó.Tệp trạng thái này chứa ba khai báo trạng thái, timezone_settingtimezone_packagesvà timezone_symlink. Dưới đây là mô tả về cấu hình mà mỗi khai báo sẽ thực hiện trên một minion Salt.

  • timezone.system: Trạng thái này sử dụng mô-đun trạng thái múi giờ của Salt để quản lý múi giờ cho minion. Các giá trị cho namevà utcđược lấy từ tệp Pillar của Salt master tương ứng. Điều này được thực hiện trong phép gán hai biến ở đầu tệp: {%- set timezone = salt['pillar.get']('timezone:name', 'Europe/Berlin') %}và {%- set utc = salt['pillar.get']('timezone:utc', True) %}.
  • timezone_packages:Trạng thái này đảm bảo rằng gói cần thiết để cấu hình múi giờ được cài đặt trên minion. Giá trị này được lấy từ confmapbiến được nhập từ map.jinjatệp. Lệnh nhập được khai báo ở đầu tệp bằng {% from "timezone/map.jinja" import confmap with context %}câu lệnh nhập. Sau đó trong phần này, bạn sẽ kiểm tra map.jinjatệp.
  • timezone_symlink: Trạng thái này tạo ra một liên kết tượng trưng từ đường dẫn được xác định trong nameđến vị trí được xác định trong target. Trạng thái này sẽ chỉ thực thi nếu timezone_packagestrạng thái được thực thi thành công. Yêu cầu này được biểu thị bằng requirecâu lệnh.

1.Tiếp theo, hãy kiểm tra map.jinjatệp:

{% import_yaml "timezone/defaults.yaml" as defaults %}
{% import_yaml "timezone/osfamilymap.yaml" as osfamilymap %}

{% set osfam = salt['grains.filter_by'](
                                        osfamilymap,
                                        grain='os_family'
                                        ) or {} %}

{% do salt['defaults.merge'](defaults, osfam) %}

{%- set confmap = salt['pillar.get'](
                                'timezone:lookup',
                                default=defaults,
                                merge=True,
                                ) %}
      

Tệp map.jinjacho phép công thức trừu tượng hóa các giá trị mặc định tĩnh thành một từ điển chứa dữ liệu cụ thể của nền tảng. Hai từ điển chính được định nghĩa trong các tệp timezone/defaults.yamlvà timezone/osfamilymap.yamlkho lưu trữ. defaults.ymlTệp đóng vai trò là từ điển cơ sở chứa các giá trị được chia sẻ bởi tất cả các hệ điều hành, trong khi osfamilymap.ymltệp lưu trữ bất kỳ giá trị nào khác với các giá trị cơ sở. Bất kỳ tệp nào trong công thức đều có thể sử dụng các giá trị từ điển này bằng cách nhập tệp map.jinja. Ngoài ra, bất kỳ giá trị từ điển nào cũng có thể được ghi đè trong tệp Pillar. Việc ghi đè các giá trị từ điển sẽ được thảo luận trong phần Sửa đổi công thức SaltStack của bạn .

2.Mở timezone/defaults.yamltệp và timezone/osfamilymap,yamltệp để xem dữ liệu được lưu trữ trong các tệp đó:

    path_localtime: /etc/localtime
    path_zoneinfo: /usr/share/zoneinfo/
    pkgname: tzdata
      
    Suse:
      pkgname: timezone
    FreeBSD:
      pkgname: zoneinfo
    Gentoo:
      pkgname: sys-libs/timezone-data
      

Các giá trị được xác định trong các tệp YAML này sẽ được sử dụng trong init.slstệp.

3.Mở pillar.exampletệp để xem lại nội dung của nó:

  timezone:
    name: 'Europe/Berlin'
    utc: True
      

Tệp này cung cấp một ví dụ để bạn sử dụng khi tạo tệp Pillar của riêng bạn trên Salt master. Tệp init.slssử dụng các giá trị cho namevà utctrong timezone_settingkhai báo trạng thái của nó. Giá trị cho namesẽ đặt múi giờ cho minion của bạn. Giá trị boolean cho utcxác định có nên đặt đồng hồ phần cứng của minion thành UTC hay không.

Tham khảo múi giờ cơ sở dữ liệu tz để xem danh sách tất cả các múi giờ khả dụng. Vì tệp Pillar chứa dữ liệu nhạy cảm, bạn không nên kiểm soát phiên bản tệp này. Trong phần Tạo Pillar , bạn sẽ tạo tệp Pillar trực tiếp trên máy chủ Salt của mình.

Bây giờ bạn đã hiểu cấu trúc của công thức múi giờ SaltStack, trong phần tiếp theo, bạn sẽ fork kho lưu trữ công thức trên GitHub và sao chép công thức đã fork vào máy tính cục bộ của bạn.

Fork và sao chép công thức SaltStack TimeZone

Trong phần này, bạn sẽ fork timezone-formulatrang GitHub chính thức của SaltStack sang tài khoản GitHub của bạn và sao chép nó vào kho lưu trữ cục bộ.

1.Trong trình duyệt của bạn, hãy điều hướng đến trang GitHub timezone-formulacủa SaltStack . Nếu bạn chưa đăng nhập vào tài khoản GitHub của mình, hãy nhấp vào liên kết Đăng nhập ở đầu trang và đăng nhập.

2.Lấy công thức múi giờ từ trang GitHub của công thức SaltStack:Công thức múi giờ SaltStack ForkSau khi công thức được phân nhánh, bạn sẽ được chuyển hướng đến nhánh công thức múi giờ của tài khoản GitHub của bạn.

3.Khi xem nhánh công thức múi giờ của bạn, hãy nhấp vào nút Sao chép hoặc tải xuống và sao chép URL:Công thức múi giờ SaltStack Fork

4.Trên máy tính cục bộ của bạn, hãy sao chép công thức múi giờ:

git clone https://github.com/my-github/timezone-formula.git

5.Di chuyển vào timezone-formulathư mục:

cd timezone-formula

6.Hiển thị nội dung của timezone-formulathư mục:

ls

Bạn sẽ thấy kết quả sau:

      FORMULA        README.rst     pillar.example timezone

7.Khi bạn sao chép một kho lưu trữ, Git sẽ tự động đặt originremote đến vị trí của kho lưu trữ đã phân nhánh. Xác minh remote đã cấu hình cho timezone-formulakho lưu trữ của bạn:

git remote -v

Đầu ra của bạn sẽ tương tự như những gì hiển thị bên dưới, tuy nhiên, nó sẽ trỏ tới nhánh timezone-formulakho lưu trữ của riêng bạn:

 origin	https://github.com/my-github/timezone-formula.git (fetch)
 origin	https://github.com/my-github/timezone-formula.git (push)

Bạn có thể thêm công thức múi giờ SaltStack chính thức làm công thức upstreamtừ xa, để bạn có thể dễ dàng kéo bất kỳ thay đổi nào được thực hiện đối với công thức do người bảo trì kho lưu trữ thực hiện hoặc đóng góp trở lại cho dự án. Bước này không bắt buộc.

git remote add upstream https://github.com/saltstack-formulas/timezone-formula

Bây giờ bạn đã có bản sao cục bộ của fork timezone-formula. Trong phần tiếp theo, bạn sẽ sửa đổi công thức để cập nhật tệp init.sls.

Sửa đổi công thức SaltStack của bạn

Trong phần này, bạn sẽ sửa đổi công thức múi giờ để cải thiện cách công thức tuân theo các thông lệ tốt nhất của Salt liên quan đến từ điển tra cứu. Tương tự, bạn có thể sửa đổi bất kỳ công thức SaltStack nào cho các yêu cầu cụ thể của cơ sở hạ tầng của mình, nếu cần.

Như đã thảo luận trong phần Tổng quan về công thức múi giờ SaltStack , timezone/defaults.yamltệp và timezone/osfamily.maptệp cung cấp từ điển các giá trị được trạng thái sử dụng init.sls. Các giá trị từ điển tệp YAML này có thể được ghi đè trong tệp Pillar cũng lưu trữ bất kỳ dữ liệu nhạy cảm nào mà trạng thái cần init.sls.

Khi cấu trúc dữ liệu Pillar, tài liệu chính thức của Salt nêu rằng cách thực hành tốt nhất là tạo công thức mong đợi tất cả các tham số liên quan đến công thức được đặt dưới lookupkhóa cấp hai. Hiện tại, init.slstệp timezonevà utcbiến mong đợi dữ liệu Pillar được cấu trúc khác nhau. Bạn sẽ cập nhật hai câu lệnh biến này để mong đợi lookupkhóa cấp hai.

1.Tạo một nhánh mới trong kho lưu trữ cục bộ của bạn để bắt đầu sửa đổi công thức múi giờ:

git checkout -b update-variable-statements

2.Mở init.slstệp trong trình soạn thảo văn bản và sửa đổi các câu lệnh timezonevà utcbiến của tệp để phù hợp với tệp ví dụ:

# This state configures the timezone.

{%- set timezone = salt['pillar.get']('timezone:lookup:name', 'Europe/Berlin') %}
{%- set utc = salt['pillar.get']('timezone:lookup:utc', True) %}
{% from "timezone/map.jinja" import confmap with context %}

timezone_setting:
  timezone.system:
    - name: {{ timezone }}
    - utc: {{ utc }}

timezone_packages:
  pkg.installed:
    - name: {{ confmap.pkgname }}

timezone_symlink:
  file.symlink:
    - name: {{ confmap.path_localtime }}
    - target: {{ confmap.path_zoneinfo }}{{ timezone }}
    - force: true
    - require:
      - pkg: {{ confmap.pkgname }}
      

Tệp init.slshiện mong đợi khóa tra cứu cấp hai khi truy xuất các giá trị Pillar đã chỉ định. Thực hiện theo quy ước này sẽ giúp ghi đè các giá trị từ điển trong tệp Pillar của bạn dễ dàng hơn. Bạn sẽ tạo tệp Pillar trong phần Cài đặt công thức Salt của hướng dẫn này.

3.Sử dụng Git để xem những tệp nào đã được thay đổi trước khi dàn dựng chúng:

git status

Đầu ra của bạn sẽ giống như sau:

On branch update-variable-statements
Changes not staged for commit:
  &nbsp&nbsp(use "git add &ltfile&gt..." to update what will be committed)
  &nbsp&nbsp(use "git checkout -- &ltfile&gt..." to discard changes in working directory)

  &nbsp&nbspmodified:   timezone/init.sls

no changes added to commit (use "git add" and/or "git commit -a")

4.Phân chia và xác nhận những thay đổi bạn đã thực hiện vào init.slstệp.

git add -A
git commit -m 'My commit message'

5.Đẩy những thay đổi của bạn vào nhánh của bạn:

git push origin update-variable-statements

6.Điều hướng đến kho lưu trữ GitHub từ xa của công thức múi giờ của bạn và tạo yêu cầu kéo đối với nhánh fork của bạn master.Gửi yêu cầu kéoHãy đảm bảo rằng bạn chọn nhánh công thức múi giờ của riêng mình làm base fork, nếu không, bạn sẽ gửi yêu cầu kéo tới kho lưu trữ công thức múi giờ SaltStack chính thức, đây không phải là hành vi mong muốn cho ví dụ này.Tạo yêu cầu kéoNếu bạn hài lòng với những thay đổi trong yêu cầu kéo, hãy hợp nhất yêu cầu kéo vào masternhánh của bạn.Hợp nhất một yêu cầu kéoTrong phần tiếp theo, bạn sẽ thêm nhánh của mình timezone-formulavào Salt master, tạo tệp Pillar cho timezone-formulavà áp dụng các thay đổi cho minion của bạn.

Cài đặt công thức Salt 

Có hai cách để sử dụng Salt Formula: bạn có thể thêm công thức dưới dạng GitFS Remote, cho phép bạn phục vụ trực tiếp các tệp được lưu trữ trên tài khoản GitHub của mình hoặc bạn có thể thêm công thức trực tiếp vào Salt master bằng cơ chế sao chép của Git. Phần này sẽ đề cập đến cả hai cách sử dụng Salt formulas.

Thêm công thức Salt  vào Master của bạn theo cách thủ công

1.Điều hướng đến nhánh công thức múi giờ của bạn, nhấp vào nút Sao chép hoặc tải xuống và sao chép URL của kho lưu trữ vào bảng tạm của bạn.

2.SSH vào máy chủ Salt của bạn. Thay thế usernamebằng tài khoản người dùng giới hạn của bạn và thay thế 198.51.100.0bằng địa chỉ IP của Linode:

ssh username@198.51.100.0

3.Tạo một thư mục công thức và chuyển tới thư mục mới:

mkdir -p /srv/formulas
cd /srv/formulas

4.Nếu máy chủ Salt của bạn chưa cài đặt Git, hãy cài đặt Git bằng trình quản lý gói của hệ thống:

Ubuntu/Debian

apt-get update
apt-get install git

Centos

yum update
yum install git

5.Sao chép kho lưu trữ vào /srv/formulasthư mục. Đảm bảo bạn thay thế git-usernamebằng tên người dùng của riêng bạn:

git clone https://github.com/git-username/timezone-formula.git

Thêm công thức Salt làm GitFS Remote

GitFs cho phép Salt phục vụ các tệp trực tiếp từ kho lưu trữ git từ xa. Đây là cách thuận tiện để sử dụng các công thức Salt với tính linh hoạt và sức mạnh bổ sung mà các hệ thống kiểm soát phiên bản từ xa cung cấp, như cộng tác và dễ dàng quay lại các phiên bản trước của công thức của bạn.

1.Trên máy chủ Salt, cài đặt giao diện Python vào Git:

sudo apt-get install python-git

2.Chỉnh sửa tệp cấu hình chính Salt để sử dụng GitFs làm backend máy chủ tệp. Đảm bảo các dòng được liệt kê bên dưới không có chú thích trong tệp cấu hình chính của bạn:

fileserver_backend:
  - gitfs
  - roots

Khi sử dụng nhiều chương trình phụ trợ, bạn nên liệt kê tất cả các chương trình phụ trợ theo thứ tự bạn muốn tìm kiếm. rootslà chương trình phụ trợ máy chủ tệp được sử dụng để phục vụ các tệp từ bất kỳ thư mục nào của máy chủ chính được liệt kê trong file_rootscấu hình.

3.Trong cùng một tệp cấu hình Salt master, hãy thêm vị trí của kho lưu trữ GitHub của công thức múi giờ của bạn. Đảm bảo bạn đã bỏ chú thích gitfs_remote:

gitfs_remotes:
  - https://github.com/git-username/timezone-formula.git

4.Bỏ chú thích cho gitfs_providerphần khai báo và đặt giá trị của nó thành gitpython:

gitfs_provider: gitpython

5.Khởi động lại Salt master để áp dụng cấu hình mới:

sudo systemctl restart salt-master

Thêm công thức Salt vào tệp trên cùng

Để đưa công thức múi giờ vào cây trạng thái Salt, bạn phải thêm nó vào tệp trên cùng.

1.Tạo /srv/saltthư mục nếu nó chưa tồn tại:

mkdir /srv/salt

2.Thêm timezonetrạng thái được khai báo trong timezone-formulatệp trên cùng của bạn:

base:
  '*':
    - timezone

Ví dụ tệp Top khai báo một môi trường, basemôi trường nhắm mục tiêu đến tất cả các minion và áp dụng timezonetrạng thái cho chúng. Tệp top này có thể dễ dàng chứa một số trạng thái đã tồn tại trong cây trạng thái của bạn, như một apachetrạng thái, một wordpresstrạng thái, v.v. và một số môi trường nhắm mục tiêu đến các minion khác nhau. Bất kỳ công thức Salt nào cũng có thể dễ dàng được đưa vào tệp top và sẽ được áp dụng cho các minion được nhắm mục tiêu vào lần tiếp theo bạn chạy highstate.

Tạo the Pillar

1.Tạo một thư mục để lưu trữ tệp Pillar của công thức của bạn:

mkdir -p /srv/pillar

2.Tạo tệp Pillar để lưu trữ dữ liệu sẽ được công thức múi giờ của bạn sử dụng:

timezone:
  lookup:
    {%- if grains['os_family'] == 'Debian' %}
    name: America/New_York
    {%- else %}
    name: 'Europe/Berlin'
    {%- endif %}
    utc: True
    

Tệp timezone.slsPillar được tạo từ pillar.exampletệp được cung cấp trong công thức múi giờ SaltStack. Ví dụ đã được sửa đổi để thêm các câu lệnh điều khiển Jinja sẽ gán một múi giờ khác trên bất kỳ minion nào là HĐH họ Debian. Bạn có thể thay thế bất kỳ namegiá trị múi giờ nào thành múi giờ ưa thích của mình hoặc thêm logic Jinja bổ sung, nếu cần. Để biết phần giới thiệu về Jinja, hãy đọc Giới thiệu về Mẫu Jinja cho Salt .

Bạn cũng có thể ghi đè bất kỳ giá trị từ điển nào được xác định trong tệp timezone/defaults.yamlPillar timezone/osfamilymap.yamlbằng cách sử dụng quy ước từ điển tra cứu của Salt. Ví dụ, nếu bạn muốn ghi đè pkgnamegiá trị được xác định trong timezone/defaults.yamltệp Pillar của mình, ví dụ sau có thể trông giống như sau:

timezone:
  lookup:
    {%- if grains['os_family'] == 'Debian' %}
    name: America/New_York
    {%- else %}
    name: 'Europe/Berlin'
    {%- endif %}
    utc: True
    pkgname: timezone
    

3.Nếu bạn đã sao chép timezone-formula vào máy chủ chính thay vì thêm công thức dưới dạng GitFS từ xa, hãy thêm thư mục timezone-formula vào file_rootscấu hình của máy chủ chính Salt:

file_roots:
  base:
    - /srv/salt/
    - /srv/formulas/timezone-formula
    

4.Thêm Pillar vào tệp trên cùng của Pillar:

base:
  '*':
    - timezone

5.Cấu hình vị trí của tệp Pillar:

pillar_roots:
  base:
    - /srv/pillar
    

6.Khởi động lại Salt master để cấu hình mới có hiệu lực trên Salt master:

sudo systemctl restart salt-master

7.Chạy lệnh highstate tới minion của bạn để áp dụng trạng thái được xác định trong công thức múi giờ:

sudo salt '*' state.apply

Các bước tiếp theo

Để tìm hiểu cách tạo công thức Salt của riêng bạn và cách sắp xếp trạng thái của công thức theo cách hợp lý và theo mô-đun, hãy đọc hướng dẫn Tự động triển khai trang web tĩnh bằng Salt, Git và Webhooks của chúng tôi .

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.

Nguồn: https://www.linode.com/docs/guides/use-and-modify-official-saltstack-formulas/