mito’s blog

IT技術メインの雑記。思い立ったが吉日。

VBAから見たAnsible Playbookとの比較(ssmonline#5 LTの拡大版)

これは Ansible Advent Calendar 2020 (Adventar版) の 18日目の記事であり、
ssmonline #5のLTの拡大版です。

目的

f:id:mst-it:20201218145838j:plain

VBAの知識を活かして、Ansibleの理解速度、知識の定着率を上げたい!
ということで、LT資料に盛り込めなかった内容を書いていきます。

変数の配列

Dim str_xxx(5) As String   '一次元配列


  • Ansible Playbook
    • 行頭に「- (半角SP)」をつけます
vars:
  fruits_list:
    - apple
    - gorilla



ループ処理

  • VBA
    • 特定の条件に当てはまる間、または当てはまらない間、処理を続ける
Do While i <= 5
    i = i + 1
Loop


  • Ansible Playbook
    • このリストの値を変数に入れて実行する、が多いと思う
debug:
  msg: "{{ item }}"     # itemという名前は仕様
loop:
  - rap
  - panda



IF文

  • VBA
    • 頻繁に使用する
If (str_xxx = "ostrich") Then
    MsgBox "OK!"
End If


  • Ansible Playbook
    • 状況が分からないものに対して、Playbookはあまり使わないと思う
思いつかないです



select case文

  • VBA
    • 2、3個の比較ならIf文を使う
str_XXX = "cow"
Select Case str_XXX
Case Is = "cow"
    MsgBox "OK!"
Case Is = "zebra"
    MsgBox "NG!"
Case Else
    MsgBox "NONE!"
End Select


  • Ansible Playbook
    • when の条件に当てはまったら、モジュールを実行する
    • OSの違いによる分岐を実行させるとか。caseは2,3個くらいのイメージ
file:
  path: /etc/xxx.conf
  state: touch
when: XXX == "cow"



ファイルの分け方

  • VBA
    • ThisWorkbook、標準モジュール、クラスモジュールに分ける
    • シートに書くと、シートを消したときに消えてしまうので使いたくない
  • Ansible Playbook
    • フォルダ構成やファイル名が仕様として決まっている
XXX.yml
roles/
  xxxx/
    tasks/
      main.yml
    vars/
      main.yml



備考

Ansible側は細かく書いてないしもっと深く深く追求できそう。Ansible力が足りない!

Zabbix5.2の新機能「収集済みデータの分析による障害検知」を試してみた

この記事は、エーピーコミュニケーションズ Advent Calendar 2020 Zabbix Advent Calendar 2020 の10日目のエントリです。

収集済みデータの分析による障害検知とは

新たに利用できるトリガー関数は、蓄積した長期間の監視データを解析し、通常時とは異なる値を障害として検知することができます。

  • 「9月にネットワークトラフィック量が28%増加した」、「先週の新規ユーザー登録数が12%減少した」など、これまでの単純な閾値監視だけではなく、異常値を検知して障害通知を行うことができるようになりました。
  • この機能はシステムのリソースの監視だけではなく、セールスやマーケティングの効果、カスタマーサポートのクオリティなどのビジネスパフォーマンスを測定するためのKPIにも利用できます。


この「通常時とは異なる値の検知」がポイントだと考えています。単純な閾値ではないため、これまでのような、閾値を多めに見積もって対策がぎりぎりになることがなく、事前に対策が打てるよう閾値を低めに見積もって不要な通知を対応することもなく、検知項目の変化を適切な段階で検知できるのではと思います。

試したこと

Zabbix5.2のこの新機能で追加されたトリガー関数を試してみました。

新規追加のトリガー関数

  • Trendavg : 期間のトレンド値の平均   ☆今回試すトリガー
  • Trendcount : 期間のトレンド値のカウント
  • Trenddelta : 期間の最小/最大トレンド値のデルタ
  • Trendmax : 期間のトレンド値の最大値
  • Trendmin : 期間のトレンド値の最小値
  • Trendsum : 期間のトレンド値の合計

5 What's new in Zabbix 5.2.0 [Zabbix Documentation 5.2]

まずはZabbix5.2の構築から

公式と以下の記事を参考にしました。Firewallの穴あけを追加した程度で、エラーも出ずさくっと構築完了しました。

環境

  • Zabbix 5.2
  • RHEL 8.2

Zabbixの構築手順、インストールから初期設定まで。AWSのCentOS編(Windowsは非対応) - Site24x7

監視アイテムとトリガーの設定

対象のサーバを登録し、テンプレート「Linux by Zabbix agent」を適用します。
今回トリガーを設定するアイテムは、stressコマンドで瞬間的にCPUへ負荷をかけることが出来る「CPU utilization」としました。

  • 監視アイテム「CPU utilization」

f:id:mst-it:20201210061605j:plain

  • トリガー「Abnormal CPU utilization on {HOST.HOST} 」

現在から1時間のトレンド平均と、1時間前から2時間前のトレンド平均を比較し、CPU utilizationが20%以上増加した場合、アラートを上げます。
トリガーの関数は「Trendavg 」です。

{test server:system.cpu.util.trendavg(1h,now/h)} - {test server:system.cpu.util.trendavg(1h,now/h-1h)} >= 20

なお、指定できる期間の最小単位は1時間です。

f:id:mst-it:20201210061946j:plain

CPU utilizationのグラフとアラート検知結果

対象サーバ(test server)のCPUに負荷をかけた結果、アラートを検知しました。

  • CPU utilizationのグラフ

f:id:mst-it:20201210063004j:plain

  • アラート検知

f:id:mst-it:20201210063015j:plain

その他

今回はすぐ確認できるよう1時間前のデータと比較しましたが、例えば、トラフィックデータを1年前の同じ月と比較といった長期的な視点の使い方が向いていそうです。 (トラフィック量は月によって変わり、長期休みの間は他の月より増えるため監視の指標が流動的だと効率的に運用できます。ただしコロナ禍前の記憶です。)

例: 現在の時刻を13:00とした場合

  • trenddelta(1h、now / h)→現在の時間のデルタ(12:00-13:00)
  • trenddelta(1h、now / h-1h)→前の時間のデルタ(11:00-12:00)
  • trenddelta(1h、now / h-2h)→2時間前のデルタ(10:00-11:00)
  • trenddelta(1M、now / M-1y)→1年前の同じ月のデルタ


別件ですが、Zabbixカンファレンス2020にて、Zabbix5.4でデータの機械学習のテスト版を載せ、Zabbix6.0で定着させたいとのことでした。 データを取得しているのに現在と過去だけ見るなんて勿体ないと思ってましたので、期待しています!

【Ansible】git_acpモジュール(git add, git commit, git push)を使ってみた

やりたいこと

Playbook で GitLabのリポジトリにファイルを登録します。
公式ドキュメントを検索したけど、git add, git commit, git push の一連ができそうなモジュールを見つけられず、GItHubを覗いてみたら git_acpモジュールがありました。

GitHub - lvrfrc87/git-acp-ansible: git_acp (add/commit/push) installer for Ansible


git_acpのインストールと設定例

01.インストールコマンドを実行します。

pip install git-acp-ansible

02.モジュールのパスをansible.cfgに記載します。

[defaults]
library=/usr/local/lib/python3.6/site-packages/git_acp/modules


Playbook例

日時がファイル名のテキストを作成し、GitLabに登録します。
予め、Gitlabにトークンを設定します。

# cat upload_git.yml
---
- hosts: gitlab
  gather_facts: false
  connection: local

  vars:
    now_date: "{{ lookup('pipe','date +%Y%m%d%H%M') }}"

  tasks:
    - name: git clone
      git:
        repo: http://root:【パスワード】@XX.XX.XX.XX/root/sample.git
        dest: /tmp/test/sample
        update: yes
        version: master
      become: yes

    - name: make file
      file:
        path: "/tmp/test/sample/{{ now_date }}.txt"
        state: touch
        mode: 0755

    - name: git add & commit & push
      git_acp:
        user: root
        token: XXXXXXXXXXXX
        path: /tmp/test/sample/   # .git/ のディレクトリ
        branch: master            # git push 先のブランチ
        comment: Add file         # git commit -m "Add file" commit のコメント
        add: "{{ now_date }}.txt" # git add するファイル
        mode: ssh                 # https/ssh/local のいずれか。httpは対応していません
        url: "git@XX.XX.XX.XX:root/sample.git"


実行結果

Playbookは通りました。

# ansible-playbook -i inventory.ini upload_git.yml -v
Using /etc/ansible/ansible.cfg as config file

PLAY [gitlab] **********************************************************

TASK [git clone] *******************************************************
changed: [gitlab_a] => {"after": "eb64b8b9a9b40d85cc9fc34a4d296bc974bca61b", "ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "before": "0ba46d56d56fe704f02f4be1cd3ccf8a52573a32", "changed": true, "remote_url_changed": false}

TASK [make file] *******************************************************
changed: [gitlab_a] => {"changed": true, "dest": "/tmp/test/sample/202010231820.txt", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0}

TASK [git add & commnt & push] ************************************
changed: [gitlab_a] => {"changed": true, "git_commit": "[master c53188e] Add file\n Committer: root <root@XX.XX.XX.XX>\nYour name and email address were configured automatically based\non your username and hostname. Please check that they are accurate.\nYou can suppress this message by setting them explicitly:\n\n    git config --global user.name \"Your Name\"\n    git config --global user.email you@example.com\n\nAfter doing this, you may fix the identity used for this commit with:\n\n    git commit --amend --reset-author\n\n 1 file changed, 0 insertions(+), 0 deletions(-)\n create mode 100644 202010231820.txt\n", "git_push": "To http://root:【パスワード】@XX.XX.XX.XX/root/sample.git\n   eb64b8b..c53188e  master -> master\n"}

PLAY RECAP **********************************************************
gitlab_a  : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0


GitLabのリポジトリにも、登録されていました。

f:id:mst-it:20201024033421p:plain


備考

git add / git commit / git push を実行するには、今のところコミュニティのモジュールしかないのかな。

AnsibleTowerの環境変数に設定したプロキシを、Playbookで空にする

Playbookでプロキシを空にする方法

Playbookに以下を追記することで、AnsibleTowerの環境変数に設定したプロキシが空になります。

    environment:
      http_proxy: ''
      https_proxy: ''
      no_proxy: ''


なお、'''use_proxy: no'''は効きません。

github.com


環境

Software Versions
Ansible 2.9.7
AnsibleTower 3.7.2


やったこと

1.プロキシ無しで成功することを確認

まずは、プロキシ設定がない状態で確認します。

---
- hosts: localhost

  tasks:
  - uri:
      url: https://www.google.com/
      method: GET
    register: result

  - debug:
      msg: "{{ result }}"


ジョブテンプレートは成功しました。

f:id:mst-it:20201009013024j:plain


2.プロキシを設定し失敗することを確認

AnsibleTowerの環境変数に、通らないプロキシを設定します。 f:id:mst-it:20201009012414j:plain


ジョブテンプレートは失敗しました。まぁ通りません。 f:id:mst-it:20201009012006j:plain


Playbookにuse_proxy: noを追加しても通りませんでした。

---
- hosts: localhost

  tasks:
  - uri:
      url: https://www.google.com/
      method: GET
      use_proxy: no
    register: result

  - debug:
      msg: "{{ result }}"


3.environmentを追加して確認

Playbookに、environmentを追加します。

---
- hosts: localhost

  tasks:
  - uri:
      url: https://www.google.com/
      method: GET
    register: result
    environment:
      https_proxy: ''

  - debug:
      msg: "{{ result }}"


ジョブテンプレートは成功しました。 f:id:mst-it:20201009011737j:plain

TeraTermのウィンドウサイズを変更しても表示ログが残る設定

設定方法

メニュー > 設定 > その他の設定 > 全般
「ウィンドウサイズ変更時に表示内容をクリアする」のチェックを外す。
その後、 設定 > 設定の保存 も忘れずに。

f:id:mst-it:20200708202401j:plain

備考

毎年TeraTermを初めて使う人はいるし、作業用PCはデフォルト設定の場合もあるよね。