使用 Softlayer 取消防火墙 API
Canceling A firewall with Softlayer API
我正在尝试使用 Python API FirewallManager class 的 cancel_firewall() 函数来取消帐户中的所有防火墙。
# Connect to soflayer account
client = SoftLayer.create_client_from_env(username=user, api_key=api)
firewall_manager = SoftLayer.FirewallManager(client=client)
# Get a list of all of the firewalls in an account
firewalls = firewall_manager.get_firewalls()
# Cancel each firewall
for firewall in firewalls:
dedicated = bool(firewall["dedicatedFirewallFlag"])
firewall_manager.cancel_firewall(firewall_id=firewall["id"], dedicated=dedicated )
但是当我 运行 这段代码时,我得到了错误:
SoftLayerAPIError(SoftLayer_Exception_ObjectNotFound): Unable to find object with id of '284501'.
取消代码说它需要 "firewall_id" 但我给它的 ID 似乎不起作用....管理器的源代码是 here
正如我在您的代码中看到的,您正在将 防火墙 ['id'] 发送到 cancel_firewall方法。
查看 SLCLI 的工作原理,它根据防火墙类型是 vlan、vs 还是服务器 进行过滤。按照同样的想法,您应该考虑以下 link:
中的现有过滤器
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
例如:
- VSI: firewall['id'] == vlan['firewallGuestNetworkComponents']*
- Server: firewall['id'] == vlan['firewallNetworkComponents']
- Vlan: firewall['id'] == vlan['networkVlanFirewall']['id']
好吧,理解它是如何工作的是一件乏味的事情,无论如何,我使用了波纹管脚本,它使用 FirewallManager 删除所有防火墙:
"""
cancels all firewall from the account
Important manual pages:
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/managers/firewall.py
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/cancel.py
License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""
import SoftLayer
from SoftLayer.CLI import formatting
# Your SoftLayer username and apiKey
user = 'set me'
api = 'set me'
# Connect to SoftLayer
client = SoftLayer.create_client_from_env(username=user, api_key=api)
# Declare Firewall Manager
firewall_manager = SoftLayer.FirewallManager(client=client)
# Getting firewalls from the account
fwvlans = firewall_manager.get_firewalls()
# Getting Dedicated firewalls
dedicated_firewalls = [firewall for firewall in fwvlans if firewall['dedicatedFirewallFlag']]
# Define a Vlans array to store vlans
vlans = []
# Method from:
# https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
def has_firewall_component(server):
"""Helper to determine whether or not a server has a firewall.
:param dict server: A dictionary representing a server
:returns: True if the Server has a firewall.
"""
if server['status'] != 'no_edit':
return True
return False
for vlan in dedicated_firewalls:
features = []
if vlan['highAvailabilityFirewallFlag']:
features.append('HA')
if features:
feature_list = formatting.listing(features, separator=',')
else:
feature_list = formatting.blank()
vlans.append('vlan:%s' % vlan['networkVlanFirewall']['id'])
shared_vlan = [firewall for firewall in fwvlans
if not firewall['dedicatedFirewallFlag']]
for vlan in shared_vlan:
vs_firewalls = [guest
for guest in vlan['firewallGuestNetworkComponents']
if has_firewall_component(guest)]
for firewall in vs_firewalls:
vlans.append('vs:%s' % firewall['id'])
server_firewalls = [server
for server in vlan['firewallNetworkComponents']
if has_firewall_component(server)]
for firewall in server_firewalls:
vlans.append('server:%s' % firewall['id'])
# Methods from:
# https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/cancel.py
for item in vlans:
firewall_type, firewall_id = item.split(':')
if firewall_type in ['vs', 'server']:
print(firewall_manager.cancel_firewall(firewall_id, dedicated=False))
elif firewall_type == 'vlan':
print(firewall_manager.cancel_firewall(firewall_id, dedicated=True))
else:
raise exceptions.CLIAbort('Unknown firewall type: %s' % firewall_type)
希望对您有所帮助,如果您对此有任何疑问或意见,请告诉我。请记住,脚本只是一个想法,可以改进。
我正在尝试使用 Python API FirewallManager class 的 cancel_firewall() 函数来取消帐户中的所有防火墙。
# Connect to soflayer account
client = SoftLayer.create_client_from_env(username=user, api_key=api)
firewall_manager = SoftLayer.FirewallManager(client=client)
# Get a list of all of the firewalls in an account
firewalls = firewall_manager.get_firewalls()
# Cancel each firewall
for firewall in firewalls:
dedicated = bool(firewall["dedicatedFirewallFlag"])
firewall_manager.cancel_firewall(firewall_id=firewall["id"], dedicated=dedicated )
但是当我 运行 这段代码时,我得到了错误:
SoftLayerAPIError(SoftLayer_Exception_ObjectNotFound): Unable to find object with id of '284501'.
取消代码说它需要 "firewall_id" 但我给它的 ID 似乎不起作用....管理器的源代码是 here
正如我在您的代码中看到的,您正在将 防火墙 ['id'] 发送到 cancel_firewall方法。
查看 SLCLI 的工作原理,它根据防火墙类型是 vlan、vs 还是服务器 进行过滤。按照同样的想法,您应该考虑以下 link:
中的现有过滤器https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
例如:
- VSI: firewall['id'] == vlan['firewallGuestNetworkComponents']*
- Server: firewall['id'] == vlan['firewallNetworkComponents']
- Vlan: firewall['id'] == vlan['networkVlanFirewall']['id']
好吧,理解它是如何工作的是一件乏味的事情,无论如何,我使用了波纹管脚本,它使用 FirewallManager 删除所有防火墙:
"""
cancels all firewall from the account
Important manual pages:
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/managers/firewall.py
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/cancel.py
License: http://sldn.softlayer.com/article/License
Author: SoftLayer Technologies, Inc. <sldn@softlayer.com>
"""
import SoftLayer
from SoftLayer.CLI import formatting
# Your SoftLayer username and apiKey
user = 'set me'
api = 'set me'
# Connect to SoftLayer
client = SoftLayer.create_client_from_env(username=user, api_key=api)
# Declare Firewall Manager
firewall_manager = SoftLayer.FirewallManager(client=client)
# Getting firewalls from the account
fwvlans = firewall_manager.get_firewalls()
# Getting Dedicated firewalls
dedicated_firewalls = [firewall for firewall in fwvlans if firewall['dedicatedFirewallFlag']]
# Define a Vlans array to store vlans
vlans = []
# Method from:
# https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/list.py
def has_firewall_component(server):
"""Helper to determine whether or not a server has a firewall.
:param dict server: A dictionary representing a server
:returns: True if the Server has a firewall.
"""
if server['status'] != 'no_edit':
return True
return False
for vlan in dedicated_firewalls:
features = []
if vlan['highAvailabilityFirewallFlag']:
features.append('HA')
if features:
feature_list = formatting.listing(features, separator=',')
else:
feature_list = formatting.blank()
vlans.append('vlan:%s' % vlan['networkVlanFirewall']['id'])
shared_vlan = [firewall for firewall in fwvlans
if not firewall['dedicatedFirewallFlag']]
for vlan in shared_vlan:
vs_firewalls = [guest
for guest in vlan['firewallGuestNetworkComponents']
if has_firewall_component(guest)]
for firewall in vs_firewalls:
vlans.append('vs:%s' % firewall['id'])
server_firewalls = [server
for server in vlan['firewallNetworkComponents']
if has_firewall_component(server)]
for firewall in server_firewalls:
vlans.append('server:%s' % firewall['id'])
# Methods from:
# https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/CLI/firewall/cancel.py
for item in vlans:
firewall_type, firewall_id = item.split(':')
if firewall_type in ['vs', 'server']:
print(firewall_manager.cancel_firewall(firewall_id, dedicated=False))
elif firewall_type == 'vlan':
print(firewall_manager.cancel_firewall(firewall_id, dedicated=True))
else:
raise exceptions.CLIAbort('Unknown firewall type: %s' % firewall_type)
希望对您有所帮助,如果您对此有任何疑问或意见,请告诉我。请记住,脚本只是一个想法,可以改进。