149149except ImportError :
150150 import configparser as ConfigParser
151151
152- try :
153- import json
154- except ImportError :
155- import simplejson as json
152+ import json
156153
157154
158155class DoManager :
@@ -224,7 +221,7 @@ def show_droplet(self, droplet_id):
224221 return resp ['droplet' ]
225222
226223 def all_tags (self ):
227- resp = self .send ('tags/ ' )
224+ resp = self .send ('tags' )
228225 return resp ['tags' ]
229226
230227
@@ -323,7 +320,7 @@ def __init__(self):
323320
324321 def read_settings (self ):
325322 """ Reads the settings from the digital_ocean.ini file """
326- config = ConfigParser .SafeConfigParser ()
323+ config = ConfigParser .ConfigParser ()
327324 config_path = os .path .join (os .path .dirname (os .path .realpath (__file__ )), 'digital_ocean.ini' )
328325 config .read (config_path )
329326
@@ -429,6 +426,21 @@ def load_from_digital_ocean(self, resource=None):
429426 self .data ['tags' ] = self .manager .all_tags ()
430427 self .cache_refreshed = True
431428
429+ def add_inventory_group (self , key ):
430+ """ Method to create group dict """
431+ host_dict = {'hosts' : [], 'vars' : {}}
432+ self .inventory [key ] = host_dict
433+ return
434+
435+ def add_host (self , group , host ):
436+ """ Helper method to reduce host duplication """
437+ if group not in self .inventory :
438+ self .add_inventory_group (group )
439+
440+ if host not in self .inventory [group ]['hosts' ]:
441+ self .inventory [group ]['hosts' ].append (host )
442+ return
443+
432444 def build_inventory (self ):
433445 """ Build Ansible inventory of droplets """
434446 self .inventory = {
@@ -449,8 +461,9 @@ def build_inventory(self):
449461
450462 self .inventory ['all' ]['hosts' ].append (dest )
451463
452- self .inventory [droplet ['id' ]] = [dest ]
453- self .inventory [droplet ['name' ]] = [dest ]
464+ self .add_host (droplet ['id' ], dest )
465+
466+ self .add_host (droplet ['name' ], dest )
454467
455468 # groups that are always present
456469 for group in ('digital_ocean' ,
@@ -459,24 +472,18 @@ def build_inventory(self):
459472 'size_' + droplet ['size' ]['slug' ],
460473 'distro_' + DigitalOceanInventory .to_safe (droplet ['image' ]['distribution' ]),
461474 'status_' + droplet ['status' ]):
462- if group not in self .inventory :
463- self .inventory [group ] = {'hosts' : [], 'vars' : {}}
464- self .inventory [group ]['hosts' ].append (dest )
475+ self .add_host (group , dest )
465476
466477 # groups that are not always present
467478 for group in (droplet ['image' ]['slug' ],
468479 droplet ['image' ]['name' ]):
469480 if group :
470481 image = 'image_' + DigitalOceanInventory .to_safe (group )
471- if image not in self .inventory :
472- self .inventory [image ] = {'hosts' : [], 'vars' : {}}
473- self .inventory [image ]['hosts' ].append (dest )
482+ self .add_host (image , dest )
474483
475484 if droplet ['tags' ]:
476485 for tag in droplet ['tags' ]:
477- if tag not in self .inventory :
478- self .inventory [tag ] = {'hosts' : [], 'vars' : {}}
479- self .inventory [tag ]['hosts' ].append (dest )
486+ self .add_host (tag , dest )
480487
481488 # hostvars
482489 info = self .do_namespace (droplet )
@@ -541,4 +548,4 @@ def do_namespace(data):
541548
542549###########################################################################
543550# Run the script
544- DigitalOceanInventory ()
551+ DigitalOceanInventory ()
0 commit comments