はじめに
Ansible 2.8 以降、400以上大量に増えている fortios モジュール。Ansible 2.9 では httpapi
コネクションプラグインにも対応しました。
httpapi
コネクションプラグインに対応することにより、以下のようなメリットがあります。
- Playbook がスッキリする
- タスクごとに指定していた情報などを一括で変数で指定可能
- インベントリ管理の統一化
- サーバーなどと同じように、インベントファイルで、対象ホストを定義可能
- 環境構築が少し楽に
- Python ライブラリ
fortiosapi
が不要
- Python ライブラリ
従来の方式(legacy mode)を利用されたこちらの記事を拝見しました。
こちらの記事を参考にさせていただいて、同じ処理を httpapi コネクションプラグインを利用するとどうなるか、という観点でご紹介します。
httpapi を利用できる fortios モジュールは Ansible 2.8 と 2.9 で追加されたモジュール
[2019/11/10 追記]
fortios_facts モジュールのように、Ansible 2.9 で追加されたモジュールには、公式ドキュメントの説明ページに
Support both legacy mode (local_action) and httpapi
と書いてあるので、httpapi に対応していることが分かります。
それだけでなく、fortios_firewall_address のような Ansible 2.8 で追加されたモジュールにまで遡って対応されているようでした。
色々調べていくと、モジュールのコード内に、httpapi と区別するための legacy_mode に関する定義があるモジュールが httpapi に対応しているであろう、とあたりがつきました。
これに基づいて調べた、httpapi に対応している fortios モジュールの一覧は以下のとおりです(Ansible 2.9.0 現在)。
結果としては、Ansible 2.8 と 2.9 で追加されたモジュールと一致しました。
クリックして広げる
- fortios_alertemail_setting
- fortios_antivirus_heuristic
- fortios_antivirus_profile
- fortios_antivirus_quarantine
- fortios_antivirus_settings
- fortios_application_custom
- fortios_application_group
- fortios_application_list
- fortios_application_name
- fortios_application_rule_settings
- fortios_authentication_rule
- fortios_authentication_scheme
- fortios_authentication_setting
- fortios_dlp_filepattern
- fortios_dlp_fp_doc_source
- fortios_dlp_fp_sensitivity
- fortios_dlp_sensor
- fortios_dlp_settings
- fortios_dnsfilter_domain_filter
- fortios_dnsfilter_profile
- fortios_endpoint_control_client
- fortios_endpoint_control_forticlient_ems
- fortios_endpoint_control_forticlient_registration_sync
- fortios_endpoint_control_profile
- fortios_endpoint_control_settings
- fortios_extender_controller_extender
- fortios_facts
- fortios_firewall_DoS_policy
- fortios_firewall_DoS_policy6
- fortios_firewall_address
- fortios_firewall_address6
- fortios_firewall_address6_template
- fortios_firewall_addrgrp
- fortios_firewall_addrgrp6
- fortios_firewall_auth_portal
- fortios_firewall_central_snat_map
- fortios_firewall_dnstranslation
- fortios_firewall_identity_based_route
- fortios_firewall_interface_policy
- fortios_firewall_interface_policy6
- fortios_firewall_internet_service
- fortios_firewall_internet_service_custom
- fortios_firewall_internet_service_group
- fortios_firewall_ip_translation
- fortios_firewall_ipmacbinding_setting
- fortios_firewall_ipmacbinding_table
- fortios_firewall_ippool
- fortios_firewall_ippool6
- fortios_firewall_ipv6_eh_filter
- fortios_firewall_ldb_monitor
- fortios_firewall_local_in_policy
- fortios_firewall_local_in_policy6
- fortios_firewall_multicast_address
- fortios_firewall_multicast_address6
- fortios_firewall_multicast_policy
- fortios_firewall_multicast_policy6
- fortios_firewall_policy
- fortios_firewall_policy46
- fortios_firewall_policy6
- fortios_firewall_policy64
- fortios_firewall_profile_group
- fortios_firewall_profile_protocol_options
- fortios_firewall_proxy_address
- fortios_firewall_proxy_addrgrp
- fortios_firewall_proxy_policy
- fortios_firewall_schedule_group
- fortios_firewall_schedule_onetime
- fortios_firewall_schedule_recurring
- fortios_firewall_service_category
- fortios_firewall_service_custom
- fortios_firewall_service_group
- fortios_firewall_shaper_per_ip_shaper
- fortios_firewall_shaper_traffic_shaper
- fortios_firewall_shaping_policy
- fortios_firewall_shaping_profile
- fortios_firewall_sniffer
- fortios_firewall_ssh_host_key
- fortios_firewall_ssh_local_ca
- fortios_firewall_ssh_local_key
- fortios_firewall_ssh_setting
- fortios_firewall_ssl_server
- fortios_firewall_ssl_setting
- fortios_firewall_ssl_ssh_profile
- fortios_firewall_ttl_policy
- fortios_firewall_vip
- fortios_firewall_vip46
- fortios_firewall_vip6
- fortios_firewall_vip64
- fortios_firewall_vipgrp
- fortios_firewall_vipgrp46
- fortios_firewall_vipgrp6
- fortios_firewall_vipgrp64
- fortios_firewall_wildcard_fqdn_custom
- fortios_firewall_wildcard_fqdn_group
- fortios_ftp_proxy_explicit
- fortios_icap_profile
- fortios_icap_server
- fortios_ips_custom
- fortios_ips_decoder
- fortios_ips_global
- fortios_ips_rule
- fortios_ips_rule_settings
- fortios_ips_sensor
- fortios_ips_settings
- fortios_log_custom_field
- fortios_log_disk_filter
- fortios_log_disk_setting
- fortios_log_eventfilter
- fortios_log_fortianalyzer2_filter
- fortios_log_fortianalyzer2_setting
- fortios_log_fortianalyzer3_filter
- fortios_log_fortianalyzer3_setting
- fortios_log_fortianalyzer_filter
- fortios_log_fortianalyzer_override_filter
- fortios_log_fortianalyzer_override_setting
- fortios_log_fortianalyzer_setting
- fortios_log_fortiguard_filter
- fortios_log_fortiguard_override_filter
- fortios_log_fortiguard_override_setting
- fortios_log_fortiguard_setting
- fortios_log_gui_display
- fortios_log_memory_filter
- fortios_log_memory_global_setting
- fortios_log_memory_setting
- fortios_log_null_device_filter
- fortios_log_null_device_setting
- fortios_log_setting
- fortios_log_syslogd2_filter
- fortios_log_syslogd2_setting
- fortios_log_syslogd3_filter
- fortios_log_syslogd3_setting
- fortios_log_syslogd4_filter
- fortios_log_syslogd4_setting
- fortios_log_syslogd_filter
- fortios_log_syslogd_override_filter
- fortios_log_syslogd_override_setting
- fortios_log_syslogd_setting
- fortios_log_threat_weight
- fortios_log_webtrends_filter
- fortios_log_webtrends_setting
- fortios_report_chart
- fortios_report_dataset
- fortios_report_layout
- fortios_report_setting
- fortios_report_style
- fortios_report_theme
- fortios_router_access_list
- fortios_router_access_list6
- fortios_router_aspath_list
- fortios_router_auth_path
- fortios_router_bfd
- fortios_router_bfd6
- fortios_router_bgp
- fortios_router_community_list
- fortios_router_isis
- fortios_router_key_chain
- fortios_router_multicast
- fortios_router_multicast6
- fortios_router_multicast_flow
- fortios_router_ospf
- fortios_router_ospf6
- fortios_router_policy
- fortios_router_policy6
- fortios_router_prefix_list
- fortios_router_prefix_list6
- fortios_router_rip
- fortios_router_ripng
- fortios_router_route_map
- fortios_router_setting
- fortios_router_static
- fortios_router_static6
- fortios_spamfilter_bwl
- fortios_spamfilter_bword
- fortios_spamfilter_dnsbl
- fortios_spamfilter_fortishield
- fortios_spamfilter_iptrust
- fortios_spamfilter_mheader
- fortios_spamfilter_options
- fortios_spamfilter_profile
- fortios_ssh_filter_profile
- fortios_switch_controller_802_1X_settings
- fortios_switch_controller_custom_command
- fortios_switch_controller_global
- fortios_switch_controller_igmp_snooping
- fortios_switch_controller_lldp_profile
- fortios_switch_controller_lldp_settings
- fortios_switch_controller_mac_sync_settings
- fortios_switch_controller_managed_switch
- fortios_switch_controller_network_monitor_settings
- fortios_switch_controller_qos_dot1p_map
- fortios_switch_controller_qos_ip_dscp_map
- fortios_switch_controller_qos_qos_policy
- fortios_switch_controller_qos_queue_policy
- fortios_switch_controller_quarantine
- fortios_switch_controller_security_policy_802_1X
- fortios_switch_controller_security_policy_captive_portal
- fortios_switch_controller_sflow
- fortios_switch_controller_storm_control
- fortios_switch_controller_stp_settings
- fortios_switch_controller_switch_group
- fortios_switch_controller_switch_interface_tag
- fortios_switch_controller_switch_log
- fortios_switch_controller_switch_profile
- fortios_switch_controller_system
- fortios_switch_controller_virtual_port_pool
- fortios_switch_controller_vlan
- fortios_system_accprofile
- fortios_system_admin
- fortios_system_affinity_interrupt
- fortios_system_affinity_packet_redistribution
- fortios_system_alarm
- fortios_system_alias
- fortios_system_api_user
- fortios_system_arp_table
- fortios_system_auto_install
- fortios_system_auto_script
- fortios_system_automation_action
- fortios_system_automation_destination
- fortios_system_automation_stitch
- fortios_system_automation_trigger
- fortios_system_autoupdate_push_update
- fortios_system_autoupdate_schedule
- fortios_system_autoupdate_tunneling
- fortios_system_central_management
- fortios_system_cluster_sync
- fortios_system_console
- fortios_system_csf
- fortios_system_custom_language
- fortios_system_ddns
- fortios_system_dedicated_mgmt
- fortios_system_dhcp6_server
- fortios_system_dhcp_server
- fortios_system_dns
- fortios_system_dns_database
- fortios_system_dns_server
- fortios_system_dscp_based_priority
- fortios_system_email_server
- fortios_system_external_resource
- fortios_system_fips_cc
- fortios_system_firmware_upgrade
- fortios_system_fm
- fortios_system_fortiguard
- fortios_system_fortimanager
- fortios_system_fortisandbox
- fortios_system_fsso_polling
- fortios_system_ftm_push
- fortios_system_geoip_override
- fortios_system_global
- fortios_system_gre_tunnel
- fortios_system_ha
- fortios_system_ha_monitor
- fortios_system_interface
- fortios_system_ipip_tunnel
- fortios_system_ips_urlfilter_dns
- fortios_system_ips_urlfilter_dns6
- fortios_system_ipv6_neighbor_cache
- fortios_system_ipv6_tunnel
- fortios_system_link_monitor
- fortios_system_mac_address_table
- fortios_system_management_tunnel
- fortios_system_mobile_tunnel
- fortios_system_nat64
- fortios_system_nd_proxy
- fortios_system_netflow
- fortios_system_network_visibility
- fortios_system_ntp
- fortios_system_object_tagging
- fortios_system_password_policy
- fortios_system_password_policy_guest_admin
- fortios_system_pppoe_interface
- fortios_system_probe_response
- fortios_system_proxy_arp
- fortios_system_replacemsg_admin
- fortios_system_replacemsg_alertmail
- fortios_system_replacemsg_auth
- fortios_system_replacemsg_device_detection_portal
- fortios_system_replacemsg_ec
- fortios_system_replacemsg_fortiguard_wf
- fortios_system_replacemsg_ftp
- fortios_system_replacemsg_group
- fortios_system_replacemsg_http
- fortios_system_replacemsg_icap
- fortios_system_replacemsg_image
- fortios_system_replacemsg_mail
- fortios_system_replacemsg_nac_quar
- fortios_system_replacemsg_nntp
- fortios_system_replacemsg_spam
- fortios_system_replacemsg_sslvpn
- fortios_system_replacemsg_traffic_quota
- fortios_system_replacemsg_utm
- fortios_system_replacemsg_webproxy
- fortios_system_resource_limits
- fortios_system_sdn_connector
- fortios_system_session_helper
- fortios_system_session_ttl
- fortios_system_settings
- fortios_system_sflow
- fortios_system_sit_tunnel
- fortios_system_sms_server
- fortios_system_snmp_community
- fortios_system_snmp_sysinfo
- fortios_system_snmp_user
- fortios_system_storage
- fortios_system_switch_interface
- fortios_system_tos_based_priority
- fortios_system_vdom
- fortios_system_vdom_dns
- fortios_system_vdom_exception
- fortios_system_vdom_link
- fortios_system_vdom_netflow
- fortios_system_vdom_property
- fortios_system_vdom_radius_server
- fortios_system_vdom_sflow
- fortios_system_virtual_wan_link
- fortios_system_virtual_wire_pair
- fortios_system_vxlan
- fortios_system_wccp
- fortios_system_zone
- fortios_user_adgrp
- fortios_user_device
- fortios_user_device_access_list
- fortios_user_device_category
- fortios_user_device_group
- fortios_user_domain_controller
- fortios_user_fortitoken
- fortios_user_fsso
- fortios_user_fsso_polling
- fortios_user_group
- fortios_user_krb_keytab
- fortios_user_ldap
- fortios_user_local
- fortios_user_password_policy
- fortios_user_peer
- fortios_user_peergrp
- fortios_user_pop3
- fortios_user_quarantine
- fortios_user_radius
- fortios_user_security_exempt_list
- fortios_user_setting
- fortios_user_tacacsplus
- fortios_voip_profile
- fortios_vpn_certificate_ca
- fortios_vpn_certificate_crl
- fortios_vpn_certificate_local
- fortios_vpn_certificate_ocsp_server
- fortios_vpn_certificate_remote
- fortios_vpn_certificate_setting
- fortios_vpn_ipsec_concentrator
- fortios_vpn_ipsec_forticlient
- fortios_vpn_ipsec_manualkey
- fortios_vpn_ipsec_manualkey_interface
- fortios_vpn_ipsec_phase1
- fortios_vpn_ipsec_phase1_interface
- fortios_vpn_ipsec_phase2
- fortios_vpn_ipsec_phase2_interface
- fortios_vpn_l2tp
- fortios_vpn_pptp
- fortios_vpn_ssl_settings
- fortios_vpn_ssl_web_host_check_software
- fortios_vpn_ssl_web_portal
- fortios_vpn_ssl_web_realm
- fortios_vpn_ssl_web_user_bookmark
- fortios_vpn_ssl_web_user_group_bookmark
- fortios_waf_main_class
- fortios_waf_profile
- fortios_waf_signature
- fortios_waf_sub_class
- fortios_wanopt_auth_group
- fortios_wanopt_cache_service
- fortios_wanopt_content_delivery_network_rule
- fortios_wanopt_peer
- fortios_wanopt_profile
- fortios_wanopt_remote_storage
- fortios_wanopt_settings
- fortios_wanopt_webcache
- fortios_web_proxy_debug_url
- fortios_web_proxy_explicit
- fortios_web_proxy_forward_server
- fortios_web_proxy_forward_server_group
- fortios_web_proxy_global
- fortios_web_proxy_profile
- fortios_web_proxy_url_match
- fortios_web_proxy_wisp
- fortios_webfilter_content
- fortios_webfilter_content_header
- fortios_webfilter_fortiguard
- fortios_webfilter_ftgd_local_cat
- fortios_webfilter_ftgd_local_rating
- fortios_webfilter_ips_urlfilter_cache_setting
- fortios_webfilter_ips_urlfilter_setting
- fortios_webfilter_ips_urlfilter_setting6
- fortios_webfilter_override
- fortios_webfilter_profile
- fortios_webfilter_search_engine
- fortios_webfilter_urlfilter
- fortios_wireless_controller_ap_status
- fortios_wireless_controller_ble_profile
- fortios_wireless_controller_bonjour_profile
- fortios_wireless_controller_global
- fortios_wireless_controller_hotspot20_anqp_3gpp_cellular
- fortios_wireless_controller_hotspot20_anqp_ip_address_type
- fortios_wireless_controller_hotspot20_anqp_nai_realm
- fortios_wireless_controller_hotspot20_anqp_network_auth_type
- fortios_wireless_controller_hotspot20_anqp_roaming_consortium
- fortios_wireless_controller_hotspot20_anqp_venue_name
- fortios_wireless_controller_hotspot20_h2qp_conn_capability
- fortios_wireless_controller_hotspot20_h2qp_operator_name
- fortios_wireless_controller_hotspot20_h2qp_osu_provider
- fortios_wireless_controller_hotspot20_h2qp_wan_metric
- fortios_wireless_controller_hotspot20_hs_profile
- fortios_wireless_controller_hotspot20_icon
- fortios_wireless_controller_hotspot20_qos_map
- fortios_wireless_controller_inter_controller
- fortios_wireless_controller_qos_profile
- fortios_wireless_controller_setting
- fortios_wireless_controller_timers
- fortios_wireless_controller_utm_profile
- fortios_wireless_controller_vap
- fortios_wireless_controller_vap_group
- fortios_wireless_controller_wids_profile
- fortios_wireless_controller_wtp
- fortios_wireless_controller_wtp_group
- fortios_wireless_controller_wtp_profile
準備
インベントリファイル、変数定義ファイル、Playbook を作成します。
インベントリファイル
対象の fortigate のホスト情報をインベントリに定義します。ここでは fortios
というグループに所属させます。
- inventory.ini
[fortios] fortios01 ansible_host=10.0.0.254
後述の Playbook の hosts
でこのグループ fortios
を指定します。
変数定義ファイル
グループ fortios
に所属するホストが利用する変数を定義します。
以下のように、認証情報や証明書検証の有無を指定できます。
- group_vars/fortios.yml
ansible_user: admin # ユーザー名 ansible_password: xxxxxxx # パスワード ansible_network_os: fortios # ネットワークOS ansible_connection: httpapi # httpapi コネクションプラグインを利用 ansible_httpapi_use_ssl: yes # https を利用 ansible_httpapi_validate_certs: no # 証明書の検証は無効
legacy mode で利用する各タスクに指定する接続情報と、httpapi コネクションプラグインの変数の対応は以下のとおりです。
項目 | legacy mode のオプション | httpapi コネクションプラグインの変数 |
---|---|---|
ユーザー名 | username |
ansible_user |
パスワード | password |
ansible_password |
SSL/TLS の利用有無 | https |
ansible_httpapi_use_ssl |
証明書検証の有無 | ssl_verify |
ansible_httpapi_validate_certs |
なお、httpapi コネクションプラグインで利用できる変数の一覧は以下を参照してください。
Playbook
fortios_facts
モジュールを利用して情報を取得して、debug
で出力させるサンプルです。
- fortios_test.yml
--- - hosts: fortios # localhost ではなくインベントリで定義したグループ gather_facts: false vars: vdom: "root" tasks: - name: Get Facts. fortios_facts: # タスクに接続情報は不要 vdom: "{{ vdom }}" gather_subset: - fact: 'system_status_select' register: getfact_result - name: Debug debug: var: getfact_result
タスク(ここでは fortios_facts
を利用ているタスク)には、接続情報( host
username
password
オプション)は不要です。逆にタスクに接続情報が指定されていると、httpapi コネクションプラグインではく、legacy mode になるのでご注意ください。
Playbook 実行
Playbook を実行します。
$ ansible-playbook -i ../inventory.ini forti_test.yml PLAY [fortios] ******************************************************************************* TASK [Get Facts.] **************************************************************************** ok: [fortios01] TASK [Debug] ********************************************************************************* ok: [fortios01] => { "getfact_result": { "ansible_facts": { "ansible_net_gather_network_resources": [], "ansible_net_gather_subset": [], "ansible_network_resources": { "system_status_select": { "action": "select", "build": 1010, "http_method": "GET", "name": "status", "path": "system", "results": {}, "serial": "FGxxxxxxxxxxxx", "status": "success", "vdom": "root", "version": "v6.2.2" } }, "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "failed": false, "warnings": [ "Platform darwin on host fortios01 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information." ] } } PLAY RECAP *********************************************************************************** fortios01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
無事に接続して、システム情報が表示されました。
まとめ
Ansible から fortigate に対して、httpapi
コネクションプラグインを利用して接続してみました。
前述の通り、Playbook がスッキリする、インベントリ管理の統一化、環境構築が少し楽に、といったメリットがありますので、対応しているモジュールであれば、httpapi
コネクションプラグインが便利そうです。
ただ、Playbook 内に httpapi
コネクションプラグインが利用できないモジュールも混在してる場合は、利用しているモジュールのすべてで利用できる方式に統一するほうがよさそうです。
参考
[2019/11/10 追記]
Python 2 系だと
addinfourl instance has no attribute
というエラーが発生するという情報がありました。
[2019/12/05 追記]
Ansible 2.9.2 で Python 2/3 両方で使えるようになったようです。
ansible/CHANGELOG-v2.9.rst at stable-2.9 · ansible/ansible · GitHub
fortios httpapi plugin - fix the issue that fortios httpapi plugin does not support python2