dj-wasabi.zabbix-agent

目次

はじめに

この役割は以下に移行されました: https://github.com/ansible-collections/community.zabbix/ このリポジトリでは、コレクションをまだ使用できない方のために、読み取り専用のバージョンが提供されます。変更や更新はコレクションにのみ適用され、このリポジトリには適用されません。

要件

オペレーティングシステム

この役割は以下のオペレーティングシステムで動作します:

  • Red Hat
  • Fedora
  • Debian
  • Ubuntu
  • opensuse
  • Windows (最善を尽くします)
  • macOS

これらのオペレーティングシステムのいずれかが必要です.. :-) 他のオペレーティングシステムでこの役割を使用したい場合は、プルリクエストや提案を送ってください。

ローカルシステムアクセス

役割のインストールを成功させるためには、IPアドレスを管理するためにコントローラーにpython-netaddrが必要です。このライブラリがローカルマシンに存在する必要があります(またはpipがインストールされている必要があります)。これにより、役割を実行する際にローカルマシンへのsudoアクセスが必要となる場合があり、rootユーザーでない場合はローカルマシンのパスワードを入力するために -K フラグが必要になることがあります。

Zabbixのバージョン

以下はサポートされているオペレーティングシステムとZabbixリリースのリストです:

Zabbix 4.4

  • CentOS 7.x, 8.x
  • Amazon 7.x
  • RedHat 7.x, 8.x
  • Fedora 27, 29
  • OracleLinux 7.x, 8.x
  • Scientific Linux 7.x, 8.x
  • Ubuntu 14.04, 16.04, 18.04
  • Debian 8, 9, 10
  • macOS 10.14, 10.15

Zabbix 4.2

  • CentOS 7.x
  • Amazon 7.x
  • RedHat 7.x
  • Fedora 27, 29
  • OracleLinux 7.x
  • Scientific Linux 7.x
  • Ubuntu 14.04, 16.04, 18.04
  • Debian 8, 9, 10
  • macOS 10.14, 10.15

Zabbix 4.0

  • CentOS 7.x
  • Amazon 7.x
  • RedHat 7.x
  • Fedora 27, 29
  • OracleLinux 7.x
  • Scientific Linux 7.x
  • Ubuntu 14.04, 16.04, 18.04
  • Debian 8, 9, 10
  • macOS 10.14, 10.15

Zabbix 3.4

  • CentOS 7.x
  • Amazon 7.x
  • RedHat 7.x
  • Fedora 27, 29
  • OracleLinux 7.x
  • Scientific Linux 7.x
  • Ubuntu 14.04, 16.04, 18.04
  • Debian 7, 8, 9

Zabbix 3.2

  • CentOS 7.x
  • Amazon 7.x
  • RedHat 7.x
  • Fedora 27, 29
  • OracleLinux 7.x
  • Scientific Linux 7.x
  • Ubuntu 14.04, 16.04
  • Debian 7, 8

Zabbix 3.0

  • CentOS 5.x, 6.x, 7.x
  • Amazon 5.x, 6.x, 7.x
  • RedHat 5.x, 6.x, 7.x
  • OracleLinux 5.x, 6.x, 7.x
  • Scientific Linux 5.x, 6.x, 7.x
  • Ubuntu 14.04
  • Debian 7, 8

Zabbix 2.4

  • CentOS 6.x, 7.x
  • Amazon 6.x, 7.x
  • RedHat 6.x, 7.x
  • OracleLinux 6.x, 7.x
  • Scientific Linux 6.x, 7.x
  • Ubuntu 12.04 14.04
  • Debian 7

Zabbix 2.2

  • CentOS 5.x, 6.x
  • RedHat 5.x, 6.x
  • OracleLinux 5.x, 6.x
  • Scientific Linux 5.x, 6.x
  • Ubuntu 12.04
  • Debian 7
  • xenserver 6

はじめに

インストール

この役割のインストールは非常に簡単です: ansible-galaxy install dj-wasabi.zabbix-agent

これにより、rolesディレクトリにzabbix-agent役割がインストールされます。

最小構成

Zabbixエージェントを動作させるためには、役割を実行する前に以下のプロパティを定義する必要があります:

  • zabbix_agent_version
  • zabbix_agent_server
  • zabbix_agent_serveractive(アクティブチェックを使用する場合)

zabbix_agent_versionはオプションです。最新のメジャー・マイナー版のZabbixがホストにインストールされます。古いバージョンを使用したい場合は、メジャー・マイナー形式で指定してください。例: zabbix_agent_version: 4.0zabbix_agent_version: 3.4 または zabbix_agent_version: 2.2

zabbix_agent_server(およびzabbix_agent_serveractive)には、Zabbixサーバーが実行されているホストのIPまたはFQDNを含める必要があります。

問題

#291で議論されている問題により、Ansible Version 2.9.{0,1,2}はWindows関連のターゲットで正常に動作しません。

役割変数

主な変数

デフォルトのdefault/main.ymlにいくつかの変数があり、上書きが必要な場合があります:

  • zabbix_agent_server: zabbix-serverまたはzabbix-proxyのIPアドレス。

  • zabbix_agent_serveractive: アクティブチェックのためのzabbix-serverまたはzabbix-proxyのIPアドレス。

  • zabbix_agent_version: Zabbixのバージョンです。デフォルトは4.4ですが、Zabbixのバージョンで挙げたバージョンのいずれかに上書きできます。以前はzabbix_version変数が直接使用されていましたが、いくつかの不便を引き起こす可能性がありました。この変数は互換性のために維持されています。

  • zabbix_repo: デフォルト: zabbix

    • epel EPELリポジトリからエージェントをインストール
    • _zabbix_(デフォルト)Zabbixリポジトリからエージェントをインストール
    • other 既存の他のリポジトリからエージェントをインストール
  • zabbix_agent_listeninterface: zabbix-agentがリッスンするインターフェース。全てのインターフェースを使用する場合は空白にします。

  • zabbix_agent_package: zabbix-agentパッケージの名前。デフォルト: zabbix-agent。EPELの場合、自動的に名前が変更されます。

  • zabbix_sender_package: zabbix-senderパッケージの名前。デフォルト: zabbix-sender。EPELの場合、自動的に名前が変更されます。

  • zabbix_get_package: zabbix-getパッケージの名前。デフォルト: zabbix-get。EPELの場合、自動的に名前が変更されます。

  • zabbix_agent_package_state: Zabbix-agentが存在する必要があるか、最新のものにするか。

  • zabbix_agent_interfaces: API経由で構成する際に使用できるインターフェースを設定するリスト。

  • zabbix_selinux: エージェントが実行されるように、SELinuxポリシーを有効にします。デフォルト: False。

  • zabbix_agent_userparameters: ユーザーパラメータ名とスクリプトのリスト。詳細はユーザーパラメータの展開セクションに記載されています。デフォルト: [](空のリスト)。

    • name: ユーザーパラメータ名(ユーザーパラメータテンプレートファイル名と同じである必要があります)
    • scripts_dir: ユーザーパラメータに必要なカスタムスクリプトのディレクトリ名
  • zabbix_agent_userparameters_templates_src: ユーザーパラメータテンプレートが検索される相対パス(templates/から見たもの)。

  • zabbix_agent_userparameters_scripts_src: ユーザーパラメータスクリプトが検索される相対パス(files/から見たもの)。

  • zabbix_agent_allowroot: エージェントを'root'として実行できるようにします。0 - 許可しない、1 - 許可します。

  • zabbix_agent_runas_user: 特定の既存ユーザーに権限を移譲します。rootとして実行され、AllowRootが無効になっている場合にのみ有効です。

  • zabbix_agent_become_on_localhost: localhostでローカルにパッケージをpipでインストールするために権限を上昇させる必要がない場合はFalseに設定します。デフォルト: True

  • zabbix_install_pip_packages: 必要なpipパッケージをインストールしたくない場合はFalseに設定します。環境を完全に制御している場合に便利です。デフォルト: True

  • zabbix_agent_apt_priority: APTリポジトリに重み(Pin-Priority)を追加します。

TLS特定の構成

これらの変数はZabbix 3.0以降に特有のものです:

  • zabbix_agent_tlsconnect: エージェントがサーバーまたはプロキシに接続する方法。アクティブチェック用に使用されます。

    可能な値:

    • 暗号化なし
    • PSK
    • 証明書
  • zabbix_agent_tlsaccept: 受け入れる接続の設定。

    可能な値:

    • 暗号化なし
    • PSK
    • 証明書
  • zabbix_agent_tlscafile: ピア証明書の検証のためのCA証明書が含まれるファイルのフルパス。

  • zabbix_agent_tlscrlfile: 取り消された証明書が含まれるファイルのフルパス。

  • zabbix_agent_tlsservercertissuer: 許可されたサーバー証明書の発行者。

  • zabbix_agent_tlsservercertsubject: 許可されたサーバー証明書のサブジェクト。

  • zabbix_agent_tlscertfile: エージェント証明書または証明書チェーンが含まれるファイルのフルパス。

  • zabbix_agent_tlskeyfile: エージェントのプライベートキーが含まれるファイルのフルパス。

  • zabbix_agent_tlspskidentity: プリシェアドキーを識別するために使用される一意の、大文字小文字を区別する文字列。

  • zabbix_agent_tlspskidentity_file: プリシェアドキーのアイデンティティが含まれるファイルのフルパス。

  • zabbix_agent_tlspskfile: プリシェアドキーが含まれるファイルのフルパス。

  • zabbix_agent_tlspsk_secret: agent_tlspskfileで設定されたファイルに配置されるべきプリシェアド秘密キー。

  • zabbix_agent_tlspsk_auto: クライアント上で個々のプリシェアドキーとアイデンティティの自動生成および保存を有効にします。

Zabbix API変数

Zabbix APIを使用してホストを自動的に作成または更新する場合、これらの変数を上書きする必要があります。

ホストの暗号化構成はエージェントの構成と一致するように設定されます。

zabbix_api_create_hostgroupまたはzabbix_api_create_hostsTrueに設定されると、Ansibleプレイブックを実行しているホストにzabbix-api Pythonモジュールがインストールされます。

  • zabbix_url: Zabbixウェブページが利用可能なURL。例: http://zabbix.example.com

  • zabbix_api_http_user: Zabbix URLにアクセスするためのHTTPユーザー(基本認証)。

  • zabbix_api_http_password: Zabbix URLにアクセスするためのHTTPパスワード(基本認証)。

  • zabbix_api_create_hosts: Zabbix APIを有効にしてホストを作成または削除したい場合は、これをTrueに設定する必要があります。デフォルト: False

  • zabbix_api_create_hostgroup: Zabbix APIを有効にしてホストグループを作成または削除したい場合は、これをTrueに設定する必要があります。デフォルト: False

  • zabbix_api_user: APIアクセスを持つユーザーのユーザー名。

  • zabbix_api_pass: APIアクセスを持つユーザーのパスワード。

  • zabbix_create_hostgroup: ホストグループを作成する必要がある場合はpresent(デフォルト)、削除したい場合はabsent。このオプションはzabbix_api_create_hostgroupTrueに設定されているときのみ機能します。

  • zabbix_host_status: 監視されている場合はenabled(デフォルト)、監視が無効の場合はdisabled。

  • zabbix_create_host: ホストを作成する必要がある場合はpresent(デフォルト)、削除したい場合はabsent。このオプションはzabbix_api_create_hostsTrueに設定されているときのみ機能します。

  • zabbix_update_host: すでに存在する場合はyes(デフォルト)、これもzabbix_api_create_hostsTrueに設定されているときのみ機能します。

  • zabbix_useuip: Zabbixエージェントへの接続がIP経由で行われる場合は1、FQDNの場合は0。

  • zabbix_host_groups: このホストが属するホストグループのリスト。

  • zabbix_link_templates: このホストにリンクする必要のあるテンプレートのリスト。テンプレートは存在する必要があります。

  • zabbix_macros: ホストマクロを作成するためのmacro_keyとmacro_valueのリスト。

  • zabbix_inventory_mode: Zabbix在庫モードを設定します。ホストを構成する際に手動または自動ポピュレーションオプションを使用して在庫データを構築するために必要です。自動的に在庫データを構築する場合は、これをautomaticに設定する必要があります。

  • zabbix_visible_hostname: ZabbixウェブUI内でノードのZabbix表示名を構成します。

  • zabbix_validate_certs: APIのTLS証明書を確認する必要がある場合はyes(デフォルト)。自己署名証明書を使用する場合はnoを使用します。

Windows変数

注意

Windowsのサポートは最善を尽くす(利用可能な様々なWindowsインスタンスで変更をテスト/確認する可能性がないため)。Windowsに特有のPRは、誰かがプルリクエストのためにテストメカニズムを提供できない限り、ほぼ直ちにマージされます。

  • zabbix_version_long: Zabbixエージェントの長い(メジャー・マイナー・パッチ)バージョン。この値はzabbix_win_download_linkリンクを生成し、zabbix_agent_package_state: latestの場合にZabbixエージェントの更新に使用されます。

  • zabbix_win_download_link: win.zipファイルのダウンロードURL。

  • zabbix_win_install_dir: Zabbixをインストールするディレクトリ。

  • zabbix_agent_win_logfile: Zabbixエージェントのログファイルのフルパス。

  • zabbix_agent_win_include: Zabbix特有の構成ファイルが保存されているディレクトリ。

  • zabbix_agent_win_svc_recovery: Zabbixエージェントサービスの自動回復設定を有効にします。

macOS変数

  • zabbix_version_long: Zabbixエージェントの長い(メジャー・マイナー・パッチ)バージョン。この値はzabbix_mac_download_linkリンクを生成する際に使用されます。

  • zabbix_mac_download_link: pkgファイルのダウンロードURL。

Docker変数

ホスト上にZabbixエージェントをインストールしたくなく、コンテナ内で実行したい場合は、これらのプロパティが役立ちます。zabbix_agent_dockerTrueに設定されると、Dockerイメージがダウンロードされ、コンテナが開始されます。他のインストールはホスト上では行われず、PSKファイルと「Zabbix Include Directory」を除きます。

次のディレクトリはコンテナにマウントされます:

  - /etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d
  - /:/hostfs:ro
  - /etc:/hostfs/etc:ro
  - /proc:/hostfs/proc:ro
  - /sys:/hostfs/sys:ro
  - /var/run:/var/run

コンテナ内でZabbixエージェントを使用する場合、/proc/sysおよび/etc/hostfsというディレクトリにマウントされるため、Zabbixテンプレートに変更が必要です。

  • zabbix_agent_docker: Trueに設定すると、ターゲットホストではなく、ターゲットにDockerコンテナをインストールします。デフォルト: False

  • zabbix_agent_docker_state: デフォルト: started

  • zabbix_agent_docker_name: コンテナの名前。デフォルト: zabbix-agent

  • zabbix_agent_docker_image: Dockerイメージの名前。デフォルト: zabbix/zabbix-agent

  • zabbix_agent_docker_image_tag: Dockerイメージのタグ。

  • zabbix_agent_docker_user_gid: コンテナ内のzabbixユーザーのグループID。

  • zabbix_agent_docker_user_uid: コンテナ内のzabbixユーザーのユーザーID。

  • zabbix_agent_docker_network_mode: コンテナに使用する(Docker)ネットワークの名前。デフォルト: host

  • zabbix_agent_docker_restart_policy: コンテナの再起動ポリシー。デフォルト: unless-stopped

  • zabbix_agent_docker_privileged: Trueに設定すると、コンテナは特権モードで実行されます。

  • zabbix_agent_docker_ports: コンテナにポートを開放するための<PORT>:<PORT>値のリスト。

  • zabbix_agent_docker_security_opts: 利用可能なセキュリティオプションのリスト。

  • zabbix_agent_docker_volumes: コンテナ内で利用可能である必要があるすべてのディレクトリのリスト。

  • zabbix_agent_docker_env: コンテナに設定する必要があるすべての環境変数の辞書。

その他の変数

  • zabbix_agent_firewall_enable: zabbix_agent_listenportに設定されたTCPポートを開放するためにIPtablesを更新する必要がある場合。

  • zabbix_agent_firewall_source: 提供された場合、IPtablesはこのIPアドレス/範囲からのトラフィックのみを許可するように構成されます。

  • zabbix_agent_firewalld_enable: zabbix_agent_listenportおよびzabbix_agent_jmx_listenport(定義されている場合)に設定されたTCPポートを開放するためにfirewalldを更新する必要がある場合。

  • zabbix_agent_firewalld_source: 提供された場合、firewalldはzabbix_agent_serverに設定されたIPのトラフィックのみを許可するように構成されます。

  • zabbix_agent_firewalld_zone: 提供された場合、firewalldルールはこのゾーンに添付されます(zabbix_agent_firewalld_enableがtrueに設定されている場合のみ)。デフォルトの動作は、リモートホストのfirewalld設定で定義されたデフォルトゾーンを使用することです。

  • zabbix_agent_firewall_action: ルールをinsertするか、IPTablesにappendするか。デフォルト: insert

  • zabbix_agent_firewall_chain: IPTablesにルールを追加するchain。デフォルト: INPUT

  • zabbix_agent_description: Zabbix内のホストの説明。

  • zabbix_agent_inventory_zabbix: Zabbix在庫用にファクトを追加します。

IPMI変数

  • zabbix_agent_ipmi_authtype: IPMI認証アルゴリズム。可能な値は1 (callback)、2 (user)、3 (operator)、4 (admin)、5 (OEM)で、2がAPIデフォルトです。

  • zabbix_agent_ipmi_password: IPMIパスワード。

  • zabbix_agent_ipmi_privilege: IPMI特権レベル。可能な値は1 (callback)、2 (user)、3 (operator)、4 (admin)、5 (OEM)で、2がAPIデフォルトです。

  • zabbix_agent_ipmi_username: IPMIユーザー名。

プロキシ

ターゲットホストがインターネットにアクセスできない場合でも、プロキシがある場合は以下のプロパティを設定して、プロキシ経由でパッケージをダウンロードする必要があります:

  • zabbix_http_proxy
  • zabbix_https_proxy

依存関係

他の役割に対する依存関係はありません。

サンプルプレイブック

エージェントインターフェース

これはホスト上のZabbixエージェントインターフェースを構成します。

zabbix_agent_interfaces:
  - type: 1
    main: 1
    useip: "{{ zabbix_useuip }}"
    ip: "{{ zabbix_agent_ip }}"
    dns: "{{ ansible_fqdn }}"
    port: "{{ zabbix_agent_listenport }}"

その他のインターフェース

snmp、jmxおよびipmiインターフェースを追加/構成するためにzabbix_agent_interfacesも構成できます。

構成する際は、次のタイプ番号のいずれかを使用する必要があります:

インターフェースタイプ 番号
Zabbixエージェント 1
snmp 2
ipmi 3
jmx 4

snmpインターフェースを構成する場合の例:

zabbix_agent_interfaces:
  - type: 2
    main: 1
    useip: "{{ zabbix_useuip }}"
    ip: "{{ agent_ip }}"
    dns: "{{ ansible_fqdn }}"
    port: "{{ agent_listenport }}"

役割構成内の変数

ユーザーにとって役割の使用法を示す例を含めるのは常に良いことです(たとえば、変数をパラメータとして渡す場合):

- hosts: all
  roles:
     - role: dj-wasabi.zabbix-agent
       zabbix_agent_server: 192.168.33.30
       zabbix_agent_serveractive: 192.168.33.30
       zabbix_url: http://zabbix.example.com
       zabbix_api_use: true # zabbix_api_create_hostsおよび/zabbix_api_create_hostgroupを使用
       zabbix_api_user: Admin
       zabbix_api_pass: zabbix
       zabbix_create_host: present
       zabbix_host_groups:
         - Linuxサーバー
       zabbix_link_templates:
         - Template OS Linux
         - Apache APP Template
       zabbix_macros:
         - macro_key: apache_type
           macro_value: reverse_proxy

group_varsとプレイブックの組み合わせ

group_varsまたはhost_varsファイルを使用してこの役割に必要な変数を設定することもできます。変更すべきファイル:group_vars/allまたはhost_vars/<zabbix_server>はZabbixサーバーを実行しているマシンのホスト名)。

    zabbix_agent_server: 192.168.33.30
    zabbix_agent_serveractive: 192.168.33.30
    zabbix_url: http://zabbix.example.com
    zabbix_api_use: true # zabbix_api_create_hostsおよび/zabbix_api_create_hostgroupを使用
    zabbix_api_user: Admin
    zabbix_api_pass: zabbix
    zabbix_create_host: present
    zabbix_host_groups:
      - Linuxサーバー
    zabbix_link_templates:
      - Template OS Linux
      - Apache APP Template
    zabbix_macros:
      - macro_key: apache_type
        macro_value: reverse_proxy

そして、プレイブックで次のように指定するだけです:

- hosts: all
  roles:
     - role: dj-wasabi.zabbix-agent

TLS PSK暗号化されたエージェント通信の例

プレイブックまたはhost_vars/myhostでの変数例:

zabbix_agent_tlsaccept: psk
zabbix_agent_tlsconnect: psk
zabbix_agent_tlspskidentity: "myhost PSK"
zabbix_agent_tlspsk_secret: b7e3d380b9d400676d47198ecf3592ccd4795a59668aa2ade29f0003abbbd40d
zabbix_agent_tlspskfile: /etc/zabbix/zabbix_agent_pskfile.psk

分子

この役割はMoleculeを使用してテストするように設定されています。このページにはMoleculeに関する詳細情報があります: https://werner-dijkerman.nl/2016/07/10/testing-ansible-roles-with-molecule-testinfra-and-docker/

各プルリクエストで、Moleculeはtravis.ciを介して実行されます。これらのテストが成功した場合にのみ、プルリクエストはマージされます。

トラビスを使用して実行されるシナリオは2つがあります。

デフォルト

最初のシナリオでは、Moleculeは次のOSを持つ5つのDockerコンテナを起動します:

  • Debian 8
  • CentOS 7
  • Ubuntu 16.04
  • Ubuntu 18.04
  • Mint

このシナリオでは、Zabbix APIを介してホストを登録せずに基本的なインストール/構成が行われます。

サーバー付き

2つ目のシナリオでは、次のOSを持つ4つのDockerコンテナを起動します:

  • CentOS 7 (Zabbixサーバー)
  • Debian 8
  • CentOS 7
  • Ubuntu 18.04

最初に、コンテナにZabbixサーバーがインストールされます。このインストールでは、Zabbixサーバーをインストール/構成するために他のdj-wasabi役割が使用されます。このインスタンスが実行されると、他の3つのエージェントがインストールされます。

各ホストは自分自身をZabbixサーバーに登録し、そのステータスは0である必要があります(これはZabbixサーバーとZabbixエージェントが接続されていることを意味します)。

UbuntuエージェントはPSKを介して自分自身を登録し、ZabbixサーバーとZabbixエージェント間の通信がプリシェアドキーで暗号化されます。

前回のバージョン

3つ目かつ最後のシナリオは、before-last-versionです。これはデフォルトと同じシナリオですが、前のZabbixバージョンを使用します。

ユーザーパラメータの展開

カスタムユーザーパラメータおよび/またはスクリプトをインストールするには、以下の手順が必要です:

  • 希望するユーザーパラメータファイルをtemplates/userparametersディレクトリに入れ、<userparameter_name>.j2という名前を付けます。例:templates/userparameters/mysql.j2。デフォルトのディレクトリを変更するには、zabbix_agent_userparameters_templates_src変数を変更します。
  • スクリプトディレクトリ(ある場合)をfiles/scriptsディレクトリに入れます。例:files/scripts/mysql。デフォルトのディレクトリを変更するには、zabbix_agent_userparameters_scripts_src変数を変更します。
  • zabbix_agent_userparameters変数をプレイブックにリストとして追加し、ユーザーパラメータ名とスクリプトディレクトリ名(スクリプトがない場合はscripts_dir変数を指定しないようにします)を定義します。

例:

- hosts: mysql_servers
  tasks:
    - include_role:
        name: dj-wasabi.zabbix-agent
      vars:
        zabbix_agent_server: zabbix.mydomain.com
        zabbix_agent_userparameters:
          - name: mysql
            scripts_dir: mysql
          - name: galera

templates/userparameters/mysql.j2ファイルの例:

UserParameter=mysql.ping_to,mysqladmin -uroot ping | grep -c alive

ライセンス

MIT

著者情報

この役割をより良くするための提案やプルリクエストを送ってください。また、この役割のインストールや使用中に問題が発生した場合は教えてください。

Github: https://github.com/dj-wasabi/ansible-zabbix-agent

メール: ikben [ at ] werner-dijkerman . nl

プロジェクトについて

Installing and maintaining zabbix-agent for RedHat/Debian/Ubuntu/Windows/Suse.

インストール
ansible-galaxy install dj-wasabi.zabbix-agent
ライセンス
mit
ダウンロード
4.2M
所有者
DevOps Engineer, Technical reviewer Packt Pub / Manning / BPB Online / O'Reilly Media