From 2b0c71995a56d25cff1b2d5a6ce054a15f2ac970 Mon Sep 17 00:00:00 2001 From: Federico Ressi Date: Tue, 22 Mar 2022 13:25:46 +0100 Subject: [PATCH] Deploy var_files before playing ansible playbooks Change-Id: I2b80ddb373809d8becdfe0c54b691fc71ba1f4fd --- tobiko/shell/ansible/_playbook.py | 61 +++++++++++-------- .../shiftstack/playbooks/debug-vars.yaml | 7 +++ .../shiftstack/playbooks/vars/some-vars.yaml | 4 ++ .../sanity/shiftstack/test_shiftstack.py | 8 ++- tobiko/tripleo/_ansible.py | 7 ++- 5 files changed, 60 insertions(+), 27 deletions(-) create mode 100644 tobiko/tests/sanity/shiftstack/playbooks/debug-vars.yaml create mode 100644 tobiko/tests/sanity/shiftstack/playbooks/vars/some-vars.yaml diff --git a/tobiko/shell/ansible/_playbook.py b/tobiko/shell/ansible/_playbook.py index 4eda377c9..9383bc76a 100644 --- a/tobiko/shell/ansible/_playbook.py +++ b/tobiko/shell/ansible/_playbook.py @@ -76,24 +76,30 @@ class AnsiblePlaybook(tobiko.SharedFixture): return None return self._ensure_work_file(inventory_filename, 'inventory') - def _ensure_playbook_filename(self, - playbook: str = None, - playbook_dirname: str = None, - playbook_filename: str = None) \ - -> typing.Optional[str]: - if playbook_filename is None: - playbook_filename = self._get_playbook_filename( - playbook=playbook, playbook_dirname=playbook_dirname) - return self._ensure_work_file(playbook_filename) - def _get_playbook_filename(self, - playbook: str = None, - playbook_dirname: str = None) -> str: - if playbook is None: - playbook = self._playbook - if playbook_dirname is None: - playbook_dirname = self.playbook_dirname - return os.path.join(playbook_dirname, playbook + '.yaml') + basename: str = None, + dirname: str = None) -> str: + if basename is None: + basename = self._playbook + if dirname is None: + dirname = self.playbook_dirname + return os.path.join(dirname, basename) + + def _ensure_vars_files(self, + vars_files: typing.Iterable[str], + sub_dir: str = None, + dirname: str = None) -> typing.List[str]: + work_filenames = [] + for vars_file in vars_files: + filename = self._get_playbook_filename(basename=vars_file, + dirname=dirname) + if sub_dir is None and dirname is not None: + sub_dir = os.path.relpath(os.path.dirname(filename), dirname) + + work_filename = self._ensure_work_file(filename=filename, + sub_dir=sub_dir) + work_filenames.append(work_filename) + return work_filenames def _ensure_work_file(self, filename: str, sub_dir: str = None) -> str: filename = os.path.realpath(filename) @@ -123,7 +129,8 @@ class AnsiblePlaybook(tobiko.SharedFixture): playbook: str = None, playbook_dirname: str = None, playbook_filename: str = None, - inventory_filename: str = None) -> \ + inventory_filename: str = None, + vars_files: typing.Iterable[str] = None) -> \ sh.ShellCommand: # ensure command if command is None: @@ -137,11 +144,15 @@ class AnsiblePlaybook(tobiko.SharedFixture): command += ['-i', work_inventory_filename] # ensure playbook file - command += [self._ensure_playbook_filename( - playbook=playbook, - playbook_dirname=playbook_dirname, - playbook_filename=playbook_filename)] + if playbook_filename is None: + playbook_filename = self._get_playbook_filename( + basename=playbook, dirname=playbook_dirname) + playbook_dirname = os.path.dirname(playbook_filename) + command += [self._ensure_work_file(playbook_filename)] + if vars_files is not None: + self._ensure_vars_files(vars_files=vars_files, + dirname=playbook_dirname) return command def run_playbook(self, @@ -149,13 +160,15 @@ class AnsiblePlaybook(tobiko.SharedFixture): playbook: str = None, playbook_dirname: str = None, playbook_filename: str = None, - inventory_filename: str = None): + inventory_filename: str = None, + vars_files: typing.Iterable[str] = None): tobiko.setup_fixture(self) command = self._get_command(command=command, playbook=playbook, playbook_dirname=playbook_dirname, playbook_filename=playbook_filename, - inventory_filename=inventory_filename) + inventory_filename=inventory_filename, + vars_files=vars_files) return self.sh_connection.execute(command, current_dir=self.work_dir) diff --git a/tobiko/tests/sanity/shiftstack/playbooks/debug-vars.yaml b/tobiko/tests/sanity/shiftstack/playbooks/debug-vars.yaml new file mode 100644 index 000000000..ccf44ef4b --- /dev/null +++ b/tobiko/tests/sanity/shiftstack/playbooks/debug-vars.yaml @@ -0,0 +1,7 @@ +--- + +- hosts: localhost + vars_files: vars/some-vars.yaml + tasks: + - debug: var=var1 + - debug: var=var2 diff --git a/tobiko/tests/sanity/shiftstack/playbooks/vars/some-vars.yaml b/tobiko/tests/sanity/shiftstack/playbooks/vars/some-vars.yaml new file mode 100644 index 000000000..5490031a7 --- /dev/null +++ b/tobiko/tests/sanity/shiftstack/playbooks/vars/some-vars.yaml @@ -0,0 +1,4 @@ +--- + +- var1: value1 + var2: value2 diff --git a/tobiko/tests/sanity/shiftstack/test_shiftstack.py b/tobiko/tests/sanity/shiftstack/test_shiftstack.py index f6135529b..e54f10743 100644 --- a/tobiko/tests/sanity/shiftstack/test_shiftstack.py +++ b/tobiko/tests/sanity/shiftstack/test_shiftstack.py @@ -29,5 +29,11 @@ class OpenShiftTest(testtools.TestCase): @tripleo.skip_if_missing_tripleo_ansible_inventory def test_ping_all_hosts(self): tripleo.run_playbook_from_undercloud( - playbook='ping-shiftstack', + playbook='ping-shiftstack.yaml', playbook_dirname=PLAYBOOK_DIRNAME) + + def test_debug_vars(self): + tripleo.run_playbook_from_undercloud( + playbook='debug-vars.yaml', + playbook_dirname=PLAYBOOK_DIRNAME, + vars_files=['vars/some-vars.yaml']) diff --git a/tobiko/tripleo/_ansible.py b/tobiko/tripleo/_ansible.py index f9f06bde7..13693e17f 100644 --- a/tobiko/tripleo/_ansible.py +++ b/tobiko/tripleo/_ansible.py @@ -15,6 +15,7 @@ from __future__ import absolute_import import io import os +import typing import tobiko from tobiko.shell import ansible @@ -104,13 +105,15 @@ def run_playbook_from_undercloud(command: sh.ShellCommand = None, playbook: str = None, playbook_dirname: str = None, playbook_filename: str = None, - inventory_filename: str = None): + inventory_filename: str = None, + vars_files: typing.Iterable[str] = None): return undercloud_ansible_playbook().run_playbook( command=command, playbook=playbook, playbook_dirname=playbook_dirname, playbook_filename=playbook_filename, - inventory_filename=inventory_filename) + inventory_filename=inventory_filename, + vars_files=vars_files) def setup_undercloud_ansible_plabook():