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:
parent
7782a03a43
commit
a8be2c6e43
|
@ -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)
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue