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": []
}