こんにちは。サイオステクノロジーの橋本です。
皆さんは Ansible で環境構築をしているものの一回の実行時間がちょっと長くて…
という事はありませんか
自動化してもやっぱり時間がかかるパッケージインストールをちょっと早くする方法を紹介します。
今回は以下の 4 回 dnf を実行している Playbook に関して、
1 回の dnf 実行に集約してます。
- name: "httpd のインストール"
ansible.builtin.dnf:
name: httpd
when:
- ansible_distribution_major_version == "9"
- name: "DNS (bind) のバージョン指定"
set_fact:
bind_version: 9.16
- name: "DNS (bind) のインストール"
ansible.builtin.dnf:
name: "bind{{ bind_version }}"
when:
- ansible_distribution_major_version == "8"
- name: "wget のインストール"
ansible.builtin.dnf:
name: wget
- name: "sos のインストール"
ansible.builtin.dnf:
name: sos
上記 Playbook はわかりやすいというメリットは有るものの 4 回 dnf を実行しているため
都度都度 dnf モジュールを実行し毎回リポジトリのチェックなどが入りその分処理時間が長くなります。
そのため、dnf を可能な限り少ない回数にして、リポジトリチェックなどの回数
を抑えようという発想です。
Step 1
ドキュメントにもあるように dnf モジュールはパッケージ名を配列で渡すことができます。
まずは sos と wget を配列で渡しましょう。
Step 2 で活きてきますが配列は事前に定義します。
- name: "インストールパッケージの定義"
ansible.builtin.set_fact:
packages:
- wget
- sos
- name: "必要パッケージのインストール"
ansible.builtin.dnf:
name: "{{ packages }}"
ここまではよくある手順ですね。
Step 2
さて、問題は以下です。
OS や サーバの役割によってインストールパッケージが異なる運用はよくあるとおもいます。
そして、それが dnf の複数回実行になることもよくあるケースだと思います。
when 句で条件分岐していても、以下のように set_fact すれば同様の挙動をしてくれます。
- name: "インストールパッケージの定義"
ansible.builtin.set_fact:
packages:
- wget
- sos
- name: "httpd を配列に追加"
ansible.builtin.set_fact:
packages: "{{ packages + \
['httpd'] }}"
when:
- ansible_distribution_major_version == "9"
- name: "DNS (bind) のバージョン指定"
set_fact:
bind_version: 9.16
- name: "bind を配列に追加"
ansible.builtin.set_fact:
packages: "{{ packages + \
['bind{{ bind_version }}'] }}"
when:
- ansible_distribution_major_version == "8"
- name: "必要パッケージのインストール"
ansible.builtin.dnf:
name: "{{ packages }}"
当初とインストールするパッケージに変わりはないですが、
dnf モジュールを呼び出す回数は 1 回になっているため処理時間も大幅に短くなります。
Ansible の処理速度が遅いとき、上記のようにパッケージのインストールを集約するのを検討してみてはいかがでしょうか。