ansibleでrpmアーカイブを展開してyumでインストールする方法

July 13,2023 11:55 PM
Category:[ansible]
Tag:[ansible]
Permalink

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/"
Comments [0] | Trackbacks [0]

ansibleでコマンドを実行する方法

July 11,2023 11:55 PM
Category:[ansible]
Tag:[ansible]
Permalink

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モジュールを使い分けてください。

Comments [0] | Trackbacks [0]

ansibleでリモートホストのアーカイブファイルを展開する方法

July 10,2023 11:55 PM
Category:[ansible]
Tag:[ansible]
Permalink

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でアーカイブファイルを転送して展開する方法」をご覧ください。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages