Trình quản lý gói RPM [RPM] là một hệ thống quản lý gói điều khiển bằng dòng lệnh có khả năng cài đặt, gỡ cài đặt, xác minh, truy vấn và cập nhật các gói phần mềm máy tính
Gói này bao gồm các ràng buộc Python cho librpm, cho phép các tập lệnh Python thao tác các gói RPM và cơ sở dữ liệu RPM
Viết chương trình Python in danh sách phần mềm được cài đặt trên hệ thống của bạn, sau đó kiểm tra xem ứng dụng có hoạt động chính xác không
Đã đăng. Ngày 1 tháng 12 năm 2021 . %t phút đọc . của Jose Vicente Nunez [Sudoer]
Hình ảnh
Trò chuyện WOCinTech, CC BY 2. 0
Khi cài đặt phần mềm trên hệ thống Linux, trình quản lý gói của bạn sẽ theo dõi những gì đã được cài đặt, những gì nó phụ thuộc vào, những gì nó cung cấp, v.v.
Cách thông thường để xem siêu dữ liệu đó là thông qua trình quản lý gói của bạn. Trong trường hợp của Fedora hoặc Red Hat Enterprise Linux, đó là cơ sở dữ liệu RPM
Cơ sở dữ liệu RPM có thể được truy vấn từ dòng lệnh bằng lệnh
$ sudo dnf install -y python3-rpm
1, hỗ trợ một số tùy chọn định dạng rất đẹp. Ví dụ: để lấy danh sách tất cả các gói được sắp xếp theo kích thước, tôi có thể sử dụng một ít keo Bash để làm như sau$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n
...
linux-firmware-20200421 256914779
conda-4.8.4 228202733
glibc-all-langpacks-2.29 217752640
docker-ce-cli-19.03.12 168609825
clang-libs-8.0.0 117688777
wireshark-cli-3.2.3 108810552
llvm-libs-8.0.0 108310728
docker-ce-19.03.12 106517368
ansible-2.9.9 102477070
Lệnh
$ sudo dnf install -y python3-rpm
1 có nhiều tùy chọn, nhưng nếu tôi muốn định dạng các số ở đầu ra thì sao? Sau khi bạn đã viết một tập lệnh để quản lý truy vấn, còn đơn vị kiểm tra mã thì sao?
[ Tải xuống bảng cheat script Bash shell để luôn nắm được kiến thức cơ bản. ]
Đây là nơi các ngôn ngữ khác như Python tỏa sáng. Trong hướng dẫn này, tôi trình bày cách
- Tương tác với cơ sở dữ liệu RPM bằng cách sử dụng các ràng buộc RPM của Python
- Viết một lớp Python để tạo trình bao bọc xung quanh các ràng buộc RPM được cung cấp
- Làm cho tập lệnh dễ sử dụng và tùy chỉnh hơn bằng cách gọi các phương thức argparse để phân tích cú pháp giao diện dòng lệnh
- Đơn vị kiểm tra mã mới với
3$ sudo dnf install -y python3-rpm
Tải xuống DevOps tuyệt vời
- Các công cụ giám sát DevOps mã nguồn mở
- Bắt đầu với DevSecOps
- Ansible cho DevOps
- Hướng dẫn tuyển dụng DevOps cuối cùng
Tôi sẽ trình bày rất nhiều ở đây, vì vậy kiến thức cơ bản về Python [ví dụ: hướng đối tượng hoặc OO, lập trình] là cần thiết. Bạn sẽ có thể nắm bắt cách tạo lớp Python ngay cả khi bạn không biết nhiều về lập trình OO. [Tôi sẽ loại bỏ các tính năng nâng cao, như lớp ảo, lớp dữ liệu và các tính năng khác. ]
Ngoài ra, bạn nên biết cơ sở dữ liệu RPM là gì. Ngay cả khi bạn không biết nhiều, mã này rất đơn giản để làm theo và mã soạn sẵn nhỏ
Có một số chương dành riêng cho việc tương tác với cơ sở dữ liệu RPM trong tài liệu Fedora. Tuy nhiên, trong bài viết này, tôi sẽ viết một chương trình đơn giản để in danh sách các gói RPM được sắp xếp theo kích thước
Cơ sở dữ liệu RPM và Python
Python là ngôn ngữ mặc định tuyệt vời dành cho quản trị viên hệ thống và cơ sở dữ liệu RPM đi kèm với các ràng buộc giúp dễ dàng truy vấn bằng Python
[ Đăng ký khóa học trực tuyến miễn phí Tổng quan về kỹ thuật của Red Hat Enterprise Linux. ]
Cài đặt gói python3-rpm
Để hướng dẫn này hoạt động, bạn cần cài đặt gói
$ sudo dnf install -y python3-rpm
4RPM có mối quan hệ sâu sắc với hệ thống. Đó là một trong những lý do nó không được cung cấp thông qua lệnh
$ sudo dnf install -y python3-rpm
5 và kho lưu trữ mô-đun PyPiThay vào đó hãy cài đặt gói
$ sudo dnf install -y python3-rpm
4 bằng lệnh $ sudo dnf install -y python3-rpm
7$ sudo dnf install -y python3-rpm
Cuối cùng, sao chép mã cho hướng dẫn này
$ git clone git@github.com:josevnz/tutorials.git
$ cd rpm_query
Tạo môi trường ảo Python
Python có một tính năng gọi là môi trường ảo. Một môi trường ảo cung cấp một vị trí hộp cát để
- Cài đặt các phiên bản thư viện khác với phần còn lại của hệ thống
- Cách ly khỏi các thư viện xấu hoặc không ổn định để sự cố với thư viện không ảnh hưởng đến toàn bộ cài đặt Python của bạn
- Cô lập phần mềm để kiểm tra dễ dàng hơn trước khi hợp nhất nhánh tính năng vào nhánh chính. [Một quy trình tích hợp liên tục đảm nhận việc triển khai mã mới trong môi trường ảo thử nghiệm. ]
Đối với hướng dẫn này, hãy sử dụng môi trường ảo với các tính năng sau
- Môi trường được gọi là
8$ sudo dnf install -y python3-rpm
- Tôi rò rỉ các gói hệ thống bên trong môi trường, vì gói hệ thống cần thiết là
4 và gói này không khả dụng cho đến$ sudo dnf install -y python3-rpm
5. [Bạn có thể cung cấp quyền truy cập vào các gói trang web bằng tùy chọn$ sudo dnf install -y python3-rpm
1. ]$ git clone git@github.com:josevnz/tutorials.git $ cd rpm_query
Tạo và kích hoạt nó như thế này
$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n
...
linux-firmware-20200421 256914779
conda-4.8.4 228202733
glibc-all-langpacks-2.29 217752640
docker-ce-cli-19.03.12 168609825
clang-libs-8.0.0 117688777
wireshark-cli-3.2.3 108810552
llvm-libs-8.0.0 108310728
docker-ce-19.03.12 106517368
ansible-2.9.9 102477070
4Mã hóa lớp RPM truy vấn
Đối với ứng dụng ví dụ này, tôi sẽ bọc phiên bản RPM trong trình quản lý ngữ cảnh. Điều này giúp sử dụng dễ dàng hơn mà không phải lo lắng về việc đóng cơ sở dữ liệu RPM theo cách thủ công. Ngoài ra, tôi sẽ thực hiện một số phím tắt để trả về kết quả của truy vấn cơ sở dữ liệu. Cụ thể, tôi đang giới hạn số lượng kết quả và quản lý sắp xếp
[ Tìm hiểu 16 bước để xây dựng các cụm Kubernetes sẵn sàng sản xuất. ]
Đặt tất cả chức năng này vào một lớp [tập hợp dữ liệu và phương thức] cùng nhau là điều làm cho hướng đối tượng trở nên hữu ích. Trong ví dụ này, chức năng RPM nằm trong một lớp có tên là
$ git clone git@github.com:josevnz/tutorials.git
$ cd rpm_query
2 và mục đích của nó là- Để xác định các tham số lọc như số lượng mục và sắp xếp kết quả tại thời điểm tạo [sử dụng hàm tạo của lớp cho điều đó]
- Để cung cấp một cách để lặp qua mọi gói của hệ thống
Đầu tiên, sử dụng lớp
$ git clone git@github.com:josevnz/tutorials.git
$ cd rpm_query
2 để lấy danh sách tối đa năm gói, được sắp xếp theo kích cỡ$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n
...
linux-firmware-20200421 256914779
conda-4.8.4 228202733
glibc-all-langpacks-2.29 217752640
docker-ce-cli-19.03.12 168609825
clang-libs-8.0.0 117688777
wireshark-cli-3.2.3 108810552
llvm-libs-8.0.0 108310728
docker-ce-19.03.12 106517368
ansible-2.9.9 102477070
7Bạn có thể sử dụng một tính năng của Python được gọi là các đối số được đặt tên, giúp việc sử dụng lớp dễ dàng hơn nhiều
Nếu bạn hài lòng với các đối số mặc định thì sao?
$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n
...
linux-firmware-20200421 256914779
conda-4.8.4 228202733
glibc-all-langpacks-2.29 217752640
docker-ce-cli-19.03.12 168609825
clang-libs-8.0.0 117688777
wireshark-cli-3.2.3 108810552
llvm-libs-8.0.0 108310728
docker-ce-19.03.12 106517368
ansible-2.9.9 102477070
8Đây là cách để thực hiện nó
- Mã nhập RPM đang trong quá trình thử/ngoại trừ vì RPM có thể chưa được cài đặt. Vì vậy, nếu nó không thành công, nó sẽ làm như vậy một cách duyên dáng, giải thích rằng cần phải cài đặt
1$ sudo dnf install -y python3-rpm
- Hàm
5 đảm nhiệm việc trả về các kết quả được sắp xếp hoặc nguyên trạng. Truyền tham chiếu đến chức năng này tới mã truy vấn cơ sở dữ liệu$ git clone git@github.com:josevnz/tutorials.git $ cd rpm_query
- Phép thuật tùy chỉnh xảy ra trong hàm tạo của lớp
2, với các tham số được đặt tên$ git clone git@github.com:josevnz/tutorials.git $ cd rpm_query
- Sau đó, mã trả về các giao dịch cơ sở dữ liệu theo phương thức
7$ git clone git@github.com:josevnz/tutorials.git $ cd rpm_query
$ sudo dnf install -y python3-rpm
3Một vài điều cần lưu ý
- Bạn có thể sử dụng lại logic tìm kiếm này không chỉ trong ứng dụng giao diện dòng lệnh [CLI] mà còn trong các dịch vụ GUI hoặc REST trong tương lai vì chức năng nằm trên một đơn vị được xác định rõ [dữ liệu + hành động]
- Bạn có thấy cách tôi "gợi ý" cho trình thông dịch về các loại đối số trong hàm tạo [như
8 là một số nguyên] không? . Python không yêu cầu nó, nhưng đó là một cách thực hành tốt$ git clone git@github.com:josevnz/tutorials.git $ cd rpm_query
- Có thể tốt khi cung cấp các giá trị mặc định cho các tham số. Điều đó có thể làm cho một lớp dễ sử dụng hơn nếu nhà phát triển quyết định không ghi đè giá trị mặc định [nói cách khác, làm cho đối số trở thành "tùy chọn"]
- Đây cũng là một cách thực hành tốt để ghi lại các phương pháp, thậm chí ngắn gọn. IDE hiển thị chi tiết này khi sử dụng các phương thức
Tiến hành kiểm tra đơn vị với unittest
Đây là một câu hỏi quan trọng. Làm thế nào tốt là mã này mà không cần kiểm tra?
Tìm hiểu thêm về tự động hóa
- Giới thiệu về Ansible
- Đăng ký dùng thử Nền tảng tự động hóa Ansible
- Hướng dẫn dành cho quản trị viên hệ thống về tự động hóa CNTT
- Di chuyển sang Nền tảng tự động hóa Ansible 2
- Ansible so với. Terraform, làm rõ
Tự động hóa mã kiểm tra là một ý tưởng hay. Kiểm thử đơn vị khác với các loại kiểm thử khác. Nhìn chung, nó làm cho một ứng dụng mạnh mẽ hơn vì nó đảm bảo ngay cả các thành phần nhỏ cũng hoạt động chính xác [và nó hoạt động tốt hơn nếu nó chạy sau mỗi thay đổi]
Trong trường hợp này, Python unittest không gì khác hơn là một lớp tự động kiểm tra xem một hàm có hoạt động chính xác hay không
Một bài kiểm tra đơn vị tốt
- Nhỏ. Nếu một phương pháp đang thử nghiệm nhiều hơn một tính năng, thì có lẽ phương pháp đó nên được chia thành nhiều thử nghiệm hơn
- khép kín. Lý tưởng nhất là nó không có các phụ thuộc bên ngoài như cơ sở dữ liệu hoặc máy chủ ứng dụng. Đôi khi, bạn có thể thay thế các phần phụ thuộc đó bằng các đối tượng giả có thể bắt chước một phần của hệ thống và thậm chí cho phép các lỗi mô phỏng
- có thể lặp lại. Kết quả của việc chạy thử nghiệm phải giống nhau. Vì vậy, có thể cần phải làm sạch trước và sau khi chạy thử nghiệm []
Tôi đã viết một bài kiểm tra đơn vị cho lớp
$ git clone git@github.com:josevnz/tutorials.git
$ cd rpm_query
9- Mã này có một số xác nhận phải đúng để vượt qua trường hợp thử nghiệm
- Tôi không sử dụng các đối tượng giả vì khung RPM đã ăn sâu vào Fedora và Red Hat nên cơ sở dữ liệu thực được đảm bảo ở đó. Ngoài ra, các bài kiểm tra không phá hủy
$ sudo dnf install -y python3-rpm
6Tôi thực sự khuyên bạn nên đọc tài liệu chính thức về unittest để biết thêm chi tiết, vì có rất nhiều thứ để kiểm tra đơn vị hơn mã đơn giản này truyền tải. Ví dụ: có thử nghiệm mô phỏng, đặc biệt hữu ích cho các tình huống phụ thuộc vào hệ thống phức tạp
Cải thiện tập lệnh với argparse
Bạn có thể viết một CLI nhỏ bằng cách sử dụng lớp
$ git clone git@github.com:josevnz/tutorials.git
$ cd rpm_query
2 đã tạo trước đó và để tùy chỉnh dễ dàng hơn, hãy sử dụng argparseArgparse cho phép bạn
- Xác thực đầu vào của người dùng và hạn chế số lượng tùy chọn. Ví dụ, để kiểm tra xem số lượng kết quả có phải là số không âm hay không, bạn có thể viết loại
41 trên mô-đun$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n ... linux-firmware-20200421 256914779 conda-4.8.4 228202733 glibc-all-langpacks-2.29 217752640 docker-ce-cli-19.03.12 168609825 clang-libs-8.0.0 117688777 wireshark-cli-3.2.3 108810552 llvm-libs-8.0.0 108310728 docker-ce-19.03.12 106517368 ansible-2.9.9 102477070
42. Bạn cũng có thể làm điều đó trong hàm tạo của lớp [nhưng tôi muốn hiển thị tính năng này]. Bạn có thể sử dụng nó để thêm logic bổ sung không có trong mã gốc$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n ... linux-firmware-20200421 256914779 conda-4.8.4 228202733 glibc-all-langpacks-2.29 217752640 docker-ce-cli-19.03.12 168609825 clang-libs-8.0.0 117688777 wireshark-cli-3.2.3 108810552 llvm-libs-8.0.0 108310728 docker-ce-19.03.12 106517368 ansible-2.9.9 102477070
$ sudo dnf install -y python3-rpm
0- Kết hợp nhiều tùy chọn để làm cho chương trình dễ sử dụng hơn. Tôi thậm chí có thể đánh dấu một số yêu cầu nếu cần
- Cung cấp trợ giúp theo ngữ cảnh về cách sử dụng chương trình [cờ
43,$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n ... linux-firmware-20200421 256914779 conda-4.8.4 228202733 glibc-all-langpacks-2.29 217752640 docker-ce-cli-19.03.12 168609825 clang-libs-8.0.0 117688777 wireshark-cli-3.2.3 108810552 llvm-libs-8.0.0 108310728 docker-ce-19.03.12 106517368 ansible-2.9.9 102477070
44]$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n ... linux-firmware-20200421 256914779 conda-4.8.4 228202733 glibc-all-langpacks-2.29 217752640 docker-ce-cli-19.03.12 168609825 clang-libs-8.0.0 117688777 wireshark-cli-3.2.3 108810552 llvm-libs-8.0.0 108310728 docker-ce-19.03.12 106517368 ansible-2.9.9 102477070
Sử dụng lớp này để truy vấn cơ sở dữ liệu RPM trở nên rất dễ dàng bằng cách phân tích cú pháp các tùy chọn và sau đó gọi
$ rpm -qa --queryformat "%{NAME}-%{VERSION} %{SIZE}\n"|sort -r -k 2 -n
...
linux-firmware-20200421 256914779
conda-4.8.4 228202733
glibc-all-langpacks-2.29 217752640
docker-ce-cli-19.03.12 168609825
clang-libs-8.0.0 117688777
wireshark-cli-3.2.3 108810552
llvm-libs-8.0.0 108310728
docker-ce-19.03.12 106517368
ansible-2.9.9 102477070
45$ sudo dnf install -y python3-rpm
4Vì vậy, làm thế nào để đầu ra trông bây giờ?
$ sudo dnf install -y python3-rpm
0Những gì tôi đã bảo hiểm
Hình ảnh
Tải ngay
Có rất nhiều thông tin trong bài báo này. Tôi được bảo hiểm
- Viết các mô-đun và lớp để tương tác với cơ sở dữ liệu RPM. Bài viết này hầu như chỉ sơ lược về tất cả những điều bạn có thể làm với API
- Tự động kiểm tra các phần nhỏ của ứng dụng với unittest
- Sử dụng Argparse để làm cho ứng dụng hoạt động dễ dàng hơn
Trong bài viết tiếp theo của tôi, tôi sẽ khám phá cách đóng gói một ứng dụng để cài đặt trên một máy khác bằng Python
Xem các bài viết liên quan này trên Enable Sysadmin
Hình ảnh
Cách tạo gói Linux RPM
Bạn đã viết một tập lệnh tuyệt vời mà bạn muốn phân phối, vậy tại sao không đóng gói nó dưới dạng RPM?
Đã đăng. Ngày 27 tháng 11 năm 2020
Tác giả. Valentin Bajrami [Accelerator, cựu sinh viên Sudoer]
Hình ảnh
Các mẹo khác để đóng gói phần mềm Linux của bạn bằng RPM
Tìm hiểu cách biên dịch và đóng gói ứng dụng Linux của bạn để phân phối với Red Hat Package Manager
Đã đăng. Ngày 4 tháng 11 năm 2021
Tác giả. Jose Vicente Nunez [Sudoer]
Hình ảnh
Cách đóng gói các ứng dụng nguồn mở dưới dạng RPM
Bạn muốn sử dụng một phần mềm của bên thứ ba nhưng không có RPM để cài đặt? . Bạn có thể tùy chỉnh các gói phần mềm của bên thứ ba bằng RPM
Đã đăng. Ngày 11 tháng 11 năm 2021
Tác giả. Jose Vicente Nunez [Sudoer]
chủ đề. Quản lý gói Kiểm tra Python
Jose Vicente Nunez
Người cha và người chồng tự hào, nhà phát triển phần mềm và quản trị viên hệ thống. Á hậu giải trí và đam mê. Thêm về tôi
Hội nghị thượng đỉnh mũ đỏ 2022. theo yêu cầu
Nhận thông tin mới nhất về Ansible, Red Hat Enterprise Linux, OpenShift, v.v. từ sự kiện ảo theo yêu cầu của chúng tôi
Đăng kí miễn phí
Nội dung liên quan
Hình ảnh
2 cách thiết thực để sử dụng mô-đun quy trình con Python
Tìm hiểu cách chạy các lệnh và tập lệnh Bash trong tập lệnh Python của bạn bằng mô-đun quy trình con
Đã đăng. Ngày 23 tháng 11 năm 2022
Tác giả. Nicole Lama [Sudoer, Mũ đỏ]
Hình ảnh
Python so với. Bash?
Mô-đun quy trình con của Python dễ dàng tích hợp Bash vào tập lệnh Python của bạn
Đã đăng. Ngày 22 tháng 11 năm 2022
Tác giả. Nicole Lama [Sudoer, Mũ đỏ]
Hình ảnh
Cách phân tích dữ liệu chuỗi thời gian bằng Python và InfluxDB
Cơ sở dữ liệu quan hệ không hoạt động tốt với dữ liệu chuỗi thời gian. Hướng dẫn này chỉ cho bạn cách sử dụng InfluxDB để phân tích dữ liệu được thu thập theo thời gian