ダメでしょ!

プログラミングとか怒られた話とか…

Zabbix3.0系における、各種OS毎の Zabbix-agent のインストール方法 (CentOS6系・CentOS7系・Ubuntu系・Windows系)

Zabbix3.0系は安定版

www.zabbix.com

上記のサイトを見ていただければわかるのですが、Zabbix3.0系はフルサポートの期限が2019/2、リミテッドサポートが2021/2となっており、現状の最新安定版となっています。
Zabbix社は1年半ごとにLTS(長期サポート: Long Term Support)をリリースする方針で、次の安定版は2017/8前後ということになります。
つまり、Zabbix3.0系は今導入すべきバージョンだと言えます。

Zabbix-Agent のインストール方法を探すと、Zabbix3.2系が多い

なので、Zabbix3.0系を導入しようと思ってネットを検索すると、Zabbix-Agentに関して、思いの外Zabbix3.2系のインストール方法が多く、すぐにZabbix3.0系のインストール方法が見つかりませんでした。
また、あるOS向けのインストール方法は見つかるのですが、まとまった情報がなく、OS毎に見つけるのに苦労しました。

Zabbix-Agent インストール方法

前置きが長くなりましたが、せっかく各種OSでインストールしたので、インストール方法をまとめてみました。
(とはいえ、自分が何らか利用しているOSのみですが)

CentOS6系

# リポジトリの追加
sudo yum -y install http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/zabbix-release-3.0-1.el6.noarch.rpm
# エージェントのインストール
sudo yum -y install zabbix-agent
# エージェントのコンフィグファイル変更
sudo vi /etc/zabbix/zabbix_agentd.conf
    Server={Zabbix Server のIPアドレス}
    ServerActive={Zabbix Server のIPアドレス}
    Hostname={Zabbix-agentを導入したサーバのホスト名}
# プロセス起動
sudo service zabbix-agent start
# 自動起動に登録
sudo chkconfig zabbix-agent on
# ファイアウォールへのポート10050 許可設定
sudo vi /etc/sysconfig/iptables
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT
# ファイアウォールの再起動
sudo service iptables restart
# リポジトリの無効化
sudo sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/zabbix.repo

CentOS7系

# リポジトリの追加
sudo yum -y install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
# エージェントのインストール
sudo yum -y install zabbix-agent
# エージェントのコンフィグファイル変更
sudo vi /etc/zabbix/zabbix_agentd.conf
    Server=192.168.2.219
    ServerActive=192.168.2.219
    Hostname={自分のホスト名}
# プロセス起動
sudo systemctl start zabbix-agent
# 自動起動に登録
sudo systemctl enable zabbix-agent
# ファイアウォールへのポート10050 許可設定
sudo firewall-cmd --add-port=10050/tcp --permanent
# ファイアウォールの再起動
sudo systemctl restart firewalld
# リポジトリの無効化
sudo sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/zabbix.repo

Ubuntu系 (UbuntuLinux mintで確認)

# リポジトリの追加
wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.0-1+trusty_all.deb
sudo dpkg -i zabbix-release_3.0-1+trusty_all.deb
sudo apt-get update
# エージェントのインストール
sudo apt-get install zabbix-agent
# エージェントのコンフィグファイル変更
sudo vi /etc/zabbix/zabbix_agentd.conf
    Server=192.168.2.219
    ServerActive=192.168.2.219
    Hostname={自分のホスト名}
# プロセス起動
sudo service zabbix-agent start
# Ubuntu系はCentOSで言うchkconfigに当たる機能がデフォルトで入っていないため、導入していなければ導入する
sudo apt-get install sysv-rc-conf  #入っていない場合のみ
# 自動起動に登録
sudo sysv-rc-conf zabbix-agent on
# (iptablesを利用している場合のみ) ファイアウォールへのポート10050 許可設定
sudo vi /etc/sysconfig/iptables
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT
# (iptablesを利用している場合のみ) ファイアウォールの再起動
sudo service iptables restart

Windows

【参考】

qiita.com

2 Zabbix Windowsエージェントのインストール [Zabbix Documentation 2.2]


http://www.zabbix.com/jp/download.php
上記サイトのコンパイル済みZabbixエージェントから、Zabbix 3.0 LTS 3.0.0 Windows(全バージョン)をダウンロードする

対象のWindowsサーバに配置し、解凍する

解凍したフォルダを開き、「bin」→「win64」を選択

「zabbix_agentd.exe」「zabbix_get.exe」「zabbix_sender.exe」を「C:\Program Files\」に「zabbix_agent」フォルダを作成して配置 ※フォルダの場所・名前は任意

解凍したフォルダの「conf」の「zabbix_agentd.win.conf」を「zabbix_agentd.conf」にリネームし、「zabbix_agent」フォルダへ保存

「zabbix_agentd.conf」を以下のように編集し、保存する ※フォルダの場所と名前は設定したものに変更

 LogFile=c:\Program Files\zabbix_agent\zabbix_agentd.log  
    Server=192.168.2.219  
    ServerActive=192.168.2.219:10051  
    ###Hostname=Windows host  
    HostnameItem=system.hostname  
    HostMetadata=Windows

※ この内容は一度のみ実施すればいい
Zabbixサーバで「設定 → アクション → 自動登録」 でエージェントの自動登録を作成
アクションの実行条件:ホストメタデータに含まれる Windows
アクションの実行内容:ホストを追加
ホストグループに追加:Windows
テンプレートとリンク:Template OS Windows

コマンドプロンプトを管理者で起動した上で下記を実施し、インストールする

C:>cd C:\Program Files\zabbix_agent
C:\Program Files\zabbix_agent>zabbix_agentd.exe -i -c zabbix_agentd.conf

※以下のように表示されればインストール完了

zabbix_agentd.exe [29588]: service [Zabbix Agent] installed successfully
zabbix_agentd.exe [29588]: event source [Zabbix Agent] installed successfully

zabbix_agentのスタート

 C:\Program Files\zabbix_agent>zabbix_agentd.exe -s -c zabbix_agentd.conf

※以下のように表示されれば起動成功

 zabbix_agentd.exe [29352]: service [Zabbix Agent] started successfully

Windowsファイアウォール」→「詳細設定」→「受信の規制」から、右側のペインの「新しい規則」でポート10050を追加

zabbixサーバ側で追加されていることを確認

最後に

自分の認識では、UbuntuDebian系だったのですが、Zabbixのパッケージを確認すると、Debian系は別のパッケージが用意されています。

http://www.zabbix.com/jp/download

http://repo.zabbix.com/zabbix/3.0/

Debianは利用していないため、今回のインストール方法のまとめには載せていません。
そっちの情報を期待して閲覧してくれた人がいたら、ごめんなさい。

DELL サーバ系の Alert! Cover Was Previously removed. エラー

サーバにエラーが!!

今日はLinuxサーバを準備しようと思い、転がっているサーバを適当に選定して、HDDやらメモリやらを載っけて準備していました。
いざ準備ができたんで、起動してみると、見慣れないエラーが。

Alert! FRONT_FAN failure...
Alert! Cover Was Previously removed.

一つ目はすぐにわかりますよね。
サーバを開いてみてみると、たしかにCPUファンが回っていません。
ということで、別のサーバからCPUファンを取り出して、交換。
もう一つは何だ??

カバーが開けられたことをチェックするセキュリティ機能

調べたところ、カバーが開けられたことを検知していて、大丈夫かを確認してきているセキュリティ機能のようです。
実際、HDDやメモリの交換、更にはファンの交換で何度もカバーを取り外しているので、表示されておかしくなかったというわけ。

ということで、問題ないのでこれを解除する方法ですが。

  1. [F2]→BIOS画面が表示される
  2. [System Security…]→Enterキー押下
  3. [Chassis Intrusion…Disabled]→「→」キーを押下し、[Enabled]に変更し、Enterキー押下
  4. ESCキー押下→[Save Changes and Exit]を選択し、Enterキーを押下

これで次に再起動した際、表示されなくなっていればOKです。
親切機能なんだろうけど、知らないと対処できませんね。。。

require する際の指定文字列が大文字/小文字で挙動が変わる? → Macの大文字小文字区別の問題でした

ローカル環境で問題なく実行されたコードが別の環境でうまく動作しない

私の開発環境はMacなのですが、そこで以下のように記載したコードを作成しました。

require 'CSV'

自分のローカル環境での単体テストが問題なく終了したため、Linuxの実行環境で上記のコードを含んだアプリケーションを動作させようとしたのですが、

LoadError: cannot load such file -- CSV
from /usr/local/src/rbenv/versions/2.2.2/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:55:in `require'

となり、エラーが発生しました。

問題は、MacLinuxで大文字小文字の判断が異なること

MacWindows と同じく、ファイル名やフォルダ名の大文字個別を区別しません。(デフォルトの設定では)
Linux は大文字小文字を区別します。
その違いで発生していたエラーでした。

MacUnix ベースだから、という勘違い

MacUnix をベースにしている、という認識があって、そこから勝手にLinux と同じように動作するだろうと思いこんでいました。。

ということで

require 'csv'

に修正して問題は解決しました。

rails_admin と devise を導入したプロジェクトで、root_path と rails_admin_path が異なる場合のログアウト遷移先設定方法

前提

rails_admin
devise

困っていたこと

一般向けサイトと管理サイトを作成し、管理サイトのみ devise でログイン処理を作成しました。
プロジェクト自体の root_path は一般向けサイトを指定したのですが、そうすると、管理サイトからログアウトした際に root_path に遷移してしまい、非常に不便でした。

対応方法

結論から言うと、application_controller.rb にメソッドを追加しました。

  def after_sign_out_path_for(resource)
    rails_admin_path
  end

これでログアウトしたら rails_admin_path に遷移するようにできます。

github.com

rails_admin 側に設定が存在するだろうと考えて調べていたため、devise 側だということに気づくのに時間がかかってしまった。。。

複数選択可能なチェックボックスやリストボックスで選択された内容を一つのカラムに保存する方法

前提

Rails 4系
haml 4.0系

どういう場面で使うか

入力画面で複数チェックボックスやリストボックスを表示するのは以下のようにかけます。(例としてリストボックス)

= m.select :answer, [['', ''], ['', ''], ['', ''], ['', '']], {}, { multiple: true, size: 4 }

このようにして作成したリストボックスで、以下のようにセットすると、controller には以下のように配列で返却されます。

# 'ア'と'ウ'を選択した場合
"answer" => [
        [0] "",
        [1] "ア",
        [2] "ウ"
    ]

これには問題点があります。

  • そのままではカラムに入らないこと
  • 最初に空の値が存在すること

対処方法

そこで、以下のように array のメソッドである、 delete を使って空の値を削除し、 join を使ってカンマ区切りで結合します。

params[:questionnaire][:answer].delete('')
params[:questionnaire][:answer] = params[:questionnaire][:answer].join(',')

上記を行うことで、返却値は

# 'ア'と'ウ'を選択した場合
"answer" => "ア,ウ"

となり、1カラムに格納することができるようになります。

データベースに格納した後に、その値を配列に戻して、画面に再表示しなければならないような場合はだんだんつらくなると思いますが、格納するだけでOKな場合はこのようなやり方はありだと思います。

rails_admin 導入時の 管理サイトタイトル変更方法

rails_admin を導入してカスタマイズ

rails アプリケーションを作成していて、管理サイトがほしい、と言われることが結構あります。
あんまりこだわりがないお客様の場合、rails_admin を導入することが多いです。
rails で良く利用されている管理画面の gem は他にもありますが、導入が簡単なんですよね。
で、導入した後に毎回躓くのがこれ。

サイトタイトルってどうやって変更する?

通常通りに導入すると、サイトのタイトルがrails アプリケーション名になってしまうんですよね。

f:id:hideukin:20160827174005p:plain

rails アプリケーション名は英語ですので、日本語化が必要になるんです。
で、どうすればいいかというと

  # ./config/initializers/rails_admin.rb
  config.main_app_name = %w(〇〇システム 管理サイト)

と、rails_admin の config に記載すればいいです。

f:id:hideukin:20160827174016p:plain

毎回忘れて、過去に作ったアプリを見て思い出すので、ブログに書いておきます。

simple_form を利用している時にsubmit ボタンにボタン名と value をセットする方法

前提

導入gem

普通の書き方だと、ボタン名が value の値になってしまう

通常、submit ボタンは以下のように記載すると思います。

= f.button :submit, 'ボタン名' { name: "#{f.object_name}[completed]", value: '1', class: 'btn btn-primary' }

しかし、この状態で実際に動作させてみると、ボタン名には value に指定した"1" が表示されてしまいます。
simple_form では、通常ボタン名が value にセットされますが、 value がセットされている場合はボタン名が反映されないためです。

こうすればうまくいく

では、どうすればいいのかというと、以下のように submit を指定せず、button を指定し、 do を付けてボタン名を入れ子にするとうまくいきます。

= f.button :button, { name: 'test', value: '1', class: 'btn btn-primary' } do
  ボタン名

simple_form 手強い...

simple_form を利用していない場合はハマらないと思うんですが、simple_form を導入していると最終的な html の出力が simple_form 次第になるので、ハマってしまった時に解決させるまでには試行錯誤が必要になることが多いです。。