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
This commit is contained in:
Javier Pena 2017-10-18 15:06:26 +02:00
parent 7782a03a43
commit a8be2c6e43
3 changed files with 34 additions and 17 deletions

View File

@ -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)

View File

@ -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(

View File

@ -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