ansibleでpackageのinstall時にloopは使わないほうが良い
教えてもらったので。
ansibleでyum,dnf, apt を使っていくつかのpackageをまとめてインストールする際に、癖でloop(with_items)を使っていたのだけど、これは非推奨らしい。
というのも
- name: install dnf packages
become: yes
dnf:
name:
- "{{ item }}"
state: latest
loop:
- mariadb
- mariadb-server
- MySQL-python3
- python3-libselinux
みたいに書いてしまうと、これはこのコマンドを実行していることと等価になる。
sudo dnf install mariadb sudo dnf install mariadb-server sudo dnf install MySQL-python3 sudo dnf install python3-libselinux
そんな事しなくても sudo dnf install mariadb mariadb-server MySQL-python3 python3-libselinuxってまとめられるよね。こっちのほうが効率いいよねということで、loopを使うやり方は非推奨とのこと。
じゃあ実際にはどう書けばいいのかというと、usageを見たところ次のような世界観らしい。
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- httpd-tools
- name: Install a list of packages
yum:
name:
- nginx
- postgresql
- postgresql-server
state: present
- name: install the latest version of Apache and MariaDB
dnf:
name:
- httpd
- mariadb-server
state: latest
- name: Install a list of packages
apt:
pkg:
- foo
- foo-tools
ということでnamesの後ろに複数リストで与えるか、 {{ packages }}を使えとのこと。
debug情報を見たところnamesで複数指定する方法とpackagesを使うやり方は内部的には同じみたいですね。-vvvで見たところ両方次の様なjsonが表示されていました。好きな方を選べという感じっぽい。
ok: [test-fedora] => {
"changed": false,
"invocation": {
"module_args": {
"allow_downgrade": false,
"autoremove": false,
"bugfix": false,
"conf_file": null,
"disable_excludes": null,
"disable_gpg_check": false,
"disable_plugin": [],
"disablerepo": [],
"download_dir": null,
"download_only": false,
"enable_plugin": [],
"enablerepo": [],
"exclude": [],
"install_repoquery": true,
"install_weak_deps": true,
"installroot": "/",
"list": null,
"lock_timeout": 30,
"name": [
"mariadb",
"mariadb-server",
"MySQL-python3",
"python3-libselinux"
],
"releasever": null,
"security": false,
"skip_broken": false,
"state": "latest",
"update_cache": false,
"update_only": false,
"validate_certs": true
}
},
"msg": "Nothing to do",
"rc": 0,
"results": []
}