Ansibleを用いたLinux版Zabbixエージェントの自動バージョンアップ

Ansible,Infrastructure as Code,Zabbix

こんにちは!プラットフォーム技術部の小羽根陸です。

今まではZabbixの機能を紹介、解説してきましたが、今回の記事ではLinux版Zabbixエージェントの自動バージョンアップ方法を紹介します!

社内でZabbixを使用している場合、公式サポート期間が終了するためZabbixサーバーのバージョンアップ対応をすることがあると思います。Zabbixサーバーをバージョンアップした場合、旧バージョンのZabbixエージェントでも互換性があるのでそのまま監視することは可能ですが、Zabbixエージェントの新機能を使用するためにはバージョンアップする必要があります。

その際に、Zabbixエージェントがインストールされた監視対象が大量にある場合は、考えるだけでも頭が痛くなりませんか? 数百~数千台もある監視対象を一つひとつ手作業でバージョンアップするには、膨大な工数がかかります。またある程度作業が進んでから問題が発覚した場合には、すべてやり直しという最悪の事態も考えられます。

今回は、そんな頭の痛いZabbixエージェントのバージョンアップ作業を、構成管理ツールであるAnsibleを用いて自動化してみたいと思います。

※本記事ではAnsibleについて簡単な説明しか記載していないため、特に後半部分はある程度Ansibleの知識がある方向けになっています。

Ansibleとは

Ansibleとは、Python製の構成管理ツールです。Ansibleに定義ファイル(Playbook)を読み込ませることでシステムの構築や構成変更を自動化することが可能です。

Ansibleの一番の特徴はエージェントレスであることです。構成変更するリモートホストに対してAnsibleをインストールする必要がなく、ローカルホストにAnsibleをインストールするだけで使えます。ただしAnsibleではPlaybookをPythonコードに変換してリモート実行するため、Ansibleホスト、リモートホストともにPythonをインストールしておく必要があります。

またPlaybookの記述にはシンプルなYAMLが採用されているので、プログラミング言語ベースの複雑な独自記述言語を用いる他ツールに比べて、書きやすく、読みやすいのが特徴です。

Playbookとは

Playbookとは、リモートホストに対する手順書です。AnsibleがインストールされたAnsibleホストでPlaybookを実行し、対象のリモートホストの構成を変更できます。

Playbookは、「Task」と「Play」から構成されています。Taskはモジュールにパラメーターを設定して、実行可能な状態のものを指します。1つ以上のTaskを順番に並べて、対象のリモートホストや変数を定義したものがPlayとなり、1つ以上のPlayを順番に並べたものがPlaybookです。

Playbook説明

上記Playbookでは、ファイルを作成するPlayとApacheをインストールして起動するPlayが記載されています。

モジュールは多数存在しますが、代表的なモジュールを紹介します。

他のモジュールは公式サイトに記載されているため、確認してみてください。

冪等性とは

Ansibleでは「冪等性(べきとうせい)」と呼ばれる「1度行った操作を何度繰り返しても同じ結果になる」という性質が基本保証されています。

例として、ansible.builtin.copyモジュールは冪等性を担保するために、以下の動きをします。

  1. コピー先にファイルがあることを確認する
  2. ファイルが存在する場合、ハッシュ値をコピー元ファイルと比較する
  3. ハッシュ値が一致した場合何もしない

初回実施時はコピー先にファイルが存在しないため、指定したファイルをコピーします。2回目以降は、コピー先にファイルが存在しているため、存在しているファイルのハッシュ値とコピー元ファイルのハッシュ値を比較し、一致した場合何も行われません。初回実行時と2回目以降実行時で結果が変わらないため、冪等性が保証されています。

Ansibleの使用方法

ここからは実際にAnsibleを用いてZabbixエージェントのバージョンアップをしていきます。

環境情報

ホスト情報

本記事では、以下Ansibleホストとリモートホストを2台用意してPlaybookを実行します。

  • Ansibleホスト(OS:RHEL9.1)
  • リモートホスト1(OS:RHEL9.1)
  • リモートホスト2(OS:RHEL9.1)

今回作成したPlaybookは、Zabbixエージェントのバージョンアップ用ですが、Zabbixエージェントがインストールされていない場合は新規インストールをするように作成しています。

そのためリモートホスト1には、Zabbixエージェント5.0がインストール済みです。リモートホスト2にはZabbixエージェントをインストールしていない状態で実行します。

前提条件

Ansibleを実行する時の前提条件として以下のものがあります。

  • AnsibleホストにAnsibleがインストールしてあり、動作確認ができていること
  • AnsibleホストからリモートホストにSSH接続ができること
  • Ansibleホスト、リモートホストでAnsible実行ユーザーを作成済みであること
  • Ansibleホストからリモートホストに1度でもSSH接続を行いフィンガープリントを作成しておくこと
  • Ansibleホスト、リモートホストともにPythonがインストールされていること(RHEL9.1はデフォルトでインストール済み)

Ansibleのディレクトリ構成

ディレクトリ構成は公式ページにある、「Sample directory layout」を参考に/etc/ansible配下は、以下のように作成しました。

.
├── group_vars
│   └── zabbix_agent_linux
│       ├── general.yml # 一般的な変数を定義
│       └── login.yml # リモートホストにSSHログインする時に必要な変数を定義
├── roles
│   └── zabbix_agent_linux
│       ├── files # リモートホストに配布するファイルを配置
│       │  ├── zabbix-agent-6.0.xx-release1.el9.x86_64.rpm # Zabbixパッケージ
│       │  └── RPM-GPG-KEY-ZABBIX-08EFA7DD # ZabbixリポジトリのGPGキー
│       └── tasks
│          └── main.yml # Zabbix Agentのバージョンアップ用のPlaybook
├── site.yml # メインの Playbook
└── hosts # Zabbix Agentのバージョンアップをするホスト情報を記載

/etc/ansible/roles/zabbix_agent_linux/filesには事前にバージョンアップ用のパッケージと、ZabbixリポジトリのGPGキーをZabbixリポジトリから事前にダウンロードし、配置しておきます。

各種ファイルの説明

では、1つずつ設定ファイルを見ていきましょう。

hosts

hostsファイルには対象のホスト名とIPアドレスを記載しています。Playbookを実行する際にhostsファイルを参照して、リモートホストにSSHログインをしています。

hostsファイルはINI形式、またはYAML形式で記載ができます。本記事では、YAML形式で記載しています。

また本記事ではリモートホストが2台あるため、2台分の情報を記載しています。

  • /etc/ansible/hosts
--- # YAML形式の1行目は「---」で開始する
all:
  children:
    zabbix_agent_linux: # グループ名を指定
      hosts:
        ansible_remote-devlog: # リモートホスト1のホスト名
          ansible_host: 172.31.47.208 # リモートホスト1のIPアドレス
        ansible_remote-devlog2: # リモートホスト2のホスト名
          ansible_host: 172.31.46.99 # リモートホスト2のIPアドレス

login.yml

login.ymlでは、SSHログインに必要な変数を定義しています。

本記事では、Ansibleユーザーを作成してSSHログインしているため、必要な情報を記載しています。

  • /etc/ansible/group_vars/zabbix_agent_linux/login.yml
---
ansible_connection: ssh
ansible_user: ansible # ログインユーザー
ansible_ssh_private_key_file: ~/.ssh/id_ed25519 # SSHログインに必要な鍵指定

general.yml

general.ymlでは、main.ymlで使用する変数を定義しています。状況に応じて変数は修正してください。

  • /etc/ansible/group_vars/zabbix_agent_linux/general.yml
---
zabbix_agent_package: "zabbix-agent-6.0.13-release1.el9.x86_64" # インストールするパッケージを記載
files_directory: "/etc/ansible/roles/zabbix_agent_linux/files/" # リモートホストに配布するファイルの配置場所
work_directory: "/tmp/zabbix_vup" # リモート先で作成する作業フォルダ
zabbix_directory: "/etc/zabbix" # Zabbixの設定ファイル保存場所
logrote_directory: "/etc/logrotate.d" # ログローテ―トフォルダを記載
gpg_key: "RPM-GPG-KEY-ZABBIX-08EFA7DD" # ZabbixリポジトリのGPGキーを記載
zabbix_server_ip: "xx.xx.xx.xx" # ZabbixサーバーのIPアドレスを記載

Playbookの説明

ここからは、Playbookの設定を確認していきます。

site.yml

site.ymlは、システム全体でどのPlaybookを利用するかを制御します。site.ymlはシンプルにし、他のPlaybookを読み込むようにしておきます。roles:でzabbix_agent_linuxを指定することで、/etc/ansible/roles/zabbix_agent_linux/task/main.ymlを読み込みます。

  • /etc/ansible/site.yml
---
- name: zabbix agent updrade linux # nameはPlayの説明を記載する
  hosts: zabbix_agent_linux # hostsファイルのzabbix_agent_linuxグループのホストに対して実行
  roles:
    - zabbix_agent_linux

main.yml

main.ymlでは具体的に実行する内容を記載しています。変数はgeneral.ymlに記載したものを呼び出しています。

以下の手順でPlaybookを作成しています。

  1. Zabbixエージェントがインストールされているか確認する ※1
  2. Zabbixエージェントのバージョンを確認する
  3. 作業ディレクトリを作成
  4. Ansibleホストのfiles配下のファイルをリモート先の資材ディレクトリ配下にコピーする
  5. zabbix_agentd.conf、UserParameterファイル、logrotateファイルのバックアップを作成する
  6. GPGキーのインポート
  7. Zabbixエージェントのバージョンアップ(新規インストール)
  8. バックアップしたUserParameterファイル、logrotateファイルの再配置
  9. zabbix_agentd.confの必要箇所(Server=,ServerActice=,Hostname)を書き換える
  10. Zabbixエージェントのステータスを確認する
  11. Zabbixエージェント再起動 自動起動設定

※1 Zabbixエージェントがインストールされていない場合は、バージョンアップ手順をスキップして新規インストールに必要な手順のみ実施する

  • /etc/ansible/roles/zabbix_agent_linux/tasks/main.yml
---
- name: Zabbix Agent installed check
  ansible.builtin.package:
    name: zabbix-agent
    state: installed
  register: zabbix_installed # 実行結果を変数[zabbix_installed]に格納する
  ignore_errors: yes # Zabbixエージェントがインストールされていない場合でも次のTaskを実行する
  become: yes # rootで実行

- name: Zabbix Agent version check
  ansible.builtin.shell:
    cmd: "rpm -qa | grep zabbix-agent | awk -F'-' '{print $3}'"
  changed_when: false # ansible.builtin.shellモジュールは常に「changed」になるが、構成変更は行われていないため「ok」と表示する
  become: yes
  register: zabbix_version # 実行結果を変数[zabbix_version]に格納する
  when: zabbix_installed.rc == 0 # 「Zabbix Agent installed check」Taskが失敗した場合、本Taskはskipされる

- name: Create work directory
  ansible.builtin.file:
    path: "{{ work_directory }}"
    state: directory
    mode: "0775"
  become: yes

- name: Copy zabbix agent package
  ansible.builtin.copy:
    src: "{{ files_directory }}/"
    dest: "{{ work_directory }}/"
  become: yes

- name: Create backup config file
  ansible.builtin.copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
    remote_src: yes # リモートホスト内のsrcフォルダからdestフォルダにコピーする
  with_items:
      - { src: "{{ zabbix_directory }}/zabbix_agentd.conf", dest: "{{ zabbix_directory }}/zabbix_agentd.conf_{{ zabbix_version.stdout }}" }
      - { src: "{{ zabbix_directory }}/zabbix_agentd.d", dest: "{{ work_directory }}" }
      - { src: "{{ logrote_directory }}/zabbix-agent", dest: "{{ work_directory }}/zabbix-agent" }
  become: yes
  when:
    - zabbix_installed.rc == 0 # 「Zabbix Agent installed check」Taskが失敗した場合、本Taskはskipされる
    - zabbix_agent_package is not search(zabbix_version.stdout) # インストールされているバージョンと、今回インストールするバージョンが同じ場合、本Taskをskipする

- name: Import key from file
  ansible.builtin.rpm_key:
    state: present
    key: "{{ work_directory }}/{{ gpg_key }}"
  become: yes

- name: Zabbix Agent upgrade
  ansible.builtin.package:
    name:
      - "{{ work_directory }}/{{ zabbix_agent_package }}.rpm"
    state: present
  become: yes
  register: upgrade_status # 実行結果を変数[upgrade_status]に格納する

- name: Put back config file
  ansible.builtin.copy:
    src: "{{ item.src }}"
    dest: "{{ item.dest }}"
    remote_src: yes
  with_items:
      - { src: "{{ work_directory }}/zabbix_agentd.d", dest: "{{ zabbix_directory }}/" }
      - { src: "{{ work_directory }}/zabbix-agent", dest: "{{ logrote_directory }}/zabbix-agent" }
  become: yes
  when:
    - zabbix_installed.rc == 0 # 「Zabbix Agent installed check」Taskが失敗した場合、本Taskはskipされる
    - zabbix_agent_package is not search(zabbix_version.stdout) # インストールされているバージョンと、今回インストールするバージョンが同じ場合、本Taskをskipする

- name: Rewrite zabbix config file (Server)
  ansible.builtin.lineinfile:
    path: "{{ zabbix_directory }}/zabbix_agentd.conf"
    regexp: '^Server=127.0.0.1'
    line: 'Server={{ zabbix_server_ip }}'
  become: yes

- name: Rewrite zabbix config file (ServerActive)
  ansible.builtin.lineinfile:
    path: "{{ zabbix_directory }}/zabbix_agentd.conf"
    regexp: '^ServerActive=127.0.0.1'
    line: 'ServerActive={{ zabbix_server_ip }}'
  become: yes

- name: Rewrite zabbix config file (Hostname)
  ansible.builtin.lineinfile:
    path: "{{ zabbix_directory }}/zabbix_agentd.conf"
    regexp: '^Hostname=Zabbix server'
    line: 'Hostname={{ inventory_hostname }}'
  become: yes

- name: Zabbix Agent status check
  ansible.builtin.shell:
    cmd: systemctl is-active zabbix-agent.service
  changed_when: false
  ignore_errors: yes
  register: zabbix_status

- name: Restart zabbix agent
  ansible.builtin.systemd:
    name: zabbix-agent
    state: restarted
    enabled: yes
  become: yes
  when: upgrade_status.changed or zabbix_status.stdout is search("inactive") # upgrade_statusがchangedでない場合本Taskをskipする

冪等性の説明をしましたが、一部冪等性が担保されないモジュールがあります。ansible.builtin.shellansible.builtin.commandなどコマンドが直接記載できるモジュールは、Taskで何か変化が起きた時のステータスである「changed」を常に返すため、冪等性が担保されません。

そんな時は「changed_when: false」と記載することにより、強制的に「ok」ステータスを返します。今回作成したPlaybookでは、 ansible.builtin.shell を使用して、「rpm -qa | grep zabbix-agent | awk -F’-' '{print $3}’」コマンド実行しています。このコマンドは、Zabbixサーバーのバージョンを取得しているだけで構成の変化はしないため、「changed_when: false」 を記載して冪等性を担保するようにしています。

また今回作成したPlaybookでは、Zabbixエージェントのバージョンアップ後にzabbix_agentd.confの以下3つの設定のみ変更するようになっています。

  • Server
  • ServerActive
  • Hostname

community.zabbix.zabbix_agentで用意されているテンプレートを使用することでzabbix_agentd.confの自動生成も可能でした。しかしzabbix_agentd.confのコメント文がなく設定値のみ羅列されてしまうため、今回は必要部分を書き換える方式にしています。

zabbix_agentd.confの設定がリモートホストごとに変更内容が異なる場合は、Playbook内で個別に設定変更をするのは難しいです。そのため事前に全リモートホスト分の[リモートホストのIPアドレス]_zabbix_agentd.confを作成しておき、/etc/roles/zabbix_agent_linux/files配下に配置し、main.ymlの70行目から89行目を以下のよう書き換えることで、それぞれのリモートホストにzabbix_agentd.confを配置してくれます。

- name: Copy zabbix agent config file
  copy:
    src: "{{ files_directory }}/{{ inventory_hostname }}_zabbix_agentd.conf"
    dest: "{{ zabbix_directory }}/zabbix_agentd.conf"
  become: yes

Playbook実行

1回目の実行

Ansible実行ユーザーにスイッチして、以下コマンドでPlaybookを実行します。

$ ansible-playbook /etc/ansible/site.yml

Taskは以下のステータスで表示されます。

  • ok : Taskが成功した時のステータス
  • changed : Taskで何か変化が起きた時のステータス
  • failed : Taskが失敗した時のステータス
  • skip : Taskをスキップする(何もしない)
PLAY [zabbix agent updrade linux] ***************************************************

TASK [Gathering Facts] **************************************************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent installed check] ****************************
ok: [ansible_remote-devlog]
fatal: [ansible_remote-devlog2]: FAILED! => {"changed": false, "failures": ["No package zabbix-agent available."], "msg": "Failed to install some of the specified packages", "rc": 1, "results": []}
...ignoring

TASK [zabbix_agent_linux : Zabbix Agent version check] ******************************
skipping: [ansible_remote-devlog2]
ok: [ansible_remote-devlog]

TASK [zabbix_agent_linux : Create work directory] ***********************************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Copy zabbix agent package] *******************************
changed: [ansible_remote-devlog2]
changed: [ansible_remote-devlog]

TASK [zabbix_agent_linux : Create backup config file] *******************************
skipping: [ansible_remote-devlog2]
changed: [ansible_remote-devlog] => (item={'src': '/etc/zabbix/zabbix_agentd.conf', 'dest': '/etc/zabbix/zabbix_agentd.conf_5.0.31'})
changed: [ansible_remote-devlog] => (item={'src': '/etc/zabbix/zabbix_agentd.d', 'dest': '/tmp/zabbix_vup'})
changed: [ansible_remote-devlog] => (item={'src': '/etc/logrotate.d/zabbix-agent', 'dest': '/tmp/zabbix_vup/zabbix-agent'})

TASK [zabbix_agent_linux : Import key from file] ************************************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent upgrade] ************************************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Put back config file] ************************************
skipping: [ansible_remote-devlog2] => (item={'src': '/tmp/zabbix_vup/zabbix_agentd.d', 'dest': '/etc/zabbix/'})
skipping: [ansible_remote-devlog2] => (item={'src': '/tmp/zabbix_vup/zabbix-agent', 'dest': '/etc/logrotate.d/zabbix-agent'})
ok: [ansible_remote-devlog] => (item={'src': '/tmp/zabbix_vup/zabbix_agentd.d', 'dest': '/etc/zabbix/'})
ok: [ansible_remote-devlog] => (item={'src': '/tmp/zabbix_vup/zabbix-agent', 'dest': '/etc/logrotate.d/zabbix-agent'})

TASK [zabbix_agent_linux : Rewrite zabbix config file (Server)] ********************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Rewrite zabbix config file (ServerActive)] **************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Rewrite zabbix config file (Hostname)] *******************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent status check] *******************************
ok: [ansible_remote-devlog]
fatal: [ansible_remote-devlog2]: FAILED! => {"changed": false, "cmd": "systemctl is-active zabbix-agent.service", "delta": "0:00:00.010351", "end": "2023-03-23 05:22:33.739058", "msg": "non-zero return code", "rc": 3, "start": "2023-03-23 05:22:33.728707", "stderr": "", "stderr_lines": [], "stdout": "inactive", "stdout_lines": ["inactive"]}
...ignoring

TASK [zabbix_agent_linux : Restart zabbix agent] ************************************
changed: [ansible_remote-devlog]
changed: [ansible_remote-devlog2]

PLAY RECAP **************************************************************************
ansible_remote-devlog      : ok=14   changed=9    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
ansible_remote-devlog2     : ok=10   changed=8    unreachable=0    failed=0    skipped=3    rescued=0    ignored=2

ansible_remote-devlog2では、Zabbixエージェントがインストールされていないため、「Zabbix Agent installed check」Taskが失敗しています。その後のTaskでは、when: zabbix_installed.rc == 0と条件をつけており、Taskが失敗した場合は、rcに0が代入されます。そのため後続の「Zabbix Agent version check」Taskはskipされています。

「Zabbix Agent upgrade」Taskでは、ansible_remote-devlogとansible_remote-devlog2ともに、Zabbix エージェントのインストール/バージョンアップに成功しています。

2回目の実行(冪等性の確認)

冪等性が担保されているか確認するために、Playbookをもう一度実行します。

PLAY [zabbix agent updrade linux] ***************************************************

TASK [Gathering Facts] **************************************************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent installed check] ****************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent version check] ******************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Create work directory] ***********************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Copy zabbix agent package] *******************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Create backup config file] *******************************
skipping: [ansible_remote-devlog] => (item={'src': '/etc/zabbix/zabbix_agentd.conf', 'dest': '/etc/zabbix/zabbix_agentd.conf_6.0.13'}) 
skipping: [ansible_remote-devlog] => (item={'src': '/etc/zabbix/zabbix_agentd.d', 'dest': '/tmp/zabbix_vup'}) 
skipping: [ansible_remote-devlog] => (item={'src': '/etc/logrotate.d/zabbix-agent', 'dest': '/tmp/zabbix_vup/zabbix-agent'}) 
skipping: [ansible_remote-devlog2] => (item={'src': '/etc/zabbix/zabbix_agentd.conf', 'dest': '/etc/zabbix/zabbix_agentd.conf_6.0.13'}) 
skipping: [ansible_remote-devlog2] => (item={'src': '/etc/zabbix/zabbix_agentd.d', 'dest': '/tmp/zabbix_vup'}) 
skipping: [ansible_remote-devlog2] => (item={'src': '/etc/logrotate.d/zabbix-agent', 'dest': '/tmp/zabbix_vup/zabbix-agent'}) 

TASK [zabbix_agent_linux : Import key from file] ************************************
ok: [ansible_remote-devlog2]
ok: [ansible_remote-devlog]

TASK [zabbix_agent_linux : Zabbix Agent upgrade] ************************************
ok: [ansible_remote-devlog2]
ok: [ansible_remote-devlog]

TASK [zabbix_agent_linux : Put back config file] ************************************
skipping: [ansible_remote-devlog2] => (item={'src': '/tmp/zabbix_vup/zabbix_agentd.d', 'dest': '/etc/zabbix/'})
skipping: [ansible_remote-devlog] => (item={'src': '/tmp/zabbix_vup/zabbix_agentd.d', 'dest': '/etc/zabbix/'})
skipping: [ansible_remote-devlog] => (item={'src': '/tmp/zabbix_vup/zabbix-agent', 'dest': '/etc/logrotate.d/zabbix-agent'})
skipping: [ansible_remote-devlog2] => (item={'src': '/tmp/zabbix_vup/zabbix-agent', 'dest': '/etc/logrotate.d/zabbix-agent'})

TASK [zabbix_agent_linux : Rewrite zabbix config file (Server)] ********************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Rewrite zabbix config file (ServerActive)] **************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Rewrite zabbix config file (Hostname)] *******************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Zabbix Agent status check] *******************************
ok: [ansible_remote-devlog]
ok: [ansible_remote-devlog2]

TASK [zabbix_agent_linux : Restart zabbix agent] ************************************
skipping: [ansible_remote-devlog]
skipping: [ansible_remote-devlog2]

PLAY RECAP **************************************************************************
ansible_remote-devlog      : ok=11   changed=0    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   
ansible_remote-devlog2     : ok=11   changed=0    unreachable=0    failed=0    skipped=3    rescued=0    ignored=0   

changedが0となっているため、構成の変更は発生しませんでした。そのためPlaybookを一回実行した時と2回目実行した時で状態が一緒になっています。これで冪等性が担保されていることが確認できました。

まとめ

Ansibleを用いたZabbixエージェントの自動バージョンアップ方法について紹介しました。

今回の記事ではLinuxのみの紹介となりましたが、もちろんWindowsも対応していますので今後記事にしたいと考えています。また今回はAnsibleを用いてバージョンアップをしましたが、Zabbixのホスト登録なども自動で行えます。

ぜひ、興味を持たれた方はAnsibleを使用した自動化を試してみてください。

アークシステムは Zabbix Japan LLC の認定パートナー企業です。 当社はZabbixバージョン1.1の時代から監視ソリューションの活用を進め、Zabbixに関する製品・サービスの販売に加え、Zabbix関連サービスの提供を行っています。

Zabbixに関するお問い合わせはこちらからお願いいたします。
  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix