zaki work log

作業ログやら生活ログやらなんやら

[Ansible] get_urlモジュールでyum-config-managerコマンドをAnsible対応

細々とkubeadmを使ったKubernetesクラスタのデプロイをAnsibleで自動化するってのをやってるんだけど、手順の中のContainer RuntimeのインストールでDockerインストールのためのYumリポジトリの設定をyum-config-managerで行うというのがあって、でもAnsibleモジュールだとこれに対応したものが無さそうだったので、どうすればいいか考えてみた。

yum_repositoryモジュールはあるけど、リポジトリのURL毎に設定が必要で、今回はリンク先で提供されている「リポジトリ一覧ファイル」が既にある場合には使えなかった。後述。

yum-config-managerってなにやってるの?

kubernetes.io

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モジュール

docs.ansible.com

これは指定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モジュール

docs.ansible.com

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クラスタのデプロイはこちら。

kubernetes.io

それを(練習のために)Ansibleのplaybookにしてるのがこちら。

github.com