教えてもらったので。
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": [] }