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でコマンドを実行する方法
ansibleでコマンドを実行する方法を紹介します。
1.問題点
下記のコマンドをansibleで実行したいのですが、方法がわかりません。
# echo "hoge"
ということで、ansibleでコマンドを実行する方法を紹介します。
ここでは基本的な実行方法のみを解説します。
2.ansibleでコマンドを実行する
ansibleでコマンドを実行するには、commandモジュールまたはshellモジュールを使用します。ここではcommandモジュールの例で記載します。
inventory
[all]
test_host ansible_host=192.168.1.23
test.yml
- hosts: test_host
tasks:
- name: コマンド実行
command: echo "hoge"
changed_when: false
実行
# ansible-playbook -i inventory test.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [コマンド実行] *************************************************************************************************
ok: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=0 unreachable=0 failed=0
3.解説
commandモジュールの中にcmdオプションを指定し、そこに実行したいコマンドを記述します。
command: echo "hoge"
changed_when: false
changed_whenは、実行結果でchangedと判断する条件を定義するモジュールで、ここでは必ずfalseを指定します。
3.changed_whenを指定する理由
changed_whenを指定する理由ですが、commandモジュールやshellモジュールでコマンドを実行する場合、実行結果が必ず”changed”になってしまいます。
以下は先のサンプルでchanged_whenを指定しなった場合の実行結果です。最後の行のchangedが"1"になっています。
# ansible-playbook -i inventory test4.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [コマンド実行] *************************************************************************************************
changed: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=1 unreachable=0 failed=0
このchangedを"0"にするために、changed_whenにfalseを指定します。
4.shellモジュールとcommandモジュールとの違い
shellモジュールは、"command"の部分を"shell"に書き換えればOKです。
- name: コマンド実行
shell: echo "hoge"
changed_when: false
commandモジュールとshellモジュールの違いは下記の通りです。
- command:ユーザ環境変数や、パイプ・リダイレクトを使用できない
- shell:ユーザ環境変数や、パイプ・リダイレクトを使用できる
よってコマンドによってcommandモジュールとshellモジュールを使い分けてください。
ansibleでリモートホストのアーカイブファイルを展開する方法
ansibleでリモートホストのアーカイブファイルを展開する方法を紹介します。
1.問題点
下記の操作をansibleで実施したいのですが、方法が分かりません。
# ssh 192.168.1.23
# cd /tmp
# tar zxvf hoge.tar.gz
ということで、ansibleでリモートホストのアーカイブファイルを展開する方法を紹介します。
2.ansibleでリモートホストのアーカイブファイルを展開する
先にansibleのコードを掲載します。
inventory
[all]
test_host ansible_host=192.168.1.23
test.yml
- hosts: test
tasks:
- name: "アーカイブの展開"
unarchive:
remote_src: yes
src: "/tmp/hoge.tar.gz"
dest: "/tmp"
実行
# ansible-playbook -i inventory test.yml
PLAY [test] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************
Enter passphrase for key '/home/hoge/.ssh/id_rsa':
ok: [test_host]
TASK [アーカイブの展開] ********************************************************************************************
ok: [test_host]
PLAY RECAP ****************************************************************************************************
test_host : ok=2 changed=0 unreachable=0 failed=0
3.解説
unarchiveはアーカイブを展開するモジュールです。
unarchive:
unarchiveのパラメータとしてremote_srcを指定します。これはリモートホストで展開することを示すパラメータです。このパラメータを指定しないと、srcに書かれたファイルをコントロールホストに配置されたファイルと認識して、リモートホストに転送する動作になります。
remote_src: yes
同様にsrcとdestを指定します。scrは転送元のパスとファイル、destは転送先のパスです。
src: "/home/hoge/hoge.tar.gz"
dest: "/tmp"
これで、リモートホストの/tmp/hoge.tar.gzを、/tmpに展開します。
ローカルホストに置かれたファイルをリモートホストに転送して展開する方法は「ansibleでアーカイブファイルを転送して展開する方法」をご覧ください。