rpmパッケージのダウンロードだけ実行する

以前、書いたエントリーなんだけど、割りと頻繁にアクセスされているよなので、ちょっと落ち穂拾いをしておこうと思う。

外部ネットワークへのアクセスが容易ではないネットワーク上に接続されたサーバに、最新状態の CentOS を入れてから、システム構築って話って意外とあるように思うのだけど、そういう環境で更新されたパッケージをどうやってアップデートする,というのは結構大変。
#逆に、そういう要求って少ない?

[From アップデートサーバにダイレクトアクセス出来ない環境下で、CentOS をアップデート - Soukaku's HENA-CHOKO Blog]

現状での最適解は、yum コマンド自身のオプションである --downloadonly オプションを使う、ってやつになるでしょうね。

パッケージをインストールせずにダウンロードだけ行う方法は 2 つあります。

yum の downloadonly プラグインを使用する方法と、yumdownloader ユーティリティを使用する方法です。

[From yum を使用して、パッケージをインストールせずにダウンロードだけ行う - Red Hat Customer Portal]

RHEL6/CentOS6 以降であれば、基本的に --downloadonly オプションが使えるんで、余分な手間ひまかけなくて良ですし…。

あと、以前のエントリーでやった方法の欠点としては、 epel レポジトリのものや、ソフトウェア開発元の提供しているレポジトリ(例えば、 Zabbix とか)をまとめて扱うのが難しかったりするんですよね…、実は…。

自分的によくやる方法

他の人達も書いているのでやり方自体はググればたくさん見つかるので、主に自分がよくやる手順を書いときます。

  1. まず、パッケージダウンロード専用の環境を用意します。
    • 常時起動しておく必要もないですし、リソースも使わないので、VMware Player や VirtualBox 上の仮想マシンで OK。
    • ここに、RHEL/CentOSをインストール。RHEL の場合は、サブスクリプションの手続きを忘れずに。
    • 当然ですが、ネット上のリポジトリにアクセス出来ること。
  2. 構築するシステムに合わせて、公式以外に必要なリポジトリ(epel とか Zabbix とか)の追加をします。
  3. 準備ができたら、 "yum --downloadonly update" とか "yum --downloadonly install zabbix-server-mysql" を実行。これでインストールに必要になるパッケージが、まとめてダウンロードされます。
    • デフォルトでのダウンロード先は、 /var/cache/yum ディレクトリの下。
      CentOS7だと、/var/cache/yum/x86_64/7/base/packages/ や /var/cache/yum/x86_64/7/extras/packages/ 。
    • デフォルト状態でダウンロードしてしまうと、ターゲットへの移動時に抜けが出ちゃったりすることのありえるので、大抵は --downloaddir オプションも一緒につけて、ダウンロード先を任意に指定してます。
  4. ダウンロードされたパッケージは、実際にシステムを構築したいサーバ上にファイル転送するなり、USB メモリなどのリムバブルメディアを用いて移動。移動先で "yum install *" か "rpm -ivh *" で、インストール。
  5. ターゲット側でのインストール/アップデートが終わったら、ダウンロード専用環境側でもパッケージのインストール/アップデートを実施。

と、いう感じ。


ダウンロード専用環境側でもパッケージをインストールしておくのは、のちのちターゲット側のパッケージを最新化したい、といったことが発生した(セキュリティ上、危険度の高い脆弱性に対応しなくちゃいけない)際に "yum --downloadonly update" で必要最低限のパッケージを容易にダウンロード出来るようにしておくため。
#ダウンロード専用環境は、システムやサーバの用途別に用意しておくほうが、後々混乱も少ないと思います。

実際に、 CentOS7 で ansible のインストールを --downloadonly--downloaddir 付きで実行してみると、下のように必要なパッケージをもれなくダウンロードすることが出来ます。
パッケージのダウンロード先となるディレクトリを作成して

[root@c7test ~]# mkdir pkgs/ansible

そのディレクトリを --downloaddir=pkgs/ansible と指定。

[root@c7test ~]# yum --downloadonly --downloaddir=pkgs/ansible install ansible
読み込んだプラグイン:fastestmirror
base | 3.6 kB 00:00:00
epel/x86_64/metalink | 8.0 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: ftp.kddilabs.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ ansible.noarch 0:2.4.2.0-2.el7 を インストール
--> 依存性の処理をしています: sshpass のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python2-jmespath のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-six のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-setuptools のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-passlib のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-paramiko のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-jinja2 のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-httplib2 のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: python-cryptography のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> 依存性の処理をしています: PyYAML のパッケージ: ansible-2.4.2.0-2.el7.noarch
--> トランザクションの確認を実行しています。
---> パッケージ PyYAML.x86_64 0:3.10-11.el7 を インストール
--> 依存性の処理をしています: libyaml-0.so.2()(64bit) のパッケージ: PyYAML-3.10-11.el7.x86_64
---> パッケージ python-httplib2.noarch 0:0.9.2-1.el7 を インストール
---> パッケージ python-jinja2.noarch 0:2.7.2-2.el7 を インストール
--> 依存性の処理をしています: python-babel >= 0.8 のパッケージ: python-jinja2-2.7.2-2.el7.noarch
--> 依存性の処理をしています: python-markupsafe のパッケージ: python-jinja2-2.7.2-2.el7.noarch
---> パッケージ python-paramiko.noarch 0:2.1.1-2.el7 を インストール
---> パッケージ python-passlib.noarch 0:1.6.5-2.el7 を インストール
---> パッケージ python-setuptools.noarch 0:0.9.8-7.el7 を インストール
--> 依存性の処理をしています: python-backports-ssl_match_hostname のパッケージ: python-setuptools-0.9.8-7.el7.noarch
---> パッケージ python-six.noarch 0:1.9.0-2.el7 を インストール
---> パッケージ python2-cryptography.x86_64 0:1.7.2-1.el7_4.1 を インストール
--> 依存性の処理をしています: python-pyasn1 >= 0.1.8 のパッケージ: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> 依存性の処理をしています: python-idna >= 2.0 のパッケージ: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> 依存性の処理をしています: python-cffi >= 1.4.1 のパッケージ: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> 依存性の処理をしています: python-ipaddress のパッケージ: python2-cryptography-1.7.2-1.el7_4.1.x86_64
--> 依存性の処理をしています: python-enum34 のパッケージ: python2-cryptography-1.7.2-1.el7_4.1.x86_64
---> パッケージ python2-jmespath.noarch 0:0.9.0-3.el7 を インストール
---> パッケージ sshpass.x86_64 0:1.06-2.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ libyaml.x86_64 0:0.1.4-11.el7_0 を インストール
---> パッケージ python-babel.noarch 0:0.9.6-8.el7 を インストール
---> パッケージ python-backports-ssl_match_hostname.noarch 0:3.4.0.2-4.el7 を インストール
--> 依存性の処理をしています: python-backports のパッケージ: python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch
---> パッケージ python-cffi.x86_64 0:1.6.0-5.el7 を インストール
--> 依存性の処理をしています: python-pycparser のパッケージ: python-cffi-1.6.0-5.el7.x86_64
---> パッケージ python-enum34.noarch 0:1.0.4-1.el7 を インストール
---> パッケージ python-idna.noarch 0:2.4-1.el7 を インストール
---> パッケージ python-ipaddress.noarch 0:1.0.16-2.el7 を インストール
---> パッケージ python-markupsafe.x86_64 0:0.11-10.el7 を インストール
---> パッケージ python2-pyasn1.noarch 0:0.1.9-7.el7 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ python-backports.x86_64 0:1.0-8.el7 を インストール
---> パッケージ python-pycparser.noarch 0:2.14-1.el7 を インストール
--> 依存性の処理をしています: python-ply のパッケージ: python-pycparser-2.14-1.el7.noarch
--> トランザクションの確認を実行しています。
---> パッケージ python-ply.noarch 0:3.4-11.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================================
Package アーキテクチャー
バージョン リポジトリー 容量
=======================================================================================================
インストール中:
ansible noarch 2.4.2.0-2.el7 extras 7.6 M
依存性関連でのインストールをします:
PyYAML x86_64 3.10-11.el7 base 153 k
libyaml x86_64 0.1.4-11.el7_0 base 55 k
python-babel noarch 0.9.6-8.el7 base 1.4 M
python-backports x86_64 1.0-8.el7 base 5.8 k
python-backports-ssl_match_hostname noarch 3.4.0.2-4.el7 base 12 k
python-cffi x86_64 1.6.0-5.el7 base 218 k
python-enum34 noarch 1.0.4-1.el7 base 52 k
python-httplib2 noarch 0.9.2-1.el7 extras 115 k
python-idna noarch 2.4-1.el7 base 94 k
python-ipaddress noarch 1.0.16-2.el7 base 34 k
python-jinja2 noarch 2.7.2-2.el7 base 515 k
python-markupsafe x86_64 0.11-10.el7 base 25 k
python-paramiko noarch 2.1.1-2.el7 extras 267 k
python-passlib noarch 1.6.5-2.el7 extras 488 k
python-ply noarch 3.4-11.el7 base 123 k
python-pycparser noarch 2.14-1.el7 base 104 k
python-setuptools noarch 0.9.8-7.el7 base 397 k
python-six noarch 1.9.0-2.el7 base 29 k
python2-cryptography x86_64 1.7.2-1.el7_4.1 updates 502 k
python2-jmespath noarch 0.9.0-3.el7 extras 39 k
python2-pyasn1 noarch 0.1.9-7.el7 base 100 k
sshpass x86_64 1.06-2.el7 extras 21 k

トランザクションの要約
=======================================================================================================
インストール 1 パッケージ (+22 個の依存関係のパッケージ)

総ダウンロード容量: 12 M
インストール容量: 60 M
Background downloading packages, then exiting:
exiting because "Download Only" specified

ダウンロード先に指定したディレクトリを確認すると…。

[root@c7test ~]# ls -l pkgs/ansible/
合計 12572
-rw-r--r--. 1 root root 156952 7月 4 2014 PyYAML-3.10-11.el7.x86_64.rpm
-rw-r--r--. 1 root root 7968876 1月 30 06:51 ansible-2.4.2.0-2.el7.noarch.rpm
-rw-r--r--. 1 root root 56068 1月 30 2015 libyaml-0.1.4-11.el7_0.x86_64.rpm
-rw-r--r--. 1 root root 1426348 7月 4 2014 python-babel-0.9.6-8.el7.noarch.rpm
-rw-r--r--. 1 root root 5932 3月 14 2015 python-backports-1.0-8.el7.x86_64.rpm
-rw-r--r--. 1 root root 12144 7月 4 2014 python-backports-ssl_match_hostname-3.4.0.2-4.el7.noarch.rpm
-rw-r--r--. 1 root root 223012 11月 21 2016 python-cffi-1.6.0-5.el7.x86_64.rpm
-rw-r--r--. 1 root root 53496 11月 26 2015 python-enum34-1.0.4-1.el7.noarch.rpm
-rw-r--r--. 1 root root 117968 9月 22 2017 python-httplib2-0.9.2-1.el7.noarch.rpm
-rw-r--r--. 1 root root 95952 8月 11 2017 python-idna-2.4-1.el7.noarch.rpm
-rw-r--r--. 1 root root 35176 11月 21 2016 python-ipaddress-1.0.16-2.el7.noarch.rpm
-rw-r--r--. 1 root root 527832 7月 4 2014 python-jinja2-2.7.2-2.el7.noarch.rpm
-rw-r--r--. 1 root root 25792 7月 4 2014 python-markupsafe-0.11-10.el7.x86_64.rpm
-rw-r--r--. 1 root root 273328 9月 8 2017 python-paramiko-2.1.1-2.el7.noarch.rpm
-rw-r--r--. 1 root root 500108 9月 8 2017 python-passlib-1.6.5-2.el7.noarch.rpm
-rw-r--r--. 1 root root 125732 8月 11 2017 python-ply-3.4-11.el7.noarch.rpm
-rw-r--r--. 1 root root 106984 11月 26 2015 python-pycparser-2.14-1.el7.noarch.rpm
-rw-r--r--. 1 root root 406404 8月 11 2017 python-setuptools-0.9.8-7.el7.noarch.rpm
-rw-r--r--. 1 root root 29404 11月 26 2015 python-six-1.9.0-2.el7.noarch.rpm
-rw-r--r--. 1 root root 514416 10月 20 21:34 python2-cryptography-1.7.2-1.el7_4.1.x86_64.rpm
-rw-r--r--. 1 root root 39576 10月 25 01:38 python2-jmespath-0.9.0-3.el7.noarch.rpm
-rw-r--r--. 1 root root 102132 11月 21 2016 python2-pyasn1-0.1.9-7.el7.noarch.rpm
-rw-r--r--. 1 root root 21896 9月 8 2017 sshpass-1.06-2.el7.x86_64.rpm

ベースとしたマシンでの、パッケージのインストール/アップデートの状態で、ダウンロードされるパッケージに違いが出てくる点には注意は必要ですが、いざターターゲットとなるマシン上でインストール作業をするときに「あ!あのパッケージ足りない…。」ということが起きにくいので、作業効率的には良いのではないかと…。

トラックバック(0)

コメントする