細々とkubeadm
を使ったKubernetesクラスタのデプロイをAnsibleで自動化するってのをやってるんだけど、手順の中のContainer RuntimeのインストールでDockerインストールのためのYumリポジトリの設定をyum-config-manager
で行うというのがあって、でもAnsibleモジュールだとこれに対応したものが無さそうだったので、どうすればいいか考えてみた。
※ yum_repositoryモジュールはあるけど、リポジトリのURL毎に設定が必要で、今回はリンク先で提供されている「リポジトリ一覧ファイル」が既にある場合には使えなかった。後述。
yum-config-managerってなにやってるの?
yum-config-manager
自体には設定済みリポジトリの有効/無効切り替えなどの機能はあるけど、Dockerインストールの準備として今回使っている以下のコマンド。
### Add Docker repository. yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
--add-repo
の動作は、一言で言うと「引数のファイル or URLのリポジトリ定義ファイルを/etc/yum.repos.d
に配置」。
ヘルプメッセージから引用。
yum-config-manager options: --save save the current options (useful with --setopt) --enable enable the specified repos (automatically saves) --disable disable the specified repos (automatically saves) --add-repo=ADDREPO add (and enable) the repo from the specified file or url
ソースコード(Pythonスクリプトなのでless $(which yum-config-manager)
でも見れる)はこの辺
細かく見たわけじゃないけれど、yum-config-manager --add-repo <URL>
の場合の処理は、URLのファイル名部分を拾って/etc/yum.repos.d/<filename>.repo
としてリポジトリ定義ファイルをダウンロードしている。
というわけで、URL指定であればget_urlモジュールを使えば良さそう。
ちなみに、yum-config-manager
でダウンロードしたファイルと直接ダウンロードしたファイルは同一。
[zaki@k8s-master01 ~]$ ls -l /etc/yum.repos.d/docker* ls: /etc/yum.repos.d/docker* にアクセスできません: そのようなファイルやディレクトリはありません [zaki@k8s-master01 ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 読み込んだプラグイン:fastestmirror adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo [zaki@k8s-master01 ~]$ ls -l /etc/yum.repos.d/docker* -rw-r--r--. 1 root root 2424 10月 19 2019 /etc/yum.repos.d/docker-ce.repo [zaki@k8s-master01 ~]$ curl -LO https://download.docker.com/linux/centos/docker-ce.repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2424 100 2424 0 0 16461 0 --:--:-- --:--:-- --:--:-- 16489 [zaki@k8s-master01 ~]$ ls -l 合計 4 -rw-rw-r--. 1 zaki zaki 2424 5月 8 08:36 docker-ce.repo [zaki@k8s-master01 ~]$ sha1sum docker-ce.repo /etc/yum.repos.d/docker-ce.repo b9cab0cb1ddbffb77de51ba8838ea60335a229f6 docker-ce.repo b9cab0cb1ddbffb77de51ba8838ea60335a229f6 /etc/yum.repos.d/docker-ce.repo
get_urlモジュール
これは指定URLにあるリモートのファイルを指定ディレクトリに配置するためのモジュール。
まさに今回やりたいことができる。
認証関連などHTTPに必要な各パラメタは用意されてるけど今回はその辺り何も必要ないので、Example見ながら必要最小限の記述で大丈夫だった。
- name: setup docker yum repository get_url: url: https://download.docker.com/linux/centos/docker-ce.repo dest: /etc/yum.repos.d/docker-ce.repo mode: '0644'
これで、元々shellモジュールでyum-config-manager
を呼び出してて「冪等性?知らんな?」状態だったのを、設定済みの状態で再実行した時にはchangedにならないようにできた。(yum-config-manager --add-repo
自体は、設定済みの状態で再度実行してもエラーにはならないので、さほど問題ではなかった)
ちなみに今回はyum-config-manager --add-repo
の引数がURLだったのでget_url
モジュールを使ったけど、ローカルファイルのパスであればcopy
モジュールを使えば良い(はず。未確認)。
(参考)yum_repositoryモジュール
Yumのリポジトリ定義を行うモジュールとしてはyum_repositoryモジュールがある。
これは、1つのリポジトリURL毎に設定を行うものなので、Dockerインストール用のリポジトリ定義済みファイルを持ってくるときには使えなかったけど、kubeadm, kubelet, kubectlのインストールを行う時のリポジトリ設定には使える。
こちらの公式手順は以下の通り。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
こんな感じで1セクション分の定義を作成する場合であれば、次のようにtaskを書けばOK
- name: kubeadm, kubelet, kubectl yum_repository: name: kubernetes file: kubernetes description: Kubernetes baseurl: https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled: yes gpgcheck: yes repo_gpgcheck: yes gpgkey: https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
kubeadmを使ったKubernetesクラスタのデプロイはこちら。
それを(練習のために)Ansibleのplaybookにしてるのがこちら。