diff --git a/lib/ansible/inventory/ini.py b/lib/ansible/inventory/ini.py index 024eb9a9a0..718fee1338 100644 --- a/lib/ansible/inventory/ini.py +++ b/lib/ansible/inventory/ini.py @@ -123,12 +123,22 @@ class InventoryParser(object): (k,v) = t.split("=", 1) except ValueError, e: raise errors.AnsibleError("Invalid ini entry: %s - %s" % (t, str(e))) - try: - host.set_variable(k,ast.literal_eval(v)) - except: - # most likely a string that literal_eval - # doesn't like, so just set it - host.set_variable(k,v) + + # If there is a hash in the value don't pass it through to ast at ast will split at the hash. + if "#" in v: + host.set_variable(k, v) + else: + try: + host.set_variable(k,ast.literal_eval(v)) + # Using explicit exceptions. + # Likely a string that literal_eval does not like. We wil then just set it. + except ValueError: + # For some reason this was thought to be malformed. + host.set_variable(k, v) + except SyntaxError: + # Is this a hash with an equals at the end? + host.set_variable(k, v) + self.groups[active_group_name].add_host(host) # [southeast:children] diff --git a/test/units/TestInventory.py b/test/units/TestInventory.py index 2ae6256e62..bd2f24c063 100644 --- a/test/units/TestInventory.py +++ b/test/units/TestInventory.py @@ -417,15 +417,17 @@ class TestInventory(unittest.TestCase): auth = inventory.get_variables('neptun')['auth'] assert auth == 'YWRtaW46YWRtaW4=' - # test disabled as needs to be updated to model desired behavior - # - #def test_dir_inventory(self): - # inventory = self.dir_inventory() - # vars = inventory.get_variables('zeus') - # - # print "VARS=%s" % vars - # - # assert vars == {'inventory_hostname': 'zeus', - # 'inventory_hostname_short': 'zeus', - # 'group_names': ['greek', 'major-god', 'ungrouped'], - # 'var_a': '1#2'} + def test_dir_inventory(self): + inventory = self.dir_inventory() + + host_vars = inventory.get_variables('zeus') + + expected_vars = {'inventory_hostname': 'zeus', + 'inventory_hostname_short': 'zeus', + 'group_names': ['greek', 'major-god', 'ungrouped'], + 'var_a': '3#4'} + + print "HOST VARS=%s" % host_vars + print "EXPECTED VARS=%s" % expected_vars + + assert host_vars == expected_vars \ No newline at end of file diff --git a/test/units/inventory_test_data/inventory_dir/0hosts b/test/units/inventory_test_data/inventory_dir/0hosts index 27fc46e853..6f78a33a22 100644 --- a/test/units/inventory_test_data/inventory_dir/0hosts +++ b/test/units/inventory_test_data/inventory_dir/0hosts @@ -1,3 +1,3 @@ -zeus var_a=2 +zeus var_a=0 morpheus thor diff --git a/test/units/inventory_test_data/inventory_dir/2levels b/test/units/inventory_test_data/inventory_dir/2levels index 22f06bcd43..363294923e 100644 --- a/test/units/inventory_test_data/inventory_dir/2levels +++ b/test/units/inventory_test_data/inventory_dir/2levels @@ -1,5 +1,5 @@ [major-god] -zeus var_a=1 +zeus var_a=2 thor [minor-god] diff --git a/test/units/inventory_test_data/inventory_dir/3comments b/test/units/inventory_test_data/inventory_dir/3comments index 74642f13cc..e11b5e416b 100644 --- a/test/units/inventory_test_data/inventory_dir/3comments +++ b/test/units/inventory_test_data/inventory_dir/3comments @@ -1,5 +1,5 @@ [major-god] # group with inline comments -zeus var_a="1#2" # host with inline comments and "#" in the var string +zeus var_a="3\#4" # host with inline comments and "#" in the var string # A comment thor