ansibleでrpmアーカイブを展開してyumでインストールする方法
ansibleでrpmアーカイブを展開してyumでインストールする方法を紹介します。
1.問題点
ansibleで実施したいコマンドは下記です(リモートホストの/tmpにpacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gzが配置されている前提で話を進めます)。
# ssh test_host
# cd /tmp
# tar xvfz pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz
# cd pacemaker-1.0.13-1.2.el6.x86_64.repo
# yum --disablerepo=* -c pacemaker.repo install -y pacemaker pm_crmgen pm_logconv-hb pm_diskd pm_extras --enablerepo=pacemaker
なお、pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gzを展開すると、直下にpacemaker.repoがあります。
このファイルをyumコマンドの"-c"オプションでリポジトリとして指定し、インストールしたいのですが、ansibleでの書き方が分かりません。
ということで、ansibleでアーカイブを転送してyumでインストールする方法を紹介します。
2.ansibleでアーカイブを転送してyumでインストールする
先にansibleのコードを掲載します。inventoryやtasksの記載は省略していますので、実行時に適宜追加してください。
- name: "pacemakerアーカイブの展開"
unarchive:
remote_src: yes
src: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz"
dest: "/tmp"
- name: "pacemakerインストール"
become: yes
become_method: su
yum:
name: "{{ packages }}"
conf_file: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
disablerepo: "*"
enablerepo: "pacemaker"
state: present
vars:
packages:
- pacemaker
- pm_crmgen
- pm_logconv-hb
- pm_diskd
- pm_extras
3.解説
まずリモートホストのアーカイブを展開します。
unarchive:
remote_src: yes
src: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo.tar.gz"
dest: "/tmp"
この詳細は「ansibleでリモートホストのアーカイブファイルを展開する方法」を参考にしてください。
次に、becomeで権限昇格(rootでの実行)を指定します。これはyumをrootで実行するためです。
become: yes
become_method: su
そしてyumモジュールでインストールします。
yum:
name: "{{ packages }}"
conf_file: "/tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
disablerepo: "*"
enablerepo: "pacemaker"
state: present
nameはインストールパッケージを指定しますが、後で説明します。
conf_fileがyumコマンドの"-c"オプションに該当します。
conf_file: "{{ work_path }}/SIP/sip-common/RPM/pacemaker-1.0.13-1.2.el6.x86_64.repo/pacemaker.repo"
通常のyumの場合、実行前にpacemaker.repoファイルがあるパスに移動できるのですが、ansibleではcdができないので、conf_fileはフルパスでpacemaker.repoのパスを指定します。
また、今回はスタンドアローンでインストールしているので、不要なリポジトリにアクセスしないよう、下記のdisablerepoを追加しています。disablerepoの指定だけではpacemaker.repoがみつからず、エラーになるので、enablerepoでpacemaker.repoも指定します。
disablerepo: "*"
enablerepo: "pacemaker"
stateに指定するpresentは、"yum install"と同じ意味になるようです。
さて、パッケージを指定するnameですが、インストールパッケージが複数あるので、下記の方法で指定します。
yum:
name: "{{ packages }}"
:
vars:
packages:
- pacemaker
- pm_crmgen
- pm_logconv-hb
- pm_diskd
- pm_extras
varsモジュールの変数packages(変数名は任意)に書かれた配列の値が、nameの{{ packages }}に設定されます。
varsのインデントに気をつけてください。私はyumの中にvarsをインデントして入れてしまって、エラーの原因がわからず悩みました。
また、展開した中にあるpacemaker.repoの内容は
[pacemaker]
name=pacemaker
baseurl=file:///tmp/pacemaker-1.0.13-1.2.el6.x86_64.repo/
gpgcheck=0
enabled=1
となっていますが、pacemakerのアーカイブを展開するディレクトリが/tmp直下でない場合は、pacemaker.repoのbaseurlのパスが異なるため、このまま実行するとエラーになります。
よって、パスを書き換えたpacemaker.repoをコントロールホスト側に予め用意しておき、yum実行前に下記のansibleで上書きする操作が必要です。
- name: "pacemaler.repoを上書き"
copy:
src: pacemaker.repo
dest: "/配置パス/pacemaker-1.0.13-1.2.el6.x86_64.repo/"
- ansibleのcopyモジュールでディレクトリを生成する方法
- ansibleでフィンガープリントを表示させない方法
- ansibleのインベントリに設定した変数にアクセスする方法
- ansibleで踏み台サーバ経由でplaybookを実行する方法
- ansibleでコマンドを実行する方法
- ansibleでリモートホストのアーカイブファイルを展開する方法
- ansibleでアーカイブファイルを転送して展開する方法
- ansibleでファイルを書き替える方法
- ansibleでvisudoする方法