SlideShare uma empresa Scribd logo
1 de 34
Baixar para ler offline
Reliable Security Always™ CONFIDENTIAL | DO NOT DISTRIBUTE
A10ネットワークス株式会社
ソリューションアーキテクト 石塚健太郎
Ansible Night in Osaka
2018年11月28日
A10 Thunder用の
Ansibleモジュールの書きかた
CONFIDENTIAL | DO NOT DISTRIBUTE2.
A10 Networksご存知ですか?
A10 Networks, Inc. (NYSE: ATEN)
• 設立:2004年9月
• 代表者:Lee Chen (CEO and Founder)
• 本社所在地:米国カリフォルニア州サンノゼ
A10ネットワークス株式会社
• 設立:2009年4月
• 代表者:川口 亨
(日本法 人代 表 兼 社 ⾧ 米国 本社ヴ ァイ スプ レ ジ デ ント 兼務 )
• 拠点:東京本社(六本木)、大阪支店(梅田)
シリコンバレー発
グローバル企業
900+(日本: 60+)
従業員数
27
拠点のある国
6,200+
導入社数
80+
製品・サポート提供先の国
世界のリーダー企業で採用 安定した成⾧
$142M
$180M
$196M
$227M
$230M
2013 2014 2015 2016 2017
CONFIDENTIAL | DO NOT DISTRIBUTE3.
A10 Thunderシリーズ(主力製品)
サーバー負荷分散
豊富なネットワーク/セキュリティ機能を1ボックスで提供
サイト間冗⾧
WAF
認証プロキシ
IPv4枯渇対策
IPv4/IPv6変換
回線負荷分散
SSL高速化
SSL通信可視化
DDoS防御
クラウドプロキシ
VxLAN/NVGRE GW
コンパクトでハイパフォーマンス
データセンターFW Gi/SGi FW URLフィルタリング
CONFIDENTIAL | DO NOT DISTRIBUTE4.
機能別の製品群
セキュリティ
DDoS防御
(Thunder
TPS)
TLS通信の可視化
(Thunder
SSLi)
集約型FW
(Thunder
CFW)
トラフィック制御
(Thunder ADC,
Lightning ADC)
キャリアグレードNAT
(Thunder
CGN)
アプリケーション配信
aGalaxy
(TPSの管理)
Harmony Controller
(マルチクラウド, マルチサービスのトラフィック可視化と管理)
CONFIDENTIAL | DO NOT DISTRIBUTE5.
柔軟な選択:フォームファクタ
仮想 ベアメタル コンテナ クラウド アプライアンス
独立した
インスタンス
最適な
パフォーマンス
クラウド
ネイティブ
クラウド
インスタンス
ハイパフォーマンス
オープンなREST API
(aXAPI)
CONFIDENTIAL | DO NOT DISTRIBUTE6.
aXPIとは?
• Thunderの情報取得・設定変更を行うためのREST API
• CLIで設定できる項目は、ほぼaXAPIでも設定可能
• 現状主に2つのバージョンがある
• v2.1:ACOS 2.7.2系
• v3.0:ACOS 4.x系
CONFIDENTIAL | DO NOT DISTRIBUTE7.
aXPIの流れ
ログオン
情報取得/設定追加
メモリ保存
ログオフ
CONFIDENTIAL | DO NOT DISTRIBUTE8.
ログオン
curl –X POST –k https://10.255.250.105/axapi/v3/auth
-H "Content-Type:application/json"
-d '{
"credentials": {
"username": "admin",
"password": "a10“
}
}‘
{
"authresponse" : {
"signature":"6141de07ade039e1ef6010a6297c18",
"description":"the signature should be set in Authorization
header for following request."
}
}
【リクエスト】
【レスポンス】
認証情報を用いて
mgmtポートにログオン
得られたsignature情報を
今後のリクエストで利用
CONFIDENTIAL | DO NOT DISTRIBUTE9.
設定情報取得
curl -k https://10.255.250.105/axapi/v3/slb
-H "Content-Type:application/json"
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18"
{
"slb": {
"common": {
"extended-stats":0,
"stats-data-disable":0,
"graceful-shutdown-enable":0,
…
"a10-url":"/axapi/v3/slb/service-group/sg80"
}
…
【リクエスト】
【レスポンス】
ログオン時に得られたsignatureを
ヘッダに入れてリクエストを送信
リクエストに応じた
設定情報の一覧を取得
設定値されているオブジェクトの
固有のURIも得られる
CONFIDENTIAL | DO NOT DISTRIBUTE10.
設定追加
curl -X POST -k https://10.255.250.105/axapi/v3/slb/server
-H "Content-Type:application/json“
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18“
-d '{"server-list":[{"name":"svr3","host":"192.168.1.3"}]}'
{
"server": {
"name":"svr3",
"host":"192.168.1.3",
"action":"enable",
…
"extended-stats":0,
"uuid":"432b96fc-c3b5-11e7-a858-000c29395c26"
}
}
【リクエスト】
【レスポンス】
設定を追加する属性にPOST
追加したオブジェクトの
情報が返る
追加するオブジェクトをJSONで記述
CONFIDENTIAL | DO NOT DISTRIBUTE11.
設定削除
curl -X DELETE -k https://10.255.250.105/axapi/v3/slb/server/svr3
-H "Content-Type:application/json“
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18“
{
"response": {
"status": "OK"
}
}
【リクエスト】
【レスポンス】
DELETEで削除するオブジェクトを指定
成功すれば“OK”が返る
curl -X DELETE -k https://10.255.250.105/axapi/v3/uuid/52f7e62a-c3b6-11e7-a858-
000c29395c26
-H "Content-Type:application/json“
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18“
【UUIDを指定する場合のリクエスト】
オブジェクトの
UUIDを指定して
削除することも可能
CONFIDENTIAL | DO NOT DISTRIBUTE12.
メモリ保存
curl -k -X POST https://10.255.250.105/axapi/v3/write/memory
-H “Content-Type:application/json"
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18"
{
"response": {
"status": "OK"
}
}
【リクエスト】
【レスポンス】
POSTで/write/memoryを指定
成功すれば“OK”が返る
CONFIDENTIAL | DO NOT DISTRIBUTE13.
ログオフ
curl -X POST -k https://10.255.250.105/axapi/v3/logoff
-H "Content-Type:application/json"
-H "Authorization: A10 6141de07ade039e1ef6010a6297c18"
{
"response": {
"status": "OK"
}
}
【リクエスト】
【レスポンス】
logoffを指定してPOST
成功すれば“OK”が返り、
signatureが再利用できなくなる
CONFIDENTIAL | DO NOT DISTRIBUTE14.
AnsibleによるThunderの構成管理
• AnsibleによるThunderの構成管理方法
• 方法①:a10_*モジュールを利用してPlaybookを記述
• 方法②:uriモジュールを利用したPlaybook内でaXAPIを実行
構成管理
モジュール
Playbook
管理者
CONFIDENTIAL | DO NOT DISTRIBUTE15.
a10_*モジュールを利用した場合の基本動作
• A10上にPython実行環境が無い(と考えた方が分かりやすい)ため、
実質上はAnsible Coreの動作しているサーバーから
Thunderに対しaXAPIで操作を実行する
• Playbook上では処理対象を分かりやすくするために
ThunderのホストIPを指定すると良い
• connection: localを指定し、ローカルで処理を実行する
aXAPI
モジュール
Playbook
管理者
CONFIDENTIAL | DO NOT DISTRIBUTE16.
A10のAnsibleモジュール
• 公式のGitHubでベータバージョンを公開中
https://github.com/a10networks/a10-ansible
• 1,453のモジュール
• 2,568のPlaybook例
• 利用時の注意点
• PythonのRequestsモジュールが必要
• モジュール内の一部を改修する必要がある場合がある
• 上記モジュールはaXAPIv3対象(ACOS4.x以降)
• 冪等性の担保は一部のみ/Dry Run未対応/PartitionやaVCSに未対応
• 自動ではwrite memoryされない
CONFIDENTIAL | DO NOT DISTRIBUTE17.
でもこうありたい
• 冪等性は確保したい
• Listで渡す情報をちゃんと処理したい
• Dry Runに対応したい
• Partition(仮想分割)やaVCS(仮想シャーシ)に対応したい
• 同一モジュールで異なるaXAPIバージョンを扱いたい
• Write memoryするかどうかは指定できるようにしたい
CONFIDENTIAL | DO NOT DISTRIBUTE18.
モジュールを書くには?
• まずこの辺りのモジュールをimport
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.urls import url_argument_spec, fetch_url
from ansible.module_utils.a10 import axapi_call_v3, axapi_call,
axapi_authenticate_v3, axapi_authenticate, axapi_failure
基本的には、
• AnsibleModule
• axapi_call_v3, axapi_call
• axapi_authenticate_v3, axapi_authenticate
• axapi_failure
を使う
CONFIDENTIAL | DO NOT DISTRIBUTE19.
基本プロセス
def main():
module = AnsibleModule(
argument_spec=get_argspec(),
supports_check_mode=True,
mutually_exclusive=MUTUALLY_EXCLUSIVE_SET
)
if module.check_mode:
result = dry_run_command(module)
else:
result = run_command(module)
module.exit_json(**result)
MUTUALLY_EXCLUSIVE_SET =
[['tagged_eth_list','tagged_trunk_list','untagged_eth_list','untagged_
trunk_list','untagged_lif']]
Dry run対応
CONFIDENTIAL | DO NOT DISTRIBUTE20.
Playbookからの引数読み込み(VLAN設定の例)
def get_argspec():
rv = get_default_argspec()
rv.update(
dict(
name=dict(type='str', required=False),
user_tag=dict(type='str', required=False),
vlan_num=dict(type='int', required=False),
ve=dict(type='int', required=False),
tagged_eth_list=dict(type='list', required=False),
untagged_eth_list=dict(type='list', required=False),
…
untagged_lif=dict(type='int', required=False)
)
)
return rv
共通部分の設定読み込み
CONFIDENTIAL | DO NOT DISTRIBUTE21.
共通で利用する引数の読み込み
def get_default_argspec():
rv = dict(
a10_host=dict(type='str', required=True),
a10_username=dict(type='str', required=True),
a10_password=dict(type='str', required=True, no_log=True),
axapi_version=dict(type='str', required=False, default='3',
choises=['2.1','3']),
partition=dict(type='str', required=False, default='shared'),
device=dict(type='str', required=False),
write_config=dict(type='bool', required=False, default='yes',
choises=['yes','no']),
state=dict(type='str', required=True,
choises=['present','absent','current','statistics','operational'])
)
rv.update(url_argument_spec())
return rv
CONFIDENTIAL | DO NOT DISTRIBUTE22.
Playbookでの共通設定項目
• a10_host:対象となるThunder/vThunderのmgmtポートアドレス
• a10_username:対象デバイスの管理ユーザーアカウント
• a10_password:管理ユーザーのパスワード
• validate_certs:aXAPIのポートの証明書の有効性検証をするか否か(yes or no)
• axapi_version:aXAPIのバージョン(2.1または3)
• write_config:設定後コンフィグを保存するか否か(yes or no)
• partition:設定対象となるパーティション(ADP)の指定
• state:present(存在)、absent(不在)
• device:aVCSのdevice ID(device-context)
CONFIDENTIAL | DO NOT DISTRIBUTE23.
コマンド実行プロセス
def run_command(module):
…
signature = axapi_open_session(module)
…
if module.params['partition']:
change_partition(module, signature)
if module.params['device']:
change_device_context(module, signature)
if module.params['state'] == 'present':
result = present(module, signature, result)
elif module.params['state'] == 'absent':
result = absent(module, signature, result)
…
if write_config:
write_memory(module, signature)
axapi_close_session(module, signature)
return result
aXAPIのシグネチャ取得
パーティションの移動
aVCSのデバイスの移動
設定の追加・削除
メモリ保存
aXAPIのログオフ
CONFIDENTIAL | DO NOT DISTRIBUTE24.
シグネチャの取得
def axapi_open_session(module):
if module.params['axapi_version'] == '3':
axapi_auth_url =
'https://{}/axapi/v3/auth/'.format(module.params['a10_host'])
rv = axapi_authenticate_v3(module, axapi_auth_url,
module.params['a10_username'], module.params['a10_password'])
elif module.params['axapi_version'] == '2.1':
axapi_auth_url =
'https://{}/services/rest/V2.1/'.format(module.params['a10_host'])
rv = axapi_authenticate(module, axapi_auth_url,
module.params['a10_username'], module.params['a10_password'])
if axapi_failure(rv):
module.fail_json(msg="Failed to open aXAPI session")
return rv
aXAPIv3での
シグネチャ取得
aXAPIv2.1での
シグネチャ取得
CONFIDENTIAL | DO NOT DISTRIBUTE25.
パーティションの移動
def change_partition(module, signature):
if module.params['axapi_version'] == '3':
axapi_base_url =
'https://{}/axapi/v3/'.format(module.params['a10_host'])
result = axapi_call_v3(module, axapi_base_url+'active-
partition/'+module.params['partition'], method='POST', body='',
signature=signature)
…
if axapi_failure(result)
axapi_close_session(module, signature)
module.fail_json(msg="Failed to change partition.")
パーティション移動するコマンドの実行
CONFIDENTIAL | DO NOT DISTRIBUTE26.
aVCSのデバイスの移動
def change_device_context(module, signature):
if module.params['axapi_version'] == '3':
json_post = {"device-context": {"device-id":
module.params['device']}}
axapi_base_url =
'https://{}/axapi/v3/'.format(module.params['a10_host'])
headers = {'content-type': 'application/json', 'Authorization':
'A10 %s' % signature}
rsp, info = fetch_url(module, axapi_base_url+'device-context',
method='POST', data=json.dumps(json_post), headers=headers)
if not rsp or info['status'] >= 400:
module.fail_json(msg="failed to connect (status code %s),
error was %s" % (info['status'], info.get('msg', 'no error given')))
rsp.close()
返り値が無いコマンドではaxapi_call()が動かないので個別処理
CONFIDENTIAL | DO NOT DISTRIBUTE27.
設定の変更(VLAN設定の場合)
def present(module, signature, result):
differences, config_before, json_post = diff_config(module,
signature, result, status='present’)
…
if differences == 1:
axapi_base_url = 'https://{}/axapi/v3/'.format(host)
result_list = axapi_call_v3(module,
axapi_base_url+'network/vlan/', method='POST',
body=json.dumps(json_post), signature=signature)
if axapi_failure(result_list):
axapi_close_session(module, signature)
module.fail_json(msg="Failed to create VLAN.")
else:
result["changed"] = True
…
return result
既存の構成とPlaybookの構成を比較するモジュール
JSON間に差異があれば、
Playbookの内容を反映して
POST
CONFIDENTIAL | DO NOT DISTRIBUTE28.
メモリ保存
def write_memory(module, signature):
if module.params['a10_host'] == '3':
axapi_base_url =
'https://{}/axapi/v3/'.format(module.params['a10_host'])
result = axapi_call_v3(module, axapi_base_url+'write/memory/',
method='POST', body='', signature=signature)
if axapi_failure(result):
axapi_close_session(module, signature)
module.fail_json(msg="Failed to write config.")
CONFIDENTIAL | DO NOT DISTRIBUTE29.
aXAPIのログオフ
def axapi_close_session(module, signature):
if module.params['axapi_version'] == '3':
axapi_logoff_url =
'https://{}/axapi/v3/logoff/'.format(module.params['a10_host'])
result = axapi_call_v3(module, axapi_logoff_url, method='POST',
body='', signature=signature)
elif module.params['axapi_version'] == '2.1':
axapi_logoff_url = signature + '&method=session.close'
result = axapi_call(module, axapi_logoff_url)
if axapi_failure(result):
module.fail_json(msg="Failed to close aXAPI session.")
CONFIDENTIAL | DO NOT DISTRIBUTE30.
Dry runの場合
def dry_run_command(module):
…
differences, config_before, json_post = diff_config(module,
signature, result, status=state)
…
result['diff']['before'] = config_before
…
if state == 'present’:
…
result['changed'] = True
result['diff']['after'] = json_post
…
return result
Playbook実行前後の
JSONの差異を
[‘diff’][‘before’]
[‘diff’][‘after’]
に入れておく
CONFIDENTIAL | DO NOT DISTRIBUTE31.
Playbookの記述例
---
- hosts: 10.255.211.25
connection: local
gather_facts: no
tasks:
- name: Set GSLB site
a10_gslb_site:
a10_host: 10.255.211.25
a10_username: admin
a10_password: a10
validate_certs: no
axapi_version: 3
partition: test
device: 1
write_config: yes
state: present
site_name: local
active_rdt:
limit: 16300
ignore-count: 6
multiple_geo_locations:
- geo-location: US
- geo-location: JP
slb_dev_list:
- device-name: A1
ip-address: 1.0.0.1
vip-server:
vip-server-name-list:
- vip-name: VIP-HTTP
- device-name: A3
ip-address: 1.0.0.3
vip-server:
vip-server-name-list:
- vip-name: VIP-HTTP3
register: test_reg
- name: show JSON
debug: msg="{{ test_reg }}"
対象ホストの指定、connection: local指定によるローカルでの実行指定、
事前の情報取得はできないのでgather-facts: noに
利用モジュールの指定(この例ではa10_gslb_siteモジュール)
全モジュール共通の設定項目
Key-value型の項目設定
dict型の項目設定
list型の項目設定
階層的なlist型-dict型の項目設定
(必要に応じ)返り値の表示
CONFIDENTIAL | DO NOT DISTRIBUTE32.
冪等性の確保
# ansible-playbook test_network_vlan.yml -i hosts
PLAY [10.255.211.25] ***************************************************************************************
TASK [Set VLAN] ********************************************************************************************
changed: [10.255.211.25]
PLAY RECAP *************************************************************************************************
10.255.211.25 : ok=1 changed=1 unreachable=0 failed=0
# ansible-playbook test_network_vlan.yml -i hosts
PLAY [10.255.211.25] ***************************************************************************************
TASK [Set VLAN] ********************************************************************************************
ok: [10.255.211.25]
PLAY RECAP *************************************************************************************************
10.255.211.25 : ok=1 changed=0 unreachable=0 failed=0
CONFIDENTIAL | DO NOT DISTRIBUTE33.
Dry run(checkモード)とdiffへの対応
# ansible-playbook test_network_vlan.yml -i hosts --check --diff
PLAY [10.255.211.25] ***************************************************************************************
TASK [Set VLAN] ********************************************************************************************
--- before
+++ after
@@ -1,7 +1,16 @@
{
"vlan": {
"a10-url": "/axapi/v3/network/vlan/110",
+ "name": "testnamex",
+ "untagged-eth-list": [
+ {
+ "untagged-ethernet-end": 7,
+ "untagged-ethernet-start": 7
+ }
+ ],
+ "user-tag": "jkl",
"uuid": "861056a6-8e5d-11e8-9be5-ed1e39a22969",
+ "ve": 110,
"vlan-num": 110
}
}
changed: [10.255.211.25]
PLAY RECAP *************************************************************************************************
10.255.211.25 : ok=1 changed=1 unreachable=0 failed=0
Thank you

Mais conteúdo relacionado

Mais procurados

PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)NTT DATA Technology & Innovation
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Etsuji Nakai
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門Akihiro Kuwano
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021Preferred Networks
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかShogo Wakayama
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所Toru Makabe
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜Preferred Networks
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化Kumazaki Hiroki
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...NTT DATA Technology & Innovation
 

Mais procurados (20)

PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門インフラエンジニアのためのcassandra入門
インフラエンジニアのためのcassandra入門
 
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
PFNのML/DL基盤を支えるKubernetesにおける自動化 / DevOpsDays Tokyo 2021
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
MLOps入門
MLOps入門MLOps入門
MLOps入門
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
自宅k8s/vSphere入門
自宅k8s/vSphere入門自宅k8s/vSphere入門
自宅k8s/vSphere入門
 
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
 
[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門[GKE & Spanner 勉強会] GKE 入門
[GKE & Spanner 勉強会] GKE 入門
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
 

Semelhante a How to write Ansible modules for A10 Thunder - A10 Networks' presentation at Ansible Night in Osaka on 28th Nov. 2018

OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)VirtualTech Japan Inc.
 
Ansible AWXを導入してみた
Ansible AWXを導入してみたAnsible AWXを導入してみた
Ansible AWXを導入してみたsugoto
 
MySQL 開発最新動向
MySQL 開発最新動向MySQL 開発最新動向
MySQL 開発最新動向yoyamasaki
 
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~MakotoItoh
 
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)uchan_nos
 
JAWS-UG京王線#1業務で使うAWSCLI
JAWS-UG京王線#1業務で使うAWSCLIJAWS-UG京王線#1業務で使うAWSCLI
JAWS-UG京王線#1業務で使うAWSCLITomoaki Imai
 
Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版貴志 上坂
 
Serverless AWS構成でセキュアなSPAを目指す
Serverless AWS構成でセキュアなSPAを目指すServerless AWS構成でセキュアなSPAを目指す
Serverless AWS構成でセキュアなSPAを目指すMasayuki Kato
 
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonightAmazon Web Services Japan
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]David Buck
 
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonightAmazon Web Services Japan
 
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...Insight Technology, Inc.
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト健一 辰濱
 
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DeNA
 
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナー
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナーサーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナー
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナーSPIRAL Inc.
 
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)Satoshi Konno
 
Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13OWL.learn
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)TIS Inc.
 
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonightAmazon Web Services Japan
 

Semelhante a How to write Ansible modules for A10 Thunder - A10 Networks' presentation at Ansible Night in Osaka on 28th Nov. 2018 (20)

OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
 
Ansible AWXを導入してみた
Ansible AWXを導入してみたAnsible AWXを導入してみた
Ansible AWXを導入してみた
 
MySQL 開発最新動向
MySQL 開発最新動向MySQL 開発最新動向
MySQL 開発最新動向
 
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
ここが変わる!Unity 5のスマホ開発  ~アセットバンドル、ビルド、プラグイン~
 
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
業務時間で書いたパッチは誰のもの?OSS活動にまつわる罠 (builderscon tokyo 2018)
 
JAWS-UG京王線#1業務で使うAWSCLI
JAWS-UG京王線#1業務で使うAWSCLIJAWS-UG京王線#1業務で使うAWSCLI
JAWS-UG京王線#1業務で使うAWSCLI
 
Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版Azure Api Management 俺的マニュアル 2020年3月版
Azure Api Management 俺的マニュアル 2020年3月版
 
Ansible night
Ansible nightAnsible night
Ansible night
 
Serverless AWS構成でセキュアなSPAを目指す
Serverless AWS構成でセキュアなSPAを目指すServerless AWS構成でセキュアなSPAを目指す
Serverless AWS構成でセキュアなSPAを目指す
 
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight
[CTO Night & Day 2019] AWS Amplify で Web/Mobile 爆速スケーラブル Serverless 開発 #ctonight
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight
[CTO Night & Day 2019] CTO のためのセキュリティ for Seed ~ Mid Stage #ctonight
 
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
[db tech showcase Tokyo 2015] D23:MySQLはドキュメントデータベースになり、HTTPもしゃべる - MySQL Lab...
 
Device Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テストDevice Farm を使ったスマホアプリの自動テスト
Device Farm を使ったスマホアプリの自動テスト
 
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜DRIVE CHARTの裏側  〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
DRIVE CHARTの裏側 〜 AI ☓ IoT ☓ ビッグデータを 支えるアーキテクチャ 〜
 
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナー
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナーサーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナー
サーバ構築不要!HTML5で始めるAndroid&iOSアプリ開発セミナー
 
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
OpenStack Days Tokyo 2014のプレゼンテーション資料(モーフ・ラボ & アセアン・ラボ)
 
Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13Webディレクター・マーケターのためのSQL教室 2015/07/13
Webディレクター・マーケターのためのSQL教室 2015/07/13
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
 
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight
[CTO Night & Day 2019] よくある課題を一気に解説!御社の技術レベルがアップする 2019 秋期講習 #ctonight
 

How to write Ansible modules for A10 Thunder - A10 Networks' presentation at Ansible Night in Osaka on 28th Nov. 2018

  • 1. Reliable Security Always™ CONFIDENTIAL | DO NOT DISTRIBUTE A10ネットワークス株式会社 ソリューションアーキテクト 石塚健太郎 Ansible Night in Osaka 2018年11月28日 A10 Thunder用の Ansibleモジュールの書きかた
  • 2. CONFIDENTIAL | DO NOT DISTRIBUTE2. A10 Networksご存知ですか? A10 Networks, Inc. (NYSE: ATEN) • 設立:2004年9月 • 代表者:Lee Chen (CEO and Founder) • 本社所在地:米国カリフォルニア州サンノゼ A10ネットワークス株式会社 • 設立:2009年4月 • 代表者:川口 亨 (日本法 人代 表 兼 社 ⾧ 米国 本社ヴ ァイ スプ レ ジ デ ント 兼務 ) • 拠点:東京本社(六本木)、大阪支店(梅田) シリコンバレー発 グローバル企業 900+(日本: 60+) 従業員数 27 拠点のある国 6,200+ 導入社数 80+ 製品・サポート提供先の国 世界のリーダー企業で採用 安定した成⾧ $142M $180M $196M $227M $230M 2013 2014 2015 2016 2017
  • 3. CONFIDENTIAL | DO NOT DISTRIBUTE3. A10 Thunderシリーズ(主力製品) サーバー負荷分散 豊富なネットワーク/セキュリティ機能を1ボックスで提供 サイト間冗⾧ WAF 認証プロキシ IPv4枯渇対策 IPv4/IPv6変換 回線負荷分散 SSL高速化 SSL通信可視化 DDoS防御 クラウドプロキシ VxLAN/NVGRE GW コンパクトでハイパフォーマンス データセンターFW Gi/SGi FW URLフィルタリング
  • 4. CONFIDENTIAL | DO NOT DISTRIBUTE4. 機能別の製品群 セキュリティ DDoS防御 (Thunder TPS) TLS通信の可視化 (Thunder SSLi) 集約型FW (Thunder CFW) トラフィック制御 (Thunder ADC, Lightning ADC) キャリアグレードNAT (Thunder CGN) アプリケーション配信 aGalaxy (TPSの管理) Harmony Controller (マルチクラウド, マルチサービスのトラフィック可視化と管理)
  • 5. CONFIDENTIAL | DO NOT DISTRIBUTE5. 柔軟な選択:フォームファクタ 仮想 ベアメタル コンテナ クラウド アプライアンス 独立した インスタンス 最適な パフォーマンス クラウド ネイティブ クラウド インスタンス ハイパフォーマンス オープンなREST API (aXAPI)
  • 6. CONFIDENTIAL | DO NOT DISTRIBUTE6. aXPIとは? • Thunderの情報取得・設定変更を行うためのREST API • CLIで設定できる項目は、ほぼaXAPIでも設定可能 • 現状主に2つのバージョンがある • v2.1:ACOS 2.7.2系 • v3.0:ACOS 4.x系
  • 7. CONFIDENTIAL | DO NOT DISTRIBUTE7. aXPIの流れ ログオン 情報取得/設定追加 メモリ保存 ログオフ
  • 8. CONFIDENTIAL | DO NOT DISTRIBUTE8. ログオン curl –X POST –k https://10.255.250.105/axapi/v3/auth -H "Content-Type:application/json" -d '{ "credentials": { "username": "admin", "password": "a10“ } }‘ { "authresponse" : { "signature":"6141de07ade039e1ef6010a6297c18", "description":"the signature should be set in Authorization header for following request." } } 【リクエスト】 【レスポンス】 認証情報を用いて mgmtポートにログオン 得られたsignature情報を 今後のリクエストで利用
  • 9. CONFIDENTIAL | DO NOT DISTRIBUTE9. 設定情報取得 curl -k https://10.255.250.105/axapi/v3/slb -H "Content-Type:application/json" -H "Authorization: A10 6141de07ade039e1ef6010a6297c18" { "slb": { "common": { "extended-stats":0, "stats-data-disable":0, "graceful-shutdown-enable":0, … "a10-url":"/axapi/v3/slb/service-group/sg80" } … 【リクエスト】 【レスポンス】 ログオン時に得られたsignatureを ヘッダに入れてリクエストを送信 リクエストに応じた 設定情報の一覧を取得 設定値されているオブジェクトの 固有のURIも得られる
  • 10. CONFIDENTIAL | DO NOT DISTRIBUTE10. 設定追加 curl -X POST -k https://10.255.250.105/axapi/v3/slb/server -H "Content-Type:application/json“ -H "Authorization: A10 6141de07ade039e1ef6010a6297c18“ -d '{"server-list":[{"name":"svr3","host":"192.168.1.3"}]}' { "server": { "name":"svr3", "host":"192.168.1.3", "action":"enable", … "extended-stats":0, "uuid":"432b96fc-c3b5-11e7-a858-000c29395c26" } } 【リクエスト】 【レスポンス】 設定を追加する属性にPOST 追加したオブジェクトの 情報が返る 追加するオブジェクトをJSONで記述
  • 11. CONFIDENTIAL | DO NOT DISTRIBUTE11. 設定削除 curl -X DELETE -k https://10.255.250.105/axapi/v3/slb/server/svr3 -H "Content-Type:application/json“ -H "Authorization: A10 6141de07ade039e1ef6010a6297c18“ { "response": { "status": "OK" } } 【リクエスト】 【レスポンス】 DELETEで削除するオブジェクトを指定 成功すれば“OK”が返る curl -X DELETE -k https://10.255.250.105/axapi/v3/uuid/52f7e62a-c3b6-11e7-a858- 000c29395c26 -H "Content-Type:application/json“ -H "Authorization: A10 6141de07ade039e1ef6010a6297c18“ 【UUIDを指定する場合のリクエスト】 オブジェクトの UUIDを指定して 削除することも可能
  • 12. CONFIDENTIAL | DO NOT DISTRIBUTE12. メモリ保存 curl -k -X POST https://10.255.250.105/axapi/v3/write/memory -H “Content-Type:application/json" -H "Authorization: A10 6141de07ade039e1ef6010a6297c18" { "response": { "status": "OK" } } 【リクエスト】 【レスポンス】 POSTで/write/memoryを指定 成功すれば“OK”が返る
  • 13. CONFIDENTIAL | DO NOT DISTRIBUTE13. ログオフ curl -X POST -k https://10.255.250.105/axapi/v3/logoff -H "Content-Type:application/json" -H "Authorization: A10 6141de07ade039e1ef6010a6297c18" { "response": { "status": "OK" } } 【リクエスト】 【レスポンス】 logoffを指定してPOST 成功すれば“OK”が返り、 signatureが再利用できなくなる
  • 14. CONFIDENTIAL | DO NOT DISTRIBUTE14. AnsibleによるThunderの構成管理 • AnsibleによるThunderの構成管理方法 • 方法①:a10_*モジュールを利用してPlaybookを記述 • 方法②:uriモジュールを利用したPlaybook内でaXAPIを実行 構成管理 モジュール Playbook 管理者
  • 15. CONFIDENTIAL | DO NOT DISTRIBUTE15. a10_*モジュールを利用した場合の基本動作 • A10上にPython実行環境が無い(と考えた方が分かりやすい)ため、 実質上はAnsible Coreの動作しているサーバーから Thunderに対しaXAPIで操作を実行する • Playbook上では処理対象を分かりやすくするために ThunderのホストIPを指定すると良い • connection: localを指定し、ローカルで処理を実行する aXAPI モジュール Playbook 管理者
  • 16. CONFIDENTIAL | DO NOT DISTRIBUTE16. A10のAnsibleモジュール • 公式のGitHubでベータバージョンを公開中 https://github.com/a10networks/a10-ansible • 1,453のモジュール • 2,568のPlaybook例 • 利用時の注意点 • PythonのRequestsモジュールが必要 • モジュール内の一部を改修する必要がある場合がある • 上記モジュールはaXAPIv3対象(ACOS4.x以降) • 冪等性の担保は一部のみ/Dry Run未対応/PartitionやaVCSに未対応 • 自動ではwrite memoryされない
  • 17. CONFIDENTIAL | DO NOT DISTRIBUTE17. でもこうありたい • 冪等性は確保したい • Listで渡す情報をちゃんと処理したい • Dry Runに対応したい • Partition(仮想分割)やaVCS(仮想シャーシ)に対応したい • 同一モジュールで異なるaXAPIバージョンを扱いたい • Write memoryするかどうかは指定できるようにしたい
  • 18. CONFIDENTIAL | DO NOT DISTRIBUTE18. モジュールを書くには? • まずこの辺りのモジュールをimport from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.urls import url_argument_spec, fetch_url from ansible.module_utils.a10 import axapi_call_v3, axapi_call, axapi_authenticate_v3, axapi_authenticate, axapi_failure 基本的には、 • AnsibleModule • axapi_call_v3, axapi_call • axapi_authenticate_v3, axapi_authenticate • axapi_failure を使う
  • 19. CONFIDENTIAL | DO NOT DISTRIBUTE19. 基本プロセス def main(): module = AnsibleModule( argument_spec=get_argspec(), supports_check_mode=True, mutually_exclusive=MUTUALLY_EXCLUSIVE_SET ) if module.check_mode: result = dry_run_command(module) else: result = run_command(module) module.exit_json(**result) MUTUALLY_EXCLUSIVE_SET = [['tagged_eth_list','tagged_trunk_list','untagged_eth_list','untagged_ trunk_list','untagged_lif']] Dry run対応
  • 20. CONFIDENTIAL | DO NOT DISTRIBUTE20. Playbookからの引数読み込み(VLAN設定の例) def get_argspec(): rv = get_default_argspec() rv.update( dict( name=dict(type='str', required=False), user_tag=dict(type='str', required=False), vlan_num=dict(type='int', required=False), ve=dict(type='int', required=False), tagged_eth_list=dict(type='list', required=False), untagged_eth_list=dict(type='list', required=False), … untagged_lif=dict(type='int', required=False) ) ) return rv 共通部分の設定読み込み
  • 21. CONFIDENTIAL | DO NOT DISTRIBUTE21. 共通で利用する引数の読み込み def get_default_argspec(): rv = dict( a10_host=dict(type='str', required=True), a10_username=dict(type='str', required=True), a10_password=dict(type='str', required=True, no_log=True), axapi_version=dict(type='str', required=False, default='3', choises=['2.1','3']), partition=dict(type='str', required=False, default='shared'), device=dict(type='str', required=False), write_config=dict(type='bool', required=False, default='yes', choises=['yes','no']), state=dict(type='str', required=True, choises=['present','absent','current','statistics','operational']) ) rv.update(url_argument_spec()) return rv
  • 22. CONFIDENTIAL | DO NOT DISTRIBUTE22. Playbookでの共通設定項目 • a10_host:対象となるThunder/vThunderのmgmtポートアドレス • a10_username:対象デバイスの管理ユーザーアカウント • a10_password:管理ユーザーのパスワード • validate_certs:aXAPIのポートの証明書の有効性検証をするか否か(yes or no) • axapi_version:aXAPIのバージョン(2.1または3) • write_config:設定後コンフィグを保存するか否か(yes or no) • partition:設定対象となるパーティション(ADP)の指定 • state:present(存在)、absent(不在) • device:aVCSのdevice ID(device-context)
  • 23. CONFIDENTIAL | DO NOT DISTRIBUTE23. コマンド実行プロセス def run_command(module): … signature = axapi_open_session(module) … if module.params['partition']: change_partition(module, signature) if module.params['device']: change_device_context(module, signature) if module.params['state'] == 'present': result = present(module, signature, result) elif module.params['state'] == 'absent': result = absent(module, signature, result) … if write_config: write_memory(module, signature) axapi_close_session(module, signature) return result aXAPIのシグネチャ取得 パーティションの移動 aVCSのデバイスの移動 設定の追加・削除 メモリ保存 aXAPIのログオフ
  • 24. CONFIDENTIAL | DO NOT DISTRIBUTE24. シグネチャの取得 def axapi_open_session(module): if module.params['axapi_version'] == '3': axapi_auth_url = 'https://{}/axapi/v3/auth/'.format(module.params['a10_host']) rv = axapi_authenticate_v3(module, axapi_auth_url, module.params['a10_username'], module.params['a10_password']) elif module.params['axapi_version'] == '2.1': axapi_auth_url = 'https://{}/services/rest/V2.1/'.format(module.params['a10_host']) rv = axapi_authenticate(module, axapi_auth_url, module.params['a10_username'], module.params['a10_password']) if axapi_failure(rv): module.fail_json(msg="Failed to open aXAPI session") return rv aXAPIv3での シグネチャ取得 aXAPIv2.1での シグネチャ取得
  • 25. CONFIDENTIAL | DO NOT DISTRIBUTE25. パーティションの移動 def change_partition(module, signature): if module.params['axapi_version'] == '3': axapi_base_url = 'https://{}/axapi/v3/'.format(module.params['a10_host']) result = axapi_call_v3(module, axapi_base_url+'active- partition/'+module.params['partition'], method='POST', body='', signature=signature) … if axapi_failure(result) axapi_close_session(module, signature) module.fail_json(msg="Failed to change partition.") パーティション移動するコマンドの実行
  • 26. CONFIDENTIAL | DO NOT DISTRIBUTE26. aVCSのデバイスの移動 def change_device_context(module, signature): if module.params['axapi_version'] == '3': json_post = {"device-context": {"device-id": module.params['device']}} axapi_base_url = 'https://{}/axapi/v3/'.format(module.params['a10_host']) headers = {'content-type': 'application/json', 'Authorization': 'A10 %s' % signature} rsp, info = fetch_url(module, axapi_base_url+'device-context', method='POST', data=json.dumps(json_post), headers=headers) if not rsp or info['status'] >= 400: module.fail_json(msg="failed to connect (status code %s), error was %s" % (info['status'], info.get('msg', 'no error given'))) rsp.close() 返り値が無いコマンドではaxapi_call()が動かないので個別処理
  • 27. CONFIDENTIAL | DO NOT DISTRIBUTE27. 設定の変更(VLAN設定の場合) def present(module, signature, result): differences, config_before, json_post = diff_config(module, signature, result, status='present’) … if differences == 1: axapi_base_url = 'https://{}/axapi/v3/'.format(host) result_list = axapi_call_v3(module, axapi_base_url+'network/vlan/', method='POST', body=json.dumps(json_post), signature=signature) if axapi_failure(result_list): axapi_close_session(module, signature) module.fail_json(msg="Failed to create VLAN.") else: result["changed"] = True … return result 既存の構成とPlaybookの構成を比較するモジュール JSON間に差異があれば、 Playbookの内容を反映して POST
  • 28. CONFIDENTIAL | DO NOT DISTRIBUTE28. メモリ保存 def write_memory(module, signature): if module.params['a10_host'] == '3': axapi_base_url = 'https://{}/axapi/v3/'.format(module.params['a10_host']) result = axapi_call_v3(module, axapi_base_url+'write/memory/', method='POST', body='', signature=signature) if axapi_failure(result): axapi_close_session(module, signature) module.fail_json(msg="Failed to write config.")
  • 29. CONFIDENTIAL | DO NOT DISTRIBUTE29. aXAPIのログオフ def axapi_close_session(module, signature): if module.params['axapi_version'] == '3': axapi_logoff_url = 'https://{}/axapi/v3/logoff/'.format(module.params['a10_host']) result = axapi_call_v3(module, axapi_logoff_url, method='POST', body='', signature=signature) elif module.params['axapi_version'] == '2.1': axapi_logoff_url = signature + '&method=session.close' result = axapi_call(module, axapi_logoff_url) if axapi_failure(result): module.fail_json(msg="Failed to close aXAPI session.")
  • 30. CONFIDENTIAL | DO NOT DISTRIBUTE30. Dry runの場合 def dry_run_command(module): … differences, config_before, json_post = diff_config(module, signature, result, status=state) … result['diff']['before'] = config_before … if state == 'present’: … result['changed'] = True result['diff']['after'] = json_post … return result Playbook実行前後の JSONの差異を [‘diff’][‘before’] [‘diff’][‘after’] に入れておく
  • 31. CONFIDENTIAL | DO NOT DISTRIBUTE31. Playbookの記述例 --- - hosts: 10.255.211.25 connection: local gather_facts: no tasks: - name: Set GSLB site a10_gslb_site: a10_host: 10.255.211.25 a10_username: admin a10_password: a10 validate_certs: no axapi_version: 3 partition: test device: 1 write_config: yes state: present site_name: local active_rdt: limit: 16300 ignore-count: 6 multiple_geo_locations: - geo-location: US - geo-location: JP slb_dev_list: - device-name: A1 ip-address: 1.0.0.1 vip-server: vip-server-name-list: - vip-name: VIP-HTTP - device-name: A3 ip-address: 1.0.0.3 vip-server: vip-server-name-list: - vip-name: VIP-HTTP3 register: test_reg - name: show JSON debug: msg="{{ test_reg }}" 対象ホストの指定、connection: local指定によるローカルでの実行指定、 事前の情報取得はできないのでgather-facts: noに 利用モジュールの指定(この例ではa10_gslb_siteモジュール) 全モジュール共通の設定項目 Key-value型の項目設定 dict型の項目設定 list型の項目設定 階層的なlist型-dict型の項目設定 (必要に応じ)返り値の表示
  • 32. CONFIDENTIAL | DO NOT DISTRIBUTE32. 冪等性の確保 # ansible-playbook test_network_vlan.yml -i hosts PLAY [10.255.211.25] *************************************************************************************** TASK [Set VLAN] ******************************************************************************************** changed: [10.255.211.25] PLAY RECAP ************************************************************************************************* 10.255.211.25 : ok=1 changed=1 unreachable=0 failed=0 # ansible-playbook test_network_vlan.yml -i hosts PLAY [10.255.211.25] *************************************************************************************** TASK [Set VLAN] ******************************************************************************************** ok: [10.255.211.25] PLAY RECAP ************************************************************************************************* 10.255.211.25 : ok=1 changed=0 unreachable=0 failed=0
  • 33. CONFIDENTIAL | DO NOT DISTRIBUTE33. Dry run(checkモード)とdiffへの対応 # ansible-playbook test_network_vlan.yml -i hosts --check --diff PLAY [10.255.211.25] *************************************************************************************** TASK [Set VLAN] ******************************************************************************************** --- before +++ after @@ -1,7 +1,16 @@ { "vlan": { "a10-url": "/axapi/v3/network/vlan/110", + "name": "testnamex", + "untagged-eth-list": [ + { + "untagged-ethernet-end": 7, + "untagged-ethernet-start": 7 + } + ], + "user-tag": "jkl", "uuid": "861056a6-8e5d-11e8-9be5-ed1e39a22969", + "ve": 110, "vlan-num": 110 } } changed: [10.255.211.25] PLAY RECAP ************************************************************************************************* 10.255.211.25 : ok=1 changed=1 unreachable=0 failed=0