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 sudo
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 .
Chuẩn bị muối
Các tệp được tạo trong các bước sau sẽ nằm trong thư /srv/salt
mục. Nếu bạn đã thay đổi file_roots
cấ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/salt
mụ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.sls
và 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/_modules
mụ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.py
trong /srv/salt/_modules
thư 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ề False
chuỗi lỗi và mô-đun không được tải. Điều if HAS_REQUESTS
kiệ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.sls
tệp trạng thái. Vì weather.sls
trạng thái đã được áp dụng trong phần Chuẩn bị muối , hãy sử dụng saltutil.sync_modules
hà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/