Ansibleモジュールの一覧をなんとなく眺めていたらpackage – Generic OS package managerという汎用的なパッケージ管理モジュールみたいなものを見つけたので、yum
やapt
と違ってプラットフォームに依存しないパッケージインストールができるのかなーと思って試してみた。
コントロールノード環境
$ ansible --version ansible 2.9.2 config file = /home/zaki/ansible/package/ansible.cfg configured module search path = [u'/home/zaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
各ターゲットノードの/usr/bin/python
は全て2.7系
インベントリ
[node:children] yum apt [yum] target1 ansible_host=192.168.0.141 target2 ansible_host=192.168.0.142 [apt] debian ansible_host=192.168.0.228 [from] control ansible_host=192.168.0.140
プレイブック
--- - hosts: node become: true tasks: - ping: - package: name: - ruby - tcl state: latest
実行
[zaki@control-node package]$ ansible-playbook -i inventory.ini playbook.yml PLAY [node] ******************************************************************** TASK [Gathering Facts] ********************************************************* ok: [target1] ok: [target2] ok: [debian] TASK [ping] ******************************************************************** ok: [debian] ok: [target1] ok: [target2] TASK [package] ***************************************************************** changed: [target1] changed: [target2] changed: [debian] PLAY RECAP ********************************************************************* debian : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 target1 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 target2 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
これでapt
系のDebianホストにも、yum
系のCentOSホストにも、package
モジュールを指定した一つのタスクでパッケージインストールできた。
パッケージ名の差異
一見便利そうに見えるんだけど、apt
系とyum
系でパッケージ名が異なるものもあり、そのあたりはpackage
モジュールで吸収してるわけではないので、使いどころはちょっと難しいかもしれない。
例えば、Apache HTTP Serverは、apt
系だとapache2・yum
系だとhttpdという名前のパッケージになっているので、
tasks: - package: name: - httpd state: latest
というプレイブックだと、debianではエラーになる。
fatal: [debian]: FAILED! => changed=false ansible_facts: discovered_interpreter_python: /usr/bin/python cache_update_time: 1584398538 cache_updated: false msg: |- '/usr/bin/apt-get -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" install 'httpd'' failed: E: Package 'httpd' has no installation candidate
朝活のネタの予定だったけど、諸事情で朝の活動時間が少なくなって(検証までは終わったけど)ブログ書ききるまで間に合わなかった()
ついでに言うと夜も遅いので19時配信スタートのオンラインミートアップとかかなり無理くさい……ぐぬぬ