zaki work log

作業ログやら生活ログやらなんやら

[Ansible] packageモジュールでパッケージインストールする

Ansibleモジュールの一覧をなんとなく眺めていたらpackage – Generic OS package managerという汎用的なパッケージ管理モジュールみたいなものを見つけたので、yumaptと違ってプラットフォームに依存しないパッケージインストールができるのかなーと思って試してみた。

コントロールノード環境

$ 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系だとapache2yum系だと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時配信スタートのオンラインミートアップとかかなり無理くさい……ぐぬぬ