Mô-đun thực thi Salt là mô-đun Python chạy trên Salt minion. Nó thực hiện các tác vụ và trả về dữ liệu cho Salt master. Trong hướng dẫn này, bạn sẽ tạo và cài đặt mô-đun thực thi sẽ gọi API của US National Weather Service và trả về nhiệt độ hiện tại tại một trạm thời tiết được chỉ định. Ví dụ này có thể dễ dàng được điều chỉnh để truy cập bất kỳ API nào.

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

Nếu bạn chưa làm, hãy thiết lập một Salt master và ít nhất một Salt minion. Bạn có thể làm theo một vài bước đầu tiên trong hướng dẫn Bắt đầu với Salt – Cài đặt và Thiết lập Cơ bản của chúng tôi .

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 tiền sudotố. Để 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 .

Chuẩn bị muối

Các tệp được tạo trong các bước sau sẽ nằm trong thư /srv/saltmục. Nếu bạn đã thay đổi file_rootscấu hình mặc định của Salt, hãy sử dụng vị trí thư mục đó.

1.Bắt đầu bằng cách tạo thư /srv/saltmục nếu nó chưa tồn tại. Đây là nơi bạn sẽ đặt tệp top và tệp Salt state của mình:

mkdir /srv/salt

2.Tạo một tệp trên cùng trong /srv/saltđó sẽ là điểm vào của Salt cho cấu hình Salt của chúng ta:

base:
  '*':
    - weather

3.Tạo một tệp trạng thái có tên weather.slsvà hướng dẫn Salt đảm bảo các minion của chúng ta đã cài đặt PIP cũng như thư viện Python cần thiết.

python-pip:
  pkg.installed

requests:
  pip.installed:
    - require:
      - pkg: python-pip

4.Áp dụng những thay đổi trạng thái sau:

salt '*' state.apply

5.Cuối cùng, tạo thư /srv/salt/_modulesmục chứa mô-đun thực thi của chúng ta:

mkdir /srv/salt/_modules

Tạo Mô-đun Thực thi

1.Tạo một tệp có tên weather.pytrong /srv/salt/_modulesthư mục và thêm các dòng sau để thiết lập ghi nhật ký Salt và nhập mô-đun yêu cầu.

import logging
try:
    import requests
    HAS_REQUESTS = True
except ImportError:
    HAS_REQUESTS = False

log = logging.getLogger(__name__)

. . .

2.Thêm __virtualname__biến và __virtual__hàm.

. . .

__virtualname__ = 'weather'

def __virtual__():
    '''
    Only load weather if requests is available
    '''
    if HAS_REQUESTS:
        return __virtualname__
    else:
        return False, 'The weather module cannot be loaded: requests package unavailable.'

. . .

Hàm này __virtual__trả về tên ảo của mô-đun và tải mô-đun hoặc trả về Falsechuỗi lỗi và mô-đun không được tải. Điều if HAS_REQUESTSkiện được liên kết với khối try/except được tạo ở bước trước thông qua việc sử dụng biến HAS_REQUESTS.

3.Thêm get()hàm công khai và _make_request()hàm riêng tư:

. . .

def get(signs=None):
    '''
    Gets the Current Weather

    CLI Example::

        salt minion weather.get KPHL

    This module also accepts multiple values in a comma separated list::

        salt minion weather.get KPHL,KACY
    '''
    log.debug(signs)
    return_value = {}
    signs = signs.split(',')
    for sign in signs:
        return_value[sign] = _make_request(sign)
    return return_value

def _make_request(sign):
    '''
    The function that makes the request for weather data from the National Weather Service.
    '''
    request = requests.get('https://api.weather.gov/stations/{}/observations/current'.format(sign))
    conditions = {
        "description:": request.json()["properties"]["textDescription"],
        "temperature": round(request.json()["properties"]["temperature"]["value"], 1)
    }
    return conditions

Có hai hàm trong bước này. get()Hàm này chấp nhận một hoặc nhiều tín hiệu gọi trạm thời tiết dưới dạng danh sách phân cách bằng dấu phẩy. Nó gọi _make_request()để thực hiện yêu cầu HTTP và trả về mô tả văn bản về thời tiết hiện tại và nhiệt độ.

Điều quan trọng cần lưu ý là khi thêm dấu gạch dưới vào đầu hàm, _make_request()nó sẽ trở thành hàm riêng tư, nghĩa là không thể truy cập trực tiếp thông qua dòng lệnh Salt hoặc tệp trạng thái.

Tệp tin đầy đủ trông như thế này:

import logging
try:
    import requests
    HAS_REQUESTS = True
except ImportError:
    HAS_REQUESTS = False

log = logging.getLogger(__name__)

__virtual_name__ = 'weather'

def __virtual__():
    '''
    Only load weather if requests is available
    '''
    if HAS_REQUESTS:
        return __virtual_name__
    else:
        return False, 'The weather module cannot be loaded: requests package unavailable.'


def get(signs=None):
    '''
    Gets the Current Weather

    CLI Example::

        salt minion weather.get KPHL

    This module also accepts multiple values in a comma seperated list::

        salt minion weather.get KPHL,KACY
    '''
    log.debug(signs)
    return_value = {}
    signs = signs.split(',')
    for sign in signs:
        return_value[sign] = _make_request(sign)
    return return_value

def _make_request(sign):
    '''
    The function that makes the request for weather data from the National Weather Service.
    '''
    request = requests.get('https://api.weather.gov/stations/{}/observations/current'.format(sign))
    conditions = {
        "description:": request.json()["properties"]["textDescription"],
        "temperature": round(request.json()["properties"]["temperature"]["value"], 1)
    }
    return conditions

Chạy Mô-đun Thực thi

1.Để chạy mô-đun thực thi, trước tiên bạn cần đồng bộ hóa nó với các minion của mình. Để thực hiện việc này, bạn có thể gọi highstate với state.apply, cũng sẽ cố gắng áp dụng các thay đổi trạng thái mà bạn đã chỉ định trước đó trong weather.slstệp trạng thái. Vì weather.slstrạng thái đã được áp dụng trong phần Chuẩn bị muối , hãy sử dụng saltutil.sync_moduleshàm:

salt '*' saltutil.sync_modules

2.Chạy mô-đun thực thi trên máy chủ Salt của bạn:

salt '*' weather.get KPHL

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

salt-minion:
----------
KPHL:
    ----------
    description::
        Cloudy
    temperature:
        17.2

3.Ngoài ra, bạn có thể chạy mô-đun thực thi Salt cục bộ trên minion Salt của mình bằng cách nhập lệnh sau:

salt-call weather.get KVAY,KACY

Bạn sẽ nhận được kết quả như sau:

local:
    ----------
    KACY:
        ----------
        description::
            Cloudy
        temperature:
            18.9
    KVAY:
        ----------
        description::
            Cloudy
        temperature:
            16.7

Bây giờ bạn đã tạo và cài đặt thành công mô-đun thực thi Salt.

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/create-a-salt-execution-module/