Add from_yaml_all to support multi document yaml strings (#43037)

* Support multi-doc yaml in the from_yaml filter

* Most automatic method of handling multidoc

* Only use safe_load_all

* Implement separate filter

* Update plugin docs and changelog
This commit is contained in:
Fabian von Feilitzsch 2018-07-25 16:12:22 -04:00 committed by Sam Doran
parent 19dc267e4c
commit d27de6acd9
3 changed files with 28 additions and 0 deletions

View file

@ -0,0 +1,5 @@
---
minor_changes:
- Added the from_yaml_all filter to parse multi-document yaml strings.
Refer to the appropriate entry which as been added to user_guide
playbooks_filters.rst document.

View file

@ -47,6 +47,22 @@ for example::
- set_fact: - set_fact:
myvar: "{{ result.stdout | from_json }}" myvar: "{{ result.stdout | from_json }}"
.. versionadded:: 2.7
To parse multi-document yaml strings, the ``from_yaml_all`` filter is provided.
The ``from_yaml_all`` filter will return a generator of parsed yaml documents.
for example::
tasks:
- shell: cat /some/path/to/multidoc-file.yaml
register: result
- debug:
msg: '{{ item }}'
loop: '{{ result.stdout | from_yaml_all | list }}'
.. _forcing_variables_to_be_defined: .. _forcing_variables_to_be_defined:
Forcing Variables To Be Defined Forcing Variables To Be Defined

View file

@ -210,6 +210,12 @@ def from_yaml(data):
return data return data
def from_yaml_all(data):
if isinstance(data, string_types):
return yaml.safe_load_all(data)
return data
@environmentfilter @environmentfilter
def rand(environment, end, start=None, step=None, seed=None): def rand(environment, end, start=None, step=None, seed=None):
if seed is None: if seed is None:
@ -600,6 +606,7 @@ class FilterModule(object):
'to_yaml': to_yaml, 'to_yaml': to_yaml,
'to_nice_yaml': to_nice_yaml, 'to_nice_yaml': to_nice_yaml,
'from_yaml': from_yaml, 'from_yaml': from_yaml,
'from_yaml_all': from_yaml_all,
# path # path
'basename': partial(unicode_wrap, os.path.basename), 'basename': partial(unicode_wrap, os.path.basename),