Các ràng buộc Rpm-Python

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
    $ sudo dnf install -y python3-rpm
    3

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
4

RPM 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 PyPi

Thay 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à
    $ sudo dnf install -y python3-rpm
    8
  • 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à
    $ sudo dnf install -y python3-rpm
    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
    $ git clone git@github.com:josevnz/tutorials.git
    $ cd rpm_query
    1. ]

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
4

Mã 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
7

Bạ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
    $ sudo dnf install -y python3-rpm
    1
  • Hàm
    $ git clone git@github.com:josevnz/tutorials.git
    $ cd rpm_query
    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
  • Phép thuật tùy chỉnh xảy ra trong hàm tạo của lớp
    $ git clone git@github.com:josevnz/tutorials.git
    $ cd rpm_query
    2, với các tham số được đặt tên
  • Sau đó, mã trả về các giao dịch cơ sở dữ liệu theo phương thức
    $ git clone git@github.com:josevnz/tutorials.git
    $ cd rpm_query
    7
$ sudo dnf install -y python3-rpm
3

Mộ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ư
    $ git clone git@github.com:josevnz/tutorials.git
    $ cd rpm_query
    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
  • 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
6

Tô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 argparse

Argparse 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
    $ 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
    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
$ 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ờ
    $ 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
    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]

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
4

Vì vậy, làm thế nào để đầu ra trông bây giờ?

$ sudo dnf install -y python3-rpm
0

Nhữ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

Chủ Đề