rpmなサーバ環境でのアップデートパッケージ情報取得

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

rpmの管理

現在稼動している多くのサーバについてそれぞれ未適用のアップデートパッケージは何かを管理したいということはしばしばあります。
yumを用いることで一覧を取得することは可能ですが整形済みということや、パッケージ名やバージョンの表示が下記の様に少々スクリプト処理をするには面倒な状態です。

$ sudo yum list updates > pkg.txt

$ cat pkg.txt
Loaded plugins: priorities, update-motd, upgrade-helper
Updated Packages
aws-amitools-ec2.noarch              1.5.6-1.1.amzn1                amzn-updates
aws-apitools-ec2.noarch              1.7.2.0-1.0.amzn1              amzn-updates
aws-apitools-rds.noarch              1.18.001-1.0.amzn1             amzn-updates
aws-cfn-bootstrap.noarch             1.4-3.amzn1                    amzn-updates
aws-cli.noarch                       1.6.2-1.1.amzn1                amzn-updates
bash.x86_64                          4.1.2-15.23.amzn1              amzn-updates

repoquery(1)コマンドの利用

yum-utilsパッケージに含まれているrepoquery(1)ではrpm(8)の様にリポジトリをクエリする事が可能になります。
rpmコマンドと同じように使えるということでフォーマット指定も可能なので、まさにスクリプトの処理にぴったりです。

$ /usr/bin/repoquery --pkgnarrow=updates --all --qf='%{name}\t%{arch}\t%{version}\t%{release}\t%{repo}'
aws-amitools-ec2        noarch  1.5.6   1.1.amzn1       amzn-updates
aws-apitools-ec2        noarch  1.7.2.0 1.0.amzn1       amzn-updates
aws-apitools-rds        noarch  1.18.001        1.0.amzn1       amzn-updates
aws-cfn-bootstrap       noarch  1.4     3.amzn1 amzn-updates
aws-cli noarch  1.6.2   1.1.amzn1       amzn-updates
bash    x86_64  4.1.2   15.23.amzn1     amzn-updates

ここまでで明かりがみえてきましたので、こんな感じでjsonにするスクリプトにしてみました。(最終行の扱いが微妙ですがサンプル程度ということで)

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import sys
import string
import json

format_string = '%{name}\t%{arch}\t%{version}\t%{release}\t%{repo}'
title = ["name","arch","vaersion","release","repo"]
(stdout, stderr) = subprocess.Popen(['/usr/bin/repoquery', '--all', '--pkgnarrow=updates', '--qf=%s' % format_string], stdout=subprocess.PIPE).communicate()
yum_string = stdout.split("\n")
d = {}
pkgs = []
pkg_object = {}
for l in yum_string:
    d = {}
    for t, f in zip(title, string.split(l.rstrip('rn'), sep="\t")):
        d[t] = f
    pkgs.append(d)
pkg_object['pkgs'] = pkgs
print json.dumps(pkg_object, indent=4)


出力

{
    "pkgs": [
        {
            "release": "1.1.amzn1",
            "repo": "amzn-updates",
            "arch": "noarch",
            "name": "aws-amitools-ec2",
            "vaersion": "1.5.6"
        },
        {
            "release": "1.0.amzn1",
            "repo": "amzn-updates",
            "arch": "noarch",
            "name": "aws-apitools-ec2",
            "vaersion": "1.7.2.0"
        },
        {
            "release": "1.0.amzn1",
            "repo": "amzn-updates",
            "arch": "noarch",
            "name": "aws-apitools-rds",
            "vaersion": "1.18.001"
        },
         {
            "name": ""
        }
    ]
}


日々このjsonを処理すればパッケージ管理の前進ができそうです。

投稿者プロフィール

えんじにあん
インフラ系のエンジニアです。
運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

インフラ系のエンジニアです。 運用系のスクリプトを書いたり、オートメーションな世界に向かって日々精進しています。