From a8be2c6e43c5229fff1551bb7ee8a96b362f352d Mon Sep 17 00:00:00 2001 From: Javier Pena Date: Wed, 18 Oct 2017 15:06:26 +0200 Subject: [PATCH] Fix for Ansible >= 2.4.0 The Ansible version was capped to < 2.4.0 in [1], since 2.4.0 refactored the Inventory and VariableManager modules. This patch aims at adding support for Ansible >= 2.4.0, while keeping compatibility with earlier versions. Change-Id: I5722fc8531671e69abe90d64a4bfd988321850b5 Closes-Bug: #1724227 --- os_faults/ansible/executor.py | 35 ++++++++++++++----- os_faults/tests/unit/ansible/test_executor.py | 14 ++++---- requirements.txt | 2 +- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/os_faults/ansible/executor.py b/os_faults/ansible/executor.py index eef3a22..a300c07 100644 --- a/os_faults/ansible/executor.py +++ b/os_faults/ansible/executor.py @@ -17,11 +17,19 @@ import logging import os from ansible.executor import task_queue_manager -from ansible import inventory from ansible.parsing import dataloader from ansible.playbook import play from ansible.plugins import callback as callback_pkg -from ansible.vars import VariableManager + +try: + from ansible.inventory.manager import InventoryManager as Inventory + from ansible.vars.manager import VariableManager + PRE_24_ANSIBLE = False +except ImportError: + # pre-2.4 Ansible + from ansible.inventory import Inventory + from ansible.vars import VariableManager + PRE_24_ANSIBLE = True from os_faults.api import error @@ -119,7 +127,7 @@ Options = collections.namedtuple( 'remote_user', 'private_key_file', 'ssh_common_args', 'ssh_extra_args', 'sftp_extra_args', 'scp_extra_args', 'become', 'become_method', - 'become_user', 'verbosity', 'check']) + 'become_user', 'verbosity', 'check', 'diff']) class AnsibleRunner(object): @@ -144,7 +152,7 @@ class AnsibleRunner(object): ssh_common_args=ssh_common_args, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=become, become_method='sudo', become_user='root', - verbosity=100, check=False) + verbosity=100, check=False, diff=None) self.serial = serial or 10 @staticmethod @@ -159,11 +167,20 @@ class AnsibleRunner(object): host_list = play_source['hosts'] loader = dataloader.DataLoader() - variable_manager = VariableManager() - inventory_inst = inventory.Inventory(loader=loader, - variable_manager=variable_manager, - host_list=host_list) - variable_manager.set_inventory(inventory_inst) + + # FIXME(jpena): we need to behave differently if we are using + # Ansible >= 2.4.0.0. Remove when only versions > 2.4 are supported + if PRE_24_ANSIBLE: + variable_manager = VariableManager() + inventory_inst = Inventory(loader=loader, + variable_manager=variable_manager, + host_list=host_list) + variable_manager.set_inventory(inventory_inst) + else: + inventory_inst = Inventory(loader=loader, + sources=','.join(host_list) + ',') + variable_manager = VariableManager(loader=loader, + inventory=inventory_inst) for host, variables in host_vars.items(): host_inst = inventory_inst.get_host(host) diff --git a/os_faults/tests/unit/ansible/test_executor.py b/os_faults/tests/unit/ansible/test_executor.py index 1c6071e..847fa17 100644 --- a/os_faults/tests/unit/ansible/test_executor.py +++ b/os_faults/tests/unit/ansible/test_executor.py @@ -119,7 +119,7 @@ class AnsibleRunnerTestCase(test.TestCase): @ddt.data(( {}, dict(become=None, become_method='sudo', become_user='root', - check=False, connection='smart', forks=100, + check=False, connection='smart', diff=None, forks=100, private_key_file=None, remote_user='root', scp_extra_args=None, sftp_extra_args=None, ssh_common_args=executor.SSH_COMMON_ARGS, @@ -128,7 +128,7 @@ class AnsibleRunnerTestCase(test.TestCase): ), ( dict(remote_user='root', password='foobar'), dict(become=None, become_method='sudo', become_user='root', - check=False, connection='smart', forks=100, + check=False, connection='smart', diff=None, forks=100, private_key_file=None, remote_user='root', scp_extra_args=None, sftp_extra_args=None, ssh_common_args=executor.SSH_COMMON_ARGS, @@ -137,7 +137,7 @@ class AnsibleRunnerTestCase(test.TestCase): ), ( dict(remote_user='root', password='foobar', become_password='secret'), dict(become=None, become_method='sudo', become_user='root', - check=False, connection='smart', forks=100, + check=False, connection='smart', diff=None, forks=100, private_key_file=None, remote_user='root', scp_extra_args=None, sftp_extra_args=None, ssh_common_args=executor.SSH_COMMON_ARGS, @@ -147,7 +147,7 @@ class AnsibleRunnerTestCase(test.TestCase): dict(remote_user='root', jump_host='jhost.com', private_key_file='/path/my.key'), dict(become=None, become_method='sudo', become_user='root', - check=False, connection='smart', forks=100, + check=False, connection='smart', diff=None, forks=100, private_key_file='/path/my.key', remote_user='root', scp_extra_args=None, sftp_extra_args=None, ssh_common_args=('-o UserKnownHostsFile=/dev/null ' @@ -166,7 +166,7 @@ class AnsibleRunnerTestCase(test.TestCase): dict(remote_user='root', jump_host='jhost.com', jump_user='juser', private_key_file='/path/my.key'), dict(become=None, become_method='sudo', become_user='root', - check=False, connection='smart', forks=100, + check=False, connection='smart', diff=None, forks=100, private_key_file='/path/my.key', remote_user='root', scp_extra_args=None, sftp_extra_args=None, ssh_common_args=('-o UserKnownHostsFile=/dev/null ' @@ -194,7 +194,7 @@ class AnsibleRunnerTestCase(test.TestCase): @mock.patch.object(executor.task_queue_manager, 'TaskQueueManager') @mock.patch('ansible.playbook.play.Play.load') - @mock.patch('ansible.inventory.Inventory') + @mock.patch('os_faults.ansible.executor.Inventory') @mock.patch('os_faults.ansible.executor.VariableManager') @mock.patch('ansible.parsing.dataloader.DataLoader') def test__run_play(self, mock_dataloader, mock_vmanager, mock_inventory, @@ -227,7 +227,7 @@ class AnsibleRunnerTestCase(test.TestCase): @mock.patch.object(executor.task_queue_manager, 'TaskQueueManager') @mock.patch('ansible.playbook.play.Play.load') - @mock.patch('ansible.inventory.Inventory') + @mock.patch('os_faults.ansible.executor.Inventory') @mock.patch('os_faults.ansible.executor.VariableManager') @mock.patch('ansible.parsing.dataloader.DataLoader') def test__run_play_no_host_vars( diff --git a/requirements.txt b/requirements.txt index c8d1670..4eabf94 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ pbr>=2.0.0 # Apache-2.0 -ansible>=2.2,<2.4.0 +ansible>=2.2 appdirs>=1.3.0 # MIT License click>=6.7 # BSD iso8601>=0.1.11 # MIT