てんこ

ブログ名は愛猫(てん)の愛称です。中身は個人のIT系学習記録です。

AnsibleでFortigateをファームアップしてみた

Advent Calenderの時期で、私もAnsible 2 Advent Calender 2019にエントリしていますが、空気を読まずに通常投稿!!

先日の記事にも書きましたが、我が家の検証用のFortigateが2台構成になりました。

最終的にHAを組むつもりなので、各々のバージョンを合わせるために、Ansibleでファームアップを試みてみましたので、それを記録しておきます。

Ansible関連の実践記事一覧はこちら


目的

AnsibleによるFortigateのファームアップにおけるPlaybookに必要なパラメータを明らかにするため

モジュールのリファレンス<your_own_value>ばかりで困るんです…

環境

※途中の過程でFortios5.6でも試しかけましたが、fortios_factsすら通らなかったので断念。

fortios_system_firmware_upgradeの手法毎の結果

source: usbの場合

事前準備として、ファームアップ用のファイル(.outファイル)をUSBメモリに入れ、本体に接続します。

その後、以下のようなPlaybookで、問題なくファームアップが実施できました。

最後にdebug仕込んでますが、Reboot入ってしまうのでエラーになります。(うろ覚えなので、確認後修正するかもしれません。)

ただ、処理はちゃんと実行されていて、Reboot後には新しいファームで起動してきます。

---
- hosts: fortigate
  gather_facts: false
  vars:
    vdom: "root"

  tasks:

  - name: Perform firmware upgrade with firmware file on USB.
    fortios_system_firmware_upgrade:
      vdom:  "{{ vdom }}"
      system_firmware:
        filename: "FGT_60D-v6-build0303-FORTINET.out" #USBメモリ上のファイル名を入れる
        format_partition: "yes"
        source: "usb"
    register: fortios_system_firmware_upgrade_result
  
  - name: Debug
    debug:
      var: fortios_system_firmware_upgrade_result

source: fortiguardの場合

事前準備として、ファームアップ用のファイル名が必要になります。

この「ファイル名」が曲者でして。「オンラインなのにファイル名…?」となりました。バージョンの指定とかならわかるんですが。

  • USBでやったときの結果と同じファイル名でやってみる→NG ( "FGT_60D-v6-build0303-FORTINET.out" )
  • ターゲットにしているバージョンを入れてみる→NG ( "v6.0.8" )

■NG時の出力(Playbookの実行結果のstateとしてはokになります)

"results": {
    "error": "download_failed",
    "status": "error"
},

f:id:tatematsu_san:20191208170048p:plain

頭を悩ませていたんですが、fortios_factsに「system_firmware_select」というfactがあったことを思い出しまして、以下のPlaybookを実行。

■fortios_facts実行用のPlaybook

---
- hosts: fortigate
  gather_facts: false

  tasks:
  - name: Get Facts.
    fortios_facts:
      gather_subset:
        - fact: 'system_firmware_select'
    register: getfact_result

  - name: Debug
    debug: 
      var: getfact_result

その結果、以下のようなJSON形式の情報が戻ってきました。

■fortios_factsの出力結果

"results": {
"available": [
    {
        "branch-point": 303,
        "build": 303,
        "id": "06000000FIMG0009900008",
        "major": 6,
        "minor": 0,
        "name": "FortiOS",
        "notes": "http://docs.fortinet.com/d/fortios-6.0.8-release-notes/download",
        "patch": 8,
        "release-type": "GA",
        "source": "fortiguard",
        "version": "v6.0.8"
    },
    {
        "branch-point": 302,
        "build": 302,
        "id": "06000000FIMG0009900007",
        "major": 6,
        "minor": 0,
        "name": "FortiOS",
        "notes": "http://docs.fortinet.com/d/fortios-6.0.7-release-notes/download",
        "patch": 7,
        "release-type": "GA",
        "source": "fortiguard",
        "version": "v6.0.7"
    },
(中略)
],
"current": {
    "branch-point": 231,
    "build": 231,
    "id": "current",
    "major": 6,
    "minor": 0,
    "name": "FortiOS",
    "notes": "http://docs.fortinet.com/d/fortios-6.0.4-release-notes/download",
    "patch": 4,
    "platform-id": "FGT60D",
    "release-type": "GA",
    "source": "current",
    "version": "v6.0.4"
}

この中のどれかか…とあたりを付け、ファイル名になりそうな「id」という情報を試しに入れてみました。

結果、Playbookの実行が即download_Failed などにはならず、待ち状態→Timeoutっぽい形でfailedになりました。

■作成したPlaybook

---
- hosts: fortigate
  gather_facts: false
  vars:
    vdom: "root"

  tasks:

  - name: Perform firmware upgrade with firmware on fortiguard.
    fortios_system_firmware_upgrade:
      vdom:  "{{ vdom }}"
      system_firmware:
        filename: "06000000FIMG0009900008" #v6.0.8の場合の「ID」の値を記載
        format_partition: "yes"
        source: "fortiguard"
    register: fortios_system_firmware_upgrade_result
  
  - name: Debug
    debug:
      var: fortios_system_firmware_upgrade_result

しばらく放置すると、コンソール画面に変化が現れ、ファームアップのシーケンスに入ってくれて、その後自動で再起動→ファームアップが完了しました!!

というわけで、【source: fortiguardを利用する場合のfilenameにはfortios_factsで取得できる対象ファームウェアの「id」を入れればいい】ということがわかりました。

これも最後にdebug仕込んでますが、ファームウェアのダウンロード中の段階でTimeoutを迎えてエラーになります。ただ、処理はちゃんと実行されていて、Reboot後には新しいファームで起動してきます。

試しにPlaybook実行時に--timeout=6000 とオプションを入れてみましたが変わりませんでした。

httpapiのtimeout値をいじればもしかしたら戻りが取れるのかもしれません。また調べてみようと思います。

ダウングレードの場合

試しに、6.0.8->6.0.7を同じやり方で試してみたんですが、ダウングレードは始まりませんでした。

ファームウェア関連は、WebUIで見ると、こんな画面になります。(System -> Firmware )

f:id:tatematsu_san:20191208190845p:plain

上手く行かない理由は、この部分の「Confirm version downgrade」に当たる部分がモジュール上存在しないからかな、と予想してます。

(WebUIでやる場合には、問題なくダウングレードも実施可能です)

source: uploadの場合(未達成)

おそらく、Ansibleを使う時点でUSBはないな、と思ってます。そうすると、本命はfortiguardか、このupload。

なんですが。

f:id:tatematsu_san:20191208173530p:plain

なぜbase64エンコードをする必要があるのか…

モジュール側で処理してくれればいいのにと思いながら、ちょっと試してみましたが、上手く行かず。

■作成したPlaybook(失敗してます)

---
- hosts: fortigate
  gather_facts: false
  vars:
    vdom: "root"

  tasks:
  - name: Perform firmware upgrade with firmware file Upload File.
    fortios_system_firmware_upgrade:
      vdom:  "{{ vdom }}"
      system_firmware:
        file_content: lookup('file', '/home/ansible/ansible-playbook/fortigate/F60Dv608_base64')
        filename: "FGT_60D-v6-build0303-FORTINET.out"
        format_partition: "yes"
        source: "upload"
    register: fortios_system_firmware_upgrade_result
  
  - name: Debug
    debug:
      var: fortios_system_firmware_upgrade_result

外部でbase64化したものをlookupで読ませたんですが、失敗してます。

これは余裕がある時にもう少し別の方法を試してみます。

まとめ

最後の「upload」はまだ未完了ですが、FortigateのファームアップもAnsibleで実行できることが確認できました。

uploadのものも、fortiguardほどはわからなくはないと思いますので、また折を見てやってみます。

●残課題

  • uploadでのbase64での実践
  • fortiguard/uploadで発生するtimeoutを伸ばして、処理結果を取得する方法

ラボ環境がちょっとパワーアップしました。

いつもAnsibleで検証してるFortigateが2台構成になり、HAが組めるように…これで色々捗りそうです!!

f:id:tatematsu_san:20191203230646j:plain

配線は仮なので見直す予定。

12/5 見直し完了!!これで捗る予感!

  • 2PortのLANスイッチャ(左端に見える白い箱)で、1/2号機のFortigateのコンソール接続を切り替えられるように整備
  • LAN配線を全体的に短いケーブルへ移行
  • 純正電源ケーブルが長すぎるため、ミッキータイプの短い電源ケーブルに換装

f:id:tatematsu_san:20191205220708p:plain

AnsibleでFortigateのConfigをバックアップしてみた。

Ansibleのfortios用のモジュールには、バックアップモジュールはありません。

実際には、fortios_configというモジュールで取得ができたようなのですが、pyFGが必要なようです。

自分の環境ではpyFGが入らないので、うーんと思っていました。(細かい原因は追ってません…)

先日書いた汎用のuriを、こちらのブログを参考にして少しいじったら、バックアップを取得することができました。

参考にしたブログではAPI_KEYを利用されていましたが、現時点ではセッションのCookieでも取得は可能でした。(将来が若干不安ではありますが…)

Ansible関連の実践記事一覧はこちら


作成したPlaybook

---
- hosts: fortigate  
  gather_facts: false

  vars:
    api_type: "monitor"
    api_path: "system"
    api_name: "config"

  tasks:
  - name: Login
    uri:
      url: https://{{ ansible_host }}/logincheck
      validate_certs: no
      method : "POST"
      force_basic_auth: yes
      body_format: "form-urlencoded"
      url_username: "{{ ansible_user }}"
      url_password: "{{ ansible_password }}"
      body:
        - [ username, "{{ ansible_user }}" ]
        - [ secretkey, "{{ ansible_password }}" ]
        - [ ajax, "1" ]
    register: http_response
    
  - name: GET Config Backup
    uri:
      url: https://{{ ansible_host }}/api/v2/{{ api_type }}/{{ api_path }}/{{ api_name }}/backup?scope=global
      validate_certs: no
      method: "GET"
      headers:
        Cookie: "{{ http_response.set_cookie }}"
      return_content: yes
    register: get_obj

  - name: Backup File
    copy:
      content: "{{ get_obj.content }}"
      dest: ./backup.txt # バックアップ出力先指定

取得できたバックアップ

f:id:tatematsu_san:20191128224235p:plain

2バイト文字もばっちり。

うーん、この参考にしたブログの方はAPIリファレンスお持ちなのかな…

やっぱりフル活用するにはAPIリファレンスが読みたいなあ…

AnsibleでFortigateのオブジェクト情報をGETしてみた(汎用版)

別記事でFortigateのポリシーをGETしてみたというのを書きましたが、それの汎用版です。

エンドポイントの指定にはAPIの種類であるtypeと、pathnameというのが必要そうな感じなので、それで大体どんなのが取れるのというのもメモ書きでまとめておきます。

fortios のものはわかりやすいのですが、"_" が3つ、4つなどのものもあるため、試してみたものを徐々に更新します。

理想は、これをuriで書くことなく、標準モジュールのGETメソッドにしてくれると嬉しいんですが…

Ansible関連の実践記事一覧はこちら


汎用Playbook

group_varsで認証情報を指定し、fortiosモジュールの動作を参考にしてuriモジュールでREST APIを利用する形にしています。

---
- hosts: fortigate  
  gather_facts: false

  vars:
    api_type: "cmdb" # cmdb/monitorの2種類があるようです。
    api_path: "system" #必要に応じてここを書き換えたり-eしたりSurveyしたり
    api_name: "ha" #必要に応じてここを書き換えたり-eしたりSurveyしたり

  tasks:
  - name: Login
    uri:
      url: https://{{ ansible_host }}/logincheck
      validate_certs: no
      method : "POST"
      force_basic_auth: yes
      body_format: "form-urlencoded"
      url_username: "{{ ansible_user }}"
      url_password: "{{ ansible_password }}"
      body:
        - [ username, "{{ ansible_user }}" ]
        - [ secretkey, "{{ ansible_password }}" ]
        - [ ajax, "1" ]
    register: http_response
    
  - name: GET Object
    uri:
      url: https://{{ ansible_host }}/api/v2/{{ api_type }}/{{ api_path }}/{{ api_name }}
      validate_certs: no
      method: "GET"
      headers:
        Cookie: "{{ http_response.set_cookie }}"
      return_content: yes
    register: get_obj

  - name: Debug Object
    debug:
      var: get_obj.json.results
      

typeとpath、nameの組み合わせ表

type path name 概要 備考
cmdb firewall policy ファイアウォールのポリシー設定が取得可能 /firewall/policy/1などとするとポリシーIDを限定可能
monitor firewall policy ファイアウォールのポリシー毎のActiveセッションや転送バイト数が取得可能
cmdb firewall address ファイアウォールのアドレスオブジェクトが取得可能 -
cmdb firewall addrgrp ファイアウォールのアドレスグループオブジェクトが取得可能 -
cmdb firewall internet-service ファイアウォールのインターネットサービスオブジェクトが取得可能 -
cmdb system interface 物理IFの各種設定が取得可能。多すぎ… -
monitor system interface 物理IFのIPやTX/RXバイト、エラー数が取得可能 fortios_factsの”system_interface_select”と同じだが、あちらはfilter設定で要素を追加可能な模様。
cmdb dlp sensor DLPセンサー設定が取得可能 -
cmdb ips rule 現在のIPSのシグネチャ情報が取得可能 LTでは、このネタにtemplateを組み合わせてcsv出力した
cmdb firewall ssl-ssh-profile SSLSSHプロファイル情報が取得可能

実際のログ

cmdb/firewall/ssl-ssh-profile

詳細はここをクリック

        "results": [
            {
                "caname": "Fortinet_CA_SSL",
                "comment": "Read-only SSL handshake inspection profile.",
                "ftps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        990
                    ],
                    "status": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "https": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        443
                    ],
                    "status": "certificate-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "imaps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        993
                    ],
                    "status": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "mapi-over-https": "disable",
                "name": "certificate-inspection",
                "pop3s": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        995
                    ],
                    "status": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "q_origin_key": "certificate-inspection",
                "rpc-over-https": "disable",
                "server-cert": "Fortinet_SSL",
                "server-cert-mode": "re-sign",
                "smtps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        465
                    ],
                    "status": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssh": {
                    "inspect-all": "disable",
                    "ports": [
                        22
                    ],
                    "ssh-algorithm": "compatible",
                    "ssh-policy-check": "disable",
                    "ssh-tun-policy-check": "disable",
                    "status": "disable",
                    "unsupported-version": "bypass"
                },
                "ssl": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "inspect-all": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssl-anomalies-log": "enable",
                "ssl-exempt": [],
                "ssl-exemptions-log": "disable",
                "ssl-server": [],
                "untrusted-caname": "Fortinet_CA_Untrusted",
                "use-ssl-server": "disable",
                "whitelist": "disable"
            },
            {
                "caname": "Fortinet_CA_SSL",
                "comment": "Customizable deep inspection profile.",
                "ftps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        990
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "https": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        443
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "imaps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        993
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "mapi-over-https": "disable",
                "name": "custom-deep-inspection",
                "pop3s": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        995
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "q_origin_key": "custom-deep-inspection",
                "rpc-over-https": "disable",
                "server-cert": "",
                "server-cert-mode": "re-sign",
                "smtps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        465
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssh": {
                    "inspect-all": "disable",
                    "ports": [
                        22
                    ],
                    "ssh-algorithm": "compatible",
                    "ssh-policy-check": "disable",
                    "ssh-tun-policy-check": "disable",
                    "status": "deep-inspection",
                    "unsupported-version": "bypass"
                },
                "ssl": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "inspect-all": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssl-anomalies-log": "enable",
                "ssl-exempt": [
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 31,
                        "id": 1,
                        "q_origin_key": 1,
                        "regex": "",
                        "type": "fortiguard-category",
                        "wildcard-fqdn": ""
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 33,
                        "id": 2,
                        "q_origin_key": 2,
                        "regex": "",
                        "type": "fortiguard-category",
                        "wildcard-fqdn": ""
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 3,
                        "q_origin_key": 3,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "adobe"
                    }
                ],
                "ssl-exemptions-log": "disable",
                "ssl-server": [],
                "untrusted-caname": "Fortinet_CA_Untrusted",
                "use-ssl-server": "disable",
                "whitelist": "disable"
            },
            {
                "caname": "Fortinet_CA_SSL",
                "comment": "Read-only deep inspection profile.",
                "ftps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        990
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "https": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "ports": [
                        443
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "imaps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        993
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "mapi-over-https": "disable",
                "name": "deep-inspection",
                "pop3s": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        995
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "q_origin_key": "deep-inspection",
                "rpc-over-https": "disable",
                "server-cert": "",
                "server-cert-mode": "re-sign",
                "smtps": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "inspect",
                    "ports": [
                        465
                    ],
                    "status": "deep-inspection",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssh": {
                    "inspect-all": "disable",
                    "ports": [
                        22
                    ],
                    "ssh-algorithm": "compatible",
                    "ssh-policy-check": "disable",
                    "ssh-tun-policy-check": "disable",
                    "status": "deep-inspection",
                    "unsupported-version": "bypass"
                },
                "ssl": {
                    "allow-invalid-server-cert": "disable",
                    "client-cert-request": "bypass",
                    "inspect-all": "disable",
                    "unsupported-ssl": "bypass",
                    "untrusted-cert": "allow"
                },
                "ssl-anomalies-log": "enable",
                "ssl-exempt": [
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 31,
                        "id": 1,
                        "q_origin_key": 1,
                        "regex": "",
                        "type": "fortiguard-category",
                        "wildcard-fqdn": ""
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 33,
                        "id": 2,
                        "q_origin_key": 2,
                        "regex": "",
                        "type": "fortiguard-category",
                        "wildcard-fqdn": ""
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 3,
                        "q_origin_key": 3,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "adobe"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 4,
                        "q_origin_key": 4,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "Adobe Login"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 5,
                        "q_origin_key": 5,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "android"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 6,
                        "q_origin_key": 6,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "apple"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 7,
                        "q_origin_key": 7,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "appstore"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 8,
                        "q_origin_key": 8,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "auth.gfx.ms"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 9,
                        "q_origin_key": 9,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "citrix"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 10,
                        "q_origin_key": 10,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "dropbox.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 11,
                        "q_origin_key": 11,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "eease"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 12,
                        "q_origin_key": 12,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "firefox update server"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 13,
                        "q_origin_key": 13,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "fortinet"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 14,
                        "q_origin_key": 14,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "googleapis.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 15,
                        "q_origin_key": 15,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "google-drive"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 16,
                        "q_origin_key": 16,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "google-play2"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 17,
                        "q_origin_key": 17,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "google-play3"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 18,
                        "q_origin_key": 18,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "Gotomeeting"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 19,
                        "q_origin_key": 19,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "icloud"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 20,
                        "q_origin_key": 20,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "itunes"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 21,
                        "q_origin_key": 21,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "microsoft"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 22,
                        "q_origin_key": 22,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "skype"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 23,
                        "q_origin_key": 23,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "softwareupdate.vmware.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 24,
                        "q_origin_key": 24,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "verisign"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 25,
                        "q_origin_key": 25,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "Windows update 2"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 26,
                        "q_origin_key": 26,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "live.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 27,
                        "q_origin_key": 27,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "google-play"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 28,
                        "q_origin_key": 28,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "update.microsoft.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 29,
                        "q_origin_key": 29,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "swscan.apple.com"
                    },
                    {
                        "address": "",
                        "address6": "",
                        "fortiguard-category": 0,
                        "id": 30,
                        "q_origin_key": 30,
                        "regex": "",
                        "type": "wildcard-fqdn",
                        "wildcard-fqdn": "autoupdate.opera.com"
                    }
                ],
                "ssl-exemptions-log": "disable",
                "ssl-server": [],
                "untrusted-caname": "Fortinet_CA_Untrusted",
                "use-ssl-server": "disable",
                "whitelist": "disable"
            }
        ],
        "revision": "156.0.2.661485498.1576996671",
        "serial": "FGT6xxxxxx",
        "status": "success",
        "vdom": "root",
        "version": "v6.0.8"
    }
}

Ansiblejpネットワーク部でLTをしてきました。

2019/11/20に、Ansibleユーザ会(Ansiblejp)のイベントで、「ネットワーク部」という分科会が開催され、その場でLTをさせていただきました。

人生初LTということもあり、とても貴重な経験をさせていただきましたので、その際に感じたことなどの記録を残しておきます。

イベントそのものについて

以下URLのイベントです。

ansible-users.connpass.com

当日発表した資料について

直前までSlideshareにしようとしてたんですが、11時くらいから、コンテンツのアップロードはできるものの変換処理が完了しなかったこともあり、急遽Speakerdeckへ切り替えました。

speakerdeck.com

Slideshareの件は、前日・当日発生していたOffice365障害などとも関連があるのでしょうか…(調べてません)

LTについて

やったこと(Y)

  • LT資料のつくり方などを、TLに流れてきた資料を参考にざっくり考える
  • LT資料のために、少し中途半端だったFortios系モジュールの検証を進める
  • LT資料の作成(1週間くらい前に仮組み完了。当日AMまで修正)
  • LT資料の中で誤解を招く表現などがないか、Ansible実践ガイドと照らし合わせて確認
  • LT当日に発表練習

わかったこと(W)

  • LTはすごい楽しい。LT未経験の方は習熟度などにあまり躊躇せず、ぜひやるべき。

    • LTの準備は前後タスクまで含めて非常にいい経験になる。
      • 自分が、どこまでわかってて、どこから分かっていないかが整理できる。
      • 想像力も膨らむ。あ、次これやりたいなと思えるようになる。
    • 自分という存在と、興味のあることを知ってもらえる非常にいい機会になる。
      • 自己紹介を済ませているのと同じなので、懇親会があった際なども話しかけられる材料になりやすい。
  • Ansibleユーザ会の中でも、fortiosモジュールに興味がある人がいてくれることがわかった。

    • fortiosモジュールの話、待ってましたというツイートを後から見て、泣きそうになった。
    • 試してみようとか言っていただける人もいた。他者の行動のきっかけにしてもらえるのは、本当にうれしかった。
  • 極度自動化戦隊の一体感は素晴らしい。

次やること(T)

  • もっと「発表を見終わった相手に何を伝えたいか」を意識する。
    • 全部詰め込むのは無理。伝えたいことにフォーカスしたほうが良い。
  • ちゃんと事前練習する。
  • 横道に逸れるなら、それもシナリオのうちに入れて時間内に終われるように計算しておく。

反省点

  • 発表練習は当日になってからやるもんじゃない(あたりまえ)。
  • 操作練習もしないと、マウスでスライド動かなくてアワアワすることになる。
  • もっと聞いていただいている方々の顔・反応を見て話すようにすればよかった。
  • ギリギリの時間のなか、調子に乗ってシナリオにない余計なことを言う悪い癖がまた出たので、やるならやるで構成をちゃんと考えるべきだった。

素の感想

超~~~~楽しかったです。

今年の2月くらいからコミュニティに参加させていただいていましたが、普段からもくもく会参加もリモートばかりなのもあり、数名の方以外は面識もない状態でした。 そのため、こういう機会を生かして改めてお会いできたり、特定個人として認識していただけたり、さらに前に進むための活力をいただけたりと、良いことづくめでした。

私の話は、どちらかというと「これを使うとこんなことができる」という話だったのですが、他の方の発表は「こんな課題を解決するために、Ansibleを現場で活用する(した)」という課題解決のためのAnsible、という位置づけの発表でした。

特にネットワーク系は文献も少ないこともあり、「What(なにができるか)」につながる材料も貴重なのですが、やはり聞いていても「Why(なぜ)/How(どのように)/Where(どのような環境で)」についての内容のほうが、聴講されてた方の反応も良かったように思いました。

「あるある」「あぁー」「わかる!」という反応を自分もしていましたし、やはり、参加される方の多くはすでにAnsibleを利用されており、利用する上で苦労もされていて、工夫の仕方などを参考にしたい、というような目的をお持ちなのではないかなと感じました。

ちなみに、自身のLT前後に実況ツイートの数が激減してるのですが、緊張のためと、発表後の放心状態のためです。特に後ろのplatinaさんのLTは前半放心状態で、ほとんど聞けてませんでした(大変申し訳ない。資料公開期待しております。)

今後について

Ansibleについては、現時点では業務では全く使っておらず、帰宅後や休日合間を縫って趣味のレベルで取り組んでいるのが現状で、それをちゃんとやり始められたのが今年の10月からです。まだ学習中ということもあり「こんなことができるのか」とWhatを知る毎日です。

Why/Howは実業務での利用経験がないので話できないなーと思ってもいたのですが、せっかくNUC環境も整えたので、(現場に似せる形で)「ボクの考えた運用がつらいシステム」なんかを作ってみれば、類似の経験もできそうです。(ドMかな?)

また、実践ガイド第三版で、よこちさんがネットワークモジュールの動作確認環境の作成方法を紹介してくださっているので、そちらも活用していろいろな機器の組み合わせを試してみます。

自分が関与している業務環境への導入はまだまだ先になると思いますが、業務環境への導入を一つの目標として、今後もAnsibleをはじめとしたIaCの勉強を続け、何かしらの形でコミュニティにも関わり続けていきたいなと改めて感じました。

まずは… Ansible Advent Calendar 2019か…?