インストールされてるパッケージからカスタムyumリポジトリを作ってみる

かかないと忘れるであろうから書いときます。

####向いてるケースなど
バージョン合わせないと挙動が心配でテストが面倒だけどコンテナとかまだ言えないし、
イメージコピーだと構成管理ツールだとしてももろもろ確認して変数修正するの面倒だし、
[オレオレビルド](https://qiita.com/smallpalace/items/ba73ffff03ffe5398b0c)してるものやyumリポジトリじゃなくてクラウドストレージに置かれてたりで認証がアレとか、
いつまでそこにあるかわからないもの、全部同期すると容量が多すぎ欲しいのは特定の同じやつだけ、
等というケースにいいのかもしれないです（たぶん）。
（パッケージがweb上の他のyumリポジトリにないやつだと難しい）

単に落としてくるだけならこんなかんじで落ちてくるけども、これだとバージョンを合わせることができない。
`# yumdownloader --resolv zabbix-agent zabbix-release --enablerepo=zabbix`
のと、`--cacheonly`つけるとキャッシュが消えてることもあるのかなと思ったためつけず。

#####★合わせたいパッケージ入ってるホストにて入ってるパッケージのリストからダウンロードしてリポジトリをつくり一時的に公開

- ディレクトリ掘って移動して要るパッケージを既存パッケージのリストを限定して落としてくる

```
# mkdir zabbix-agent
# cd zabbix-agent/
# rpm -qa|grep zabbix|sudo xargs -L3 -P5 yumdownloader --enablerepo=zabbix --
```

もしもyumリポジトリの設定がkeepcache=1なら`/var/cache/yum/x86_64/7/`のしたにリポジトリディレクトリごとに既にあるのでそこからwebで公開できる場所にコピってcreaterepoするとよさそうです。


- createrepoする

```
# pwd
/var/www/html/yum/zabbix-agent
# createrepo .
# ls
repodata  zabbix-agent-3.0.4-1.el7.x86_64.rpm  zabbix-release-3.0-1.el7.noarch.rpm
```
- indexesオプションが有効なwebサーバとして公開

```
# vi /etc/httpd/conf/httpd.conf 
# tail -7 /etc/httpd/conf/httpd.conf 
IncludeOptional conf.d/*.conf
Alias /yum /var/www/html/yum
<Directory /var/www/html/yum>
    Options +Indexes
    Order allow,deny
    Allow from all
</Directory>
# systemctl reload httpd.service
# systemctl status httpd.service
```

GIPとかファイアウォールとかフォワーディングとか同期したいホストどうしで要るぶんをなんとかしておく。

#####★パッケージ同期して公開したいホストにて公開したホストをリポジトリとして指定してreposyncで同期する

- 適当な名前でよいので同期したいホストのアドレスを含んだ設定ファイルを作ってreposyncする
- createrepoもしといてここから落とせるようにしておく

（他の場所からのカスタムリポジトリからの落とし方は以下と同様というのとWebサーバとして公開されてる前提）

```
# pwd
/var/www/html/rpm/zabbix_agent
# vi zabbix-yum.conf
# cat zabbix-yum.conf 
[myzabbix]
name=myzabbix
baseurl = http://xxx.xxx.xxx.8/yum/zabbix-agent/
gpgcheck=0
# reposync -n -r myzabbix -p . -c ./zabbix-yum.conf --norepopath
# createrepo .
# ls
repodata                             zabbix-release-3.0-1.el7.noarch.rpm
zabbix-agent-3.0.4-1.el7.x86_64.rpm  zabbix-yum.conf
```
- webサーバとして公開する

・apacheの場合

```
# vi /etc/httpd/conf/httpd.conf 
# tail -7 /etc/httpd/conf/httpd.conf 
IncludeOptional conf.d/*.conf
Alias /yum /var/www/html/yum
<Directory /var/www/html/yum>
    Options +Indexes
    Order allow,deny
    Allow from all
</Directory>
# systemctl reload httpd.service
# systemctl status httpd.service
```

・nginxの場合 

```
# vi /etc/nginx/conf.d/yumrepo.conf 
server {
    listen      80;
    server_name mydomain;
    autoindex   on;
    location / {
        root   /usr/share/nginx/html;
        index index.html index.htm;
    }
}
# systemctl reload nginx.service
# systemctl status nginx.service
```
シンボリックリンク許可はApacheなら`Options`に`+FollowSymLinks`追加でnginxだと`disable_symlinks off;`追加になる模様。
httpsにするなら証明書とドメイン用意してそれ用のWEBサーバの設定する必要があるのとyumリポジトリの設定にsslverify=1が要ります。（sslverify=0にするとhttpsにつなぐときの証明書の検証をスキップする）

####入ってるのじゃなくて特定のリポジトリから特定のパッケージを同期したいケース
そういう時はreposyncで-cで指定する設定を以下のようにするとincludepkgsで指定したパッケージが入ります。

```
# cat php.yum.conf 
[php]
name=php
baseurl = https://rpms.southbridge.ru/rhel6/php-5.6/x86_64/
gpgcheck=0
enabled=0
includepkgs=php-*5.6.29* php-*remi.5.6* 
```


####リポジトリに優先度を指定する
enable=0（かリポジトリファイル自体をmvする等でそこからパッケージ入れたくないリポジトリを
基本無効にしておく）という手もあると思うのですが、それだと依存関係が解決しなくてかったるい場合があり、
無効化しないまでも優先度下げてほかに優先度高いリポジトリがあれば先にそっちをみて入れてくれる
という動きをさせることが可能です。

`priority=1`が最優先で、優先度が設定されているyumリポジトリがある場合には設定されてないものは優先度最低（99）になる

####Ansibleで配列変数の一部が設定されてない場合でも作動させる方法
パケージ名、メジャーバージョン、マイナーバージョンを指定可能にしておいて必要に応じて変数指定するというようなのに`default(omit)`が使えるかなあということで。ただ、yumモジュールだとname(pkg)にversionも含まれる感じだったので私には使えずに見え、pipモジュールなどで使える模様でした。あとワイルドカードがモジュール次第で限定的になるケースが多いような。

```
- name: touch files with an optional mode
  file: dest={{item.path}} state=touch mode={{item.mode|default(omit)}}
  with_items:
    - path: /tmp/foo
    - path: /tmp/bar
    - path: /tmp/baz
      mode: "0444"
```

http://blog.enjoyxstudy.com/entry/2016/04/24/000000
http://docs.ansible.com/ansible/latest/playbooks_filters.html#omitting-undefined-variables-and-parameters

####GPG鍵生成とrepoファイル配布用までrpmビルドする的な参考

https://knowledge.sakura.ad.jp/1086/

####そのた参考：
[yum でインストールしているパッケージでリポジトリを作成 - ngyukiの日記](http://ngyuki.hatenablog.com/entry/2013/01/11/004600)
[カスタムRPMや独自yumリポジトリではじめるソフトウェア管理術 | さくらのナレッジ](https://knowledge.sakura.ad.jp/1086/)
`yumdownloader --help`（なんかmanよりhelpのがオプションみやすかった）
`ansible-doc yum`
`ansible-doc yum_repository`
[Ansibleのdefault(omit) - Enjoy*Study](http://blog.enjoyxstudy.com/entry/2016/04/24/000000)
[bashのヒストリをログ出力するようにjenkinsでビルドする - Qiita](https://qiita.com/smallpalace/items/ba73ffff03ffe5398b0c)