Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save pa-yourserveradmin-com/f43219827dbabf33f43af2114838ee20 to your computer and use it in GitHub Desktop.
Save pa-yourserveradmin-com/f43219827dbabf33f43af2114838ee20 to your computer and use it in GitHub Desktop.
Patch to Ansible docker_swarm_service module which prevents Ansible from continuous attempts to update Swarm services which use host networks
--- docker_swarm_service.py 2020-08-11 06:22:07.000000000 +0300
+++ docker_swarm_service.py 2020-08-21 00:43:53.113259406 +0300
@@ -1333,7 +1333,7 @@
class DockerService(DockerBaseClass):
- def __init__(self, docker_api_version, docker_py_version):
+ def __init__(self, docker_api_version, docker_py_version, client):
super(DockerService, self).__init__()
self.image = ""
self.command = None
@@ -1389,6 +1389,8 @@
self.docker_api_version = docker_api_version
self.docker_py_version = docker_py_version
+ self.client = client
+
def get_facts(self):
return {
'image': self.image,
@@ -1659,8 +1661,9 @@
network_ids,
docker_api_version,
docker_py_version,
+ client
):
- s = DockerService(docker_api_version, docker_py_version)
+ s = DockerService(docker_api_version, docker_py_version, client)
s.image = image_digest
s.args = ap['args']
s.endpoint_mode = ap['endpoint_mode']
@@ -1842,9 +1845,23 @@
differences.add('configs', parameter=self.configs, active=os.configs)
if has_list_changed(self.secrets, os.secrets, sort_key='secret_name'):
differences.add('secrets', parameter=self.secrets, active=os.secrets)
+
+ for s_n in self.networks:
+ new_network = self.client.get_network(network_id=s_n['id'])
+ if new_network['Driver'] == 'host' and new_network['Scope'] == 'local':
+ for old_network in os.networks:
+ old_network = self.client.get_network(network_id=old_network['id'])
+ if old_network['Name'] == new_network['Name']:
+ if old_network['Driver'] == new_network['Driver'] and old_network['Scope'] == 'swarm':
+ index = self.networks.index(s_n)
+ s_n['id'] = old_network['Id']
+ self.networks[index] = s_n
+ break
+
if have_networks_changed(self.networks, os.networks):
differences.add('networks', parameter=self.networks, active=os.networks)
needs_rebuild = not self.can_update_networks
+
if self.replicas != os.replicas:
differences.add('replicas', parameter=self.replicas, active=os.replicas)
if has_list_changed(self.command, os.command, sort_lists=False):
@@ -2259,7 +2276,7 @@
raw_data = self.client.inspect_service(name)
except NotFound:
return None
- ds = DockerService(self.client.docker_api_version, self.client.docker_py_version)
+ ds = DockerService(self.client.docker_api_version, self.client.docker_py_version, self.client)
task_template_data = raw_data['Spec']['TaskTemplate']
ds.image = task_template_data['ContainerSpec']['Image']
@@ -2573,6 +2590,7 @@
secret_ids = self.get_missing_secret_ids()
config_ids = self.get_missing_config_ids()
network_ids = self.get_networks_names_ids()
+
new_service = DockerService.from_ansible_params(
module.params,
current_service,
@@ -2581,7 +2599,8 @@
config_ids,
network_ids,
self.client.docker_api_version,
- self.client.docker_py_version
+ self.client.docker_py_version,
+ self.client
)
except Exception as e:
return self.client.fail(
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment