Redhat系Linuxで、OSパッケージを戻す方法

ウェブアプリ周辺のバージョンは、下記のように戻せるので、安心感があります。

* ウェブアプリは、gitのtagと、Capistranoを組合せることにより、いつでも特定のバージョンに戻せます。
* サーバー設定は、gitのtagと、AnsibleやChefの組合せで、いつでも特定のバージョンに戻せます。
* RDBMSは、デイリーバックアップや、PITリカバリで、ある範囲に戻すことができます。

OSパッケージは、どうやって戻すのか。Redhat系Linuxで調べました。

# yumでインストール可能なバージョンを調べたい

```
yum --showduplicate list <packagename>
```

* 複数指定、アスタリスク指定などが可能
* インストール可能な全バージョンが表示される
* 色の意味は下記。(ターミナルのカラースキームによって違うかも...
  * 黒；過去入れたことのないバージョン
  * 水；過去入れたことのあるバージョン
  * 緑&太字；いま入ってるバージョン
  * 青&太字；アップデート可能な新バージョン
* AmazonLinuxは、バージョン「YYYY/MM」の範囲で表示される
  * 2016/03なら、その範囲でのバージョンが表示される
* 他のリポジトリは、そのリポジトリの方針に従って表示される
  * nginx, remi, datadog, などなど

# yumで特定のバージョンに戻したい

showduplicate list の情報を元に、パッケージ名とバージョン名を特定して、downgradeで戻せます。

```
yum downgrade <packagename>-<version>
```

# yumで直前のバージョンに戻したい

バージョン番号を省略可能

```
yum downgrade <packagename>
```

# yumコマンドによる変更履歴を調べたい

直近20回の履歴

```
[root@web01 ec2-user]# yum history list
Loaded plugins: priorities, upgrade-helper
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
   104 | EC2 ... <ec2-user>       | 2016-08-31 17:40 | Install        |   12
   103 | EC2 ... <ec2-user>       | 2016-08-25 11:10 | Install        |    1
   102 | EC2 ... <ec2-user>       | 2016-07-28 12:07 | Update         |    1 EE
   101 | EC2 ... <ec2-user>       | 2016-07-12 14:35 | Install        |    8
   100 | EC2 ... <ec2-user>       | 2016-07-12 14:34 | Update         |    1 EE
    99 | EC2 ... <ec2-user>       | 2016-05-10 12:48 | Update         |    3
    98 | EC2 ... <ec2-user>       | 2016-05-10 12:40 | Update         |    2
    97 | EC2 ... <ec2-user>       | 2016-05-10 12:40 | Update         |    1
    96 | System <unset>           | 2016-05-10 12:31 | Install        |    1
    95 | System <unset>           | 2016-05-10 12:31 | Erase          |    1
    94 | EC2 ... <ec2-user>       | 2016-05-10 12:15 | I, U           |    7 EE
    93 | EC2 ... <ec2-user>       | 2016-03-18 13:14 | E, I, U        |   12 EE
    92 | EC2 ... <ec2-user>       | 2016-03-13 11:11 | Update         |   15
    91 | EC2 ... <ec2-user>       | 2016-03-13 11:10 | Update         |    2
    90 | EC2 ... <ec2-user>       | 2016-03-10 14:44 | Install        |    1
    89 | EC2 ... <ec2-user>       | 2016-03-10 14:43 | Update         |    4 E<
    88 | EC2 ... <ec2-user>       | 2016-03-09 18:46 | Update         |    4 >E
    87 | EC2 ... <ec2-user>       | 2016-03-01 21:58 | Install        |    1
    86 | EC2 ... <ec2-user>       | 2016-03-01 21:57 | Update         |    4 EE
    85 | EC2 ... <ec2-user>       | 2016-02-23 10:29 | Update         |    3
history list
```

全履歴

```
yum history list all
```

# yumコマンドの履歴IDごとの作業内容を調べる

yum history listで左端のIDで、作業内容を調べることができます。

履歴ID「96」の内容を調べるなら

```
[root@web01 ec2-user]# yum history info 96
Loaded plugins: priorities, upgrade-helper
Transaction ID : 96
Begin time     : Tue May 10 12:31:56 2016
Begin rpmdb    : 620:b2548581121a92f05d2abb13a36606703d422fb6
End time       :            12:31:57 2016 (1 seconds)
End rpmdb      : 621:151e4d1786935d2faf91e0a13ccef4836a4ee9d9
User           : System <unset>
Return-Code    : Success
Command Line   : -d0 -e0 -y --disablerepo=* localinstall /var/lib/aws/opsworks/cache.stage2/opsworks_assets/opsworks-ruby22.PVoU39yu/opsworks-ruby22-2.2.5-1.x86_64.rpm
Transaction performed with:
    Installed     rpm-4.11.2-2.73.amzn1.x86_64  @amzn-updates/2015.09
    Installed     yum-3.4.3-137.65.amzn1.noarch @amzn-updates/2015.09
Packages Altered:
    Install opsworks-ruby22-2.2.5.1-1.x86_64 @/opsworks-ruby22-2.2.5-1.x86_64/2015.09
history info
```

# yum install, yum updateなどの作業を取り消したい

履歴ID「96」を取り消すなら。

```
yum history undo 96
```

* yum installなどと同様に、y/nを聞かれるので、答えて進める。
* この作業もyum historyに記録されるので、undoのundoはもちろん、undoのundoのundoも可能。

# まとまった範囲の作業を取り消したい

履歴ID 116 ~ 156 を取り消すなら

```
seq 116 156 \
| sort -r \
| while read F; do
  yum -y history undo $F
done
```

* yum -y としていることで、y/nを聞かれることなく一気に進める
* sort -r することで、履歴の新しいほうから古いほうに向けて取り消していく