mito’s blog

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

Ansible2.10とASAを立て、PlaybookでAccess Control Listを確認したときのメモ

やりたいこと

Ansible2.10もASAも初めてですが、ちょうど良い記事があったのでAnsible2.10でASAを触ってみました。
https://www.ansible.com/blog/ansible-security-automation-resource-modules

環境

Software Versions
Ansible 2.10.0b1
ASAv 9.13
ASDM 7.13

1.Ansible2.10の構築

こちらの記事を参考にしました。 https://tekunabe.hatenablog.jp/entry/2020/06/21/ansible_stumble_07

  • cisco.asa モジュールのインストール
    モジュールは、別途インストールします。
# ansible-galaxy collection install cisco.asa  -f 
Starting galaxy collection install process
Process install dependency map
|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-\|/-Starting collection install process
|Installing 'cisco.asa:1.0.0' to '/root/.ansible/collections/ansible_collections/cisco/asa'
/-\|/-\|/-\|/-\|/-\|Skipping 'ansible.netcommon' as it is already installed
# 
# ansible-galaxy collection list

# /root/.ansible/collections/ansible_collections
Collection           Version
-------------------- -------
ansible.netcommon    1.0.0  
ansible.posix        1.0.0  
cisco.asa            1.0.0  
community.general    0.2.0  
community.kubernetes 0.11.1 
google.cloud         0.10.1 
#

2.ASAの構築

  • 仮想アプライアンス
    AWS Marketplace の Cisco Adaptive Security Virtual Appliance (ASAv) - BYOLを使いました。

  • ログイン後の設定
    HTTPSの有効化とアクセス元の許可です。

ciscoasa> enable
The enable password is not set.  Please set it now.
Enter  Password: *******
Repeat Password: *******
Note: Save your configuration so that the password persists across reboots
("write memory" or "copy running-config startup-config").
ciscoasa# conf t
ciscoasa(config)#

***************************** NOTICE *****************************

Help to improve the ASA platform by enabling anonymous reporting,
which allows Cisco to securely receive minimal error and health
information from the device. To learn more about this feature,
please visit: http://www.cisco.com/go/smartcall

Would you like to enable anonymous error reporting to help improve
the product? [Y]es, [N]o, [A]sk later: a

ciscoasa(config)#
ciscoasa(config)# http server enable 443
ciscoasa(config)# http 【IPアドレス】 255.255.255.0 management      ☆接続元の許可
ciscoasa(config)# username 【ユーザ名】 password 【パスワード】 privilege 15 ☆ユーザ作成
ciscoasa(config)# exit
ciscoasa# write memory
Building configuration...
Cryptochecksum: 6b9b7d55 030f7cab 0597a569 40cd0d9d

7421 bytes copied in 0.180 secs
[OK]
ciscoasa#
  • ブラウザでアクセス
    https://XX.XX.XX.XX にアクセスすると、アプリのインストールが求められます。 今回はASDMをインストールしました。

  • ASDMの起動
    ASAのIP、ユーザ名、パスワードを入力します。

  • Interfaceの追加
    Configuration > Device Setup > Interface Settings > Interfaces より、 VNIインターフェイスを追加します。

    • IPaddress 10.1.0.1/16
  • ACLの追加 Configuration > Firewall > Access Rules より、 ACLを追加します。

3.inventoryとplaybookの作成

  • inventory
# cat inventory/inventory.ini
[asa]
ciscoasa ansible_host=XX.XX.XX.XX

[all:vars]
ansible_user=【ユーザ名】
ansible_password=【パスワード】
ansible_become=true
ansible_become_method=ansible.netcommon.enable
ansible_become_pass=【パスワード】
ansible_connection=ansible.netcommon.network_cli
ansible_network_os=cisco.asa.asa
ansible_python_interpreter=$(which python)


- playbook
追加したACLを表示します。

# cat asa_get-acl.yml
---
- name: Get structured data
  hosts: ciscoasa
  gather_facts: false
  collections:
  - cisco.asa

  tasks:
  - name: Gather facts
    asa_acls:
      state: gathered
    register: gather

  - name: output data
    debug:
      msg: "{{ gather }}"

4.playbookの実行

追加したACLが表示されました。

# ansible-playbook -i inventory/inventory.ini asa_get-acl.yml

PLAY [Get structured data] ************************************************

TASK [Gather facts] *******************************************************
ok: [ciscoasa]

TASK [output data] ********************************************************
ok: [ciscoasa] => {
    "msg": {
        "changed": false,
        "failed": false,
        "gathered": [
            {
                "acls": [
                    {
                        "aces": [
                            {
                                "destination": {
                                    "address": "10.2.0.0",
                                    "netmask": "255.255.0.0"
                                },
                                "grant": "permit",
                                "line": 1,
                                "protocol": "ip",
                                "protocol_options": {
                                    "ip": true
                                },
                                "source": {
                                    "any": true
                                }
                            }
                        ],
                        "acl_type": "extended",
                        "name": "global_access"
                    }
                ]
            }
        ]
    }
}

PLAY RECAP ****************************************************************
ciscoasa : ok=2  changed=0  unreachable=0  failed=0  skipped=0  rescued=0  ignored=0

雑記

動かすことはできたけど、理解はこれから。
あと雨が続くので、腹筋ローラーを買った。ブログを書かない、走らない日は腹筋を鍛えるしかない。

「Ansible × Zabbix」通信断復旧時の自動ログ取得をREST APIで改善する

概要

ZabbixでNW機器を監視し、通信断が復旧したらAnsibleでログを自動取得します。
昨日の記事では、Ansible側に監視対象機器のIPアドレスを設定しており、使いまわすような設定ではありませんでした。
「Ansible × Zabbix」通信断が復旧したときのログ取得を自動化する - mito’s blog

今回はそこを改善し、IPアドレスを引数として渡すことで複数の監視機器で使いまわせる設定にします。
主にAWX(Ansible)のREST APIがメインになります。

環境

Software Versions
AWX(Ansible) 13.0.0
Zabbix 5.0

ベースの構築/設定

昨日の記事を参照してください。
「Ansible × Zabbix」通信断が復旧したときのログ取得を自動化する - mito’s blog

1.AWXの設定

前回との差分を記載します

  • Playbookの作成
---
- hosts: "{{ host_name }}"    #サーベイで入力する
  gather_facts: no

  tasks:
    - name: show command
      ios_command:
        commands:
          - show running-config
          - show log
      register: result

    - name: debug
      debug:
        msg: "{{  result.stdout_lines  }}"


  • ワークフローの作成
    • サーベイに以下を追加します。

      • プロンプトに「HOST_NAME」、回答の変数名に「host_name」、回答タイプに「テキスト」を設定
      • プロンプトに「HOST_IP」、回答の変数名に「ansible_host」、回答タイプに「テキスト」を設定 f:id:mst-it:20200701024055j:plain
    • ワークフロビジュアライザーで作成したテンプレートを追加します。


  • REST APIの設定/確認
    • 作成したワークフローのIDを確認します。対象のワークフローをクリックした後のURLに含まれます。今回のIDは「10」です。

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

    • ワークフローのAPIをたたく際、追加変数が利用できるように設定を変えます。
      以下のリンクにて、"ask_variables_on_launch"trueに変更し、PUTを選択します。
      http://「IPアドレス」/api/v2/workflow_job_templates/10/

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

2.Zabbixの設定

アクションのコマンド設定が前回と変わります。

  • コマンド
curl -f -k -H 'Content-Type: application/json' -X POST --user '「AWXログインID」:「AWXログインパスワード」' http://「IPアドレス」/api/v2/workflow_job_templates/ワークフローID」/launch/ -d "{\"extra_vars\": {\"host_name\":\"{HOST.HOST}\",\"ansible_host\":\"{HOST.IP}\"}}"
  • {HOST.HOST}
    • アクションを起動(障害検知)したホストのホスト名を格納しているマクロです。
  • {HOST.IP}
    • アクションを起動(障害検知)したホストのIPアドレスを格納しているマクロです。

3.Ansible × Zabbix の連携

監視対象のcsr-1を再起動させます。
Zabbixが通信断、および復旧を検知したあと、アクションが実行されます。ここまでは前回と同じです。

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

AWXでは、対象のワークフローが実行されています。
追加変数も正常に引き渡されていることが確認できます。

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

雑記

ひとまず満足。。。
雨が続いて走れないのでブログを書く。

「Ansible × Zabbix」通信断が復旧したときのログ取得を自動化する

概要

ZabbixでNW機器を監視し、通信断が復旧したらAnsibleでログを自動取得します。
NW機器はcsrとし、show running-configとshow logを取得します。

環境

Software Versions
AWX(Ansible) 13.0.0
Zabbix 5.0

1.Zabbixの構築

先日の記事の環境を使用します。
監視対象のNW機器も追加されている状態です。
https://mitomito.hatenablog.jp/entry/2020/06/20/070000

なお、監視対象のNW機器csr-1にはSSH接続出来るようにしておきます。

2.AWXの構築

こちらの記事を参考に構築しました。
https://qiita.com/mina-stop/items/71266d74d102850eb4c0

また、テンプレートを作成する上で以下の問題にあたりますので、対応します。
https://sky-joker.tech/2018/03/21/awx%E3%81%ABvarlibawxprojects%E3%81%8C%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6/

  • 再インストール結果
    冪等性(べきとうせい)により、特に問題なくインストールされます。
PLAY RECAP *********************************************************************  
localhost : ok=16 changed=5 unreachable=0 failed=0 skipped=86 rescued=0 ignored=0

3.AWX(Ansible)の設定

2020/07/01追記 本記事はAnsible側に監視対象機器のIPアドレスを設定しています。
ワークフローのサーベイを使うことにより、ZabbixからIPアドレスを渡せます。
「Ansible × Zabbix」通信断復旧時の自動ログ取得を改善した - mito’s blog

Playbookやテンプレート等を作成します。

  • Playbookの作成
     以下のコマンドを実行します。
    • show running-config
    • show log
  • プロジェクトの作成
  • インベントリの作成
  • 認証情報の設定
  • ジョブテンプレートの作成
  • APIの確認
    Zabbixのアクションに設定するため、ジョブテンプレートIDを確認します。
    • http://「IPアドレス」/api/v2/job_templates/「ジョブテンプレートID」
    • ジョブテンプレートIDは以下から確認できます。 今回のIDは「9」です。

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


APIの参考情報
https://docs.ansible.com/ansible-tower/3.7.1/html_ja/towerapi/

4.Zabbixの設定

アクションの「復旧時の実行内容」に、ジョブテンプレートを実行するためのコマンドを記載します。

  • 実行内容のタイプ「リモートコマンド」
  • ターゲットリストは現在のホストにチェックを入れる
  • タイプ「カスタムスクリプト
  • 次で実行「Zabbixサーバー」
  • コマンド
curl -f -k -H 'Content-Type: application/json' -X POST --user '「AWXログインID」:「AWXログインパスワード」' http://「IPアドレス」/api/v2/job_templates/「ジョブテンプレートID」/launch/


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

5.Ansible × Zabbix の連携

死活監視の間隔を10秒にし、監視対象のcsr-1を再起動させます。 Zabbixが通信断、および復旧を検知したあと、アクション(右ポップアップのリモートコマンド)が実行されます。

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


AWXでは、対象のジョブテンプレートが実行されています。

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


show logの結果から、restartのログが確認できます。

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

雑記

インベントリやPlaybookの内容の工夫や、そもそもログを見やすくしたいなどAnsible側のスッキリさせたい設定は盛りだくさんですが、次はジョブテンプレートの結果をRedmineのチケットに追記してみたい。たい。いろいろ組み込みたい。

「JBUG 東京 #16」に参加しました

www.facebook.com

JBUG 東京 #16 #オンライン 〜今聞きたい!運営イチオシ特集〜 - connpass

セッション 発表者
なぜ、リモートアジャイルでタスク管理がそれほど重要なのか 市谷 聡啓(@papanda)
リモートワークになり意識を変えたプロジェクトマネジメント ひろた◆Webディレクター(@hirota_director)
Backlogと二人三脚で進める営業現場のプロジェクトマネジメントとは はらあやか@ぬ(@_moroco)

なぜ、リモートアジャイルでタスク管理がそれほど重要なのか by 市谷 聡啓さん

speakerdeck.com

  • アジャイルの変遷
  • 今は探検の時代
  • DXは正解が見えているような活動ではない
  • すべての仕事はタスク管理から始まる
    • DXが進まないのはタスク管理してないから
    • 何をやるべきかが言語化、可視化されておらず共有もされていない
  • ダニエルキムの成功循環モデル
    f:id:mst-it:20200626004844j:plain
    • 理解が浅いと思考が足りておらず、行動の選択肢も広がらない
    • 的を得た行動出会いと結果も出ない。結果が乏しいと学びも薄い
    • 初めの理解の質を高めよう
  • ウォーターフールはフェーズをまたがって修正するコストが高い
  • アジャイルは、情報量を少なくするが頻繁な同期で情報量を補完する
  • リモート×アジャイルは頻繁な同期のコストが高い
    • 限られた同期タイミングで出来るだけ情報量を詰め込む
  • リモートでアジャイルどうする?ではなく、リモートだからこそアジャイル f:id:mst-it:20200626005154j:plain
    • 分断を乗り越える

リモートワークになり意識を変えたプロジェクトマネジメント by ひろた◆Webディレクターさん

  • チャットで済まさず打ち合わせする
  • 用件だけで済ませない
    • 世間話をする
    • 他案件の状況共有
    • 少人数、自分含め3人まで
  • 失敗ケース
    • なにかあったらいつでもzoomを繋ぐから言ってねと伝えた
    • チャットでは分かりましたと返ってくるけど、気を使って言えないというのが本音
    • zoom常時解放しても2時間で一人しか相談に来なかった
  • どうするか
    • 気を使わない形で機会を設けるなら打ち合わせに盛り込む
    • お互いに状況が見えないから、相手から何かしてほしいだけでは難しい
  • プロジェクト管理において不安は最大の敵
    • リモートは相互理解が難しくなり、それにより不安が生まれる
  • 対策として打ち合わせの頻度と内容を変えた(冒頭の世間話など) f:id:mst-it:20200626005421j:plain
    • プロジェクトは円滑に進むようになった
  • 人数多かったら分けるの?
    • 担当や役割を考えて意図的に分ける

Backlogと二人三脚で進める営業現場のプロジェクトマネジメントとは by はらあやか@ぬ

speakerdeck.com

  • インサイドセールスの守備範囲
    • 無料トライアル→利用開始までの対応
  • どんなプロジェクトを管理しているか
    • セールスと名がつく職は、はらさん1人
    • チームの力を借りる
    • 自分がやっていることを課題に書き込んでいると、タスクをお願いすることもすぐにできる
  • 面倒でも必ず「記録」
    • とにかくログを残す。メールや添付ファイルも
    • 些細なメモや直結しない情報も残す
  • 記録はあなたを助けてくれます! f:id:mst-it:20200626010015j:plain
    • 他のチームに頼る際、まとめる手間が省ける。
    • たまに記録を忘れるけど、だって、にんげんだもの
  • 自動化「アポイントホイホイ施策」
    • Calendlyとメール設定で自動起票
    • 日程調整から開放された

雑記

  • 私の所属部署もリモートになってコミュニケーションが取りにくくなりました
  • そのため、googlemeetなどで部屋を常時解放した上で、夕会に雑談を入れて毎日コミュニケーション取っています
  • 例えば、テーマをマウントネタにしてうん十万の椅子の話から1日の歩数、普段飲んでいる飲み物の話などをしています
  • 今まで話したことがない内容が飛び出てくるので、仲間の新たな一面が知れて楽しいです
  • だってにんげんだものは、書籍「仕事の問題地図」にもあり、分かり身が深いです
  • 一部ではBacklogも使ってるけど、会社公式ツールはDesknet'sだからこちらでも会議予定の自動入力ができたらいいなぁ
  • 20:30開始は結構ありがたいかも。ご飯も風呂も済ませられるから、後を気にせずゆっくり聞けました

【Zabbix5.0 × Redmine】障害チケットを自動起票する

やったこと

Zabbix5.0で追加されたRedmineのWebhookを使って、障害チケットを自動起票させました。
スクリプトを書く必要がなく、とても便利でした。

環境

Versions OS
Zabbix5.0 Amazon Linux 2
Redmine3.4 centos7.7

1.Zabbixの構築

先日の記事の環境を使用します。
監視対象のNW機器も追加されている状態です。
https://mitomito.hatenablog.jp/entry/2020/06/20/070000

2.Redmineの構築

公式から辿るとPlaybookが用意されていたので、ansibleで構築しました。
https://github.com/farend/redmine-centos-ansible

3.Redmaineの設定

初期設定は公式を参考にします。
https://redmine.jp/tech_note/first-step/

今回は以下を実施しました。


3-1. プロジェクトの作成

  • 名称に「zabbix」を入力、保存をクリック


3-2. RedmineAPIの有効可

  • 画面上部の[管理] -> [設定] -> [API] -> [RESTによるWebサービスを有効にする]
  • チェックを入れて保存をクリック

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


3-3. APIアクセスキーのメモ

  • 画面右上の[個人設定] -> [APIアクセスキー] -> [表示]をクリック
  • 表示されたAPIアクセスキーをメモ

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


3-4. トラッカーの作成、トラッカーIDのメモ

  • [管理] -> [トラッカー -> [新しいトラッカー]をクリック
  • 名称に「障害」、デフォルトのステータスに「新規」を入力し保存をクリック
  • 作成したトラッカー「障害」をクリックし、URLに含まれるトラッカーIDをメモ
    例:http://XX.XX.XX.XX/redmine/trackers/4/edit
     トラッカーID「4」

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


4.Zabbixの設定

ZabbixとRedmineを連携させるための設定です。
追加されたメディアタイプ[Redmine]のWebhookの出番ですね。


4-1. マクロ{$ZABBIX.URL}の設定


4-2. メディアタイプ[Redmine]の設定

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


4-3. ユーザ作成、ユーザのメディアタイプ追加

  • システム連携用のユーザを作成
  • メディアタイプ[Redmine]を追加


4-4. アクションの設定

  • アクションの実行条件に「ホストグループ 等しい router」を追加
  • 実行内容の次のメディアのみ使用に「Redmine」を追加
  • 実行内容の実行条件に「イベント未確認」を追加
  • 復旧時、更新時の実行内容に「障害通知送信済のユーザーすべてにメッセージを送信」を設定

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


参考手順
https://www.zabbix.com/jp/integrations/redmine


5.自動起票

csr-1を落とし、Zabbixがping断を検知します。アクションも成功しています。


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


Redmaineに移動すると、、、


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


無事に自動起票されました。イェアアアアアア!!

回復も同じチケットに追記され大満足です。


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


雑記

雑誌に載ってそうなシステム連携図っぽいことがやりたかった!
Playbookを流すだけでさくっとRedmineが構築できたのも気持ちいいし。
Ansibleをそれのみに使うのはもったいないので、次は。。。