Comments (2)
That could be interpreted as expected behavior. Ansible knows not of your true intentions, nor of your XML Schema (which may state that only one instance of any element type may be a child in a given scope). It only knows that you said to add a child element to a parent.
I understand your frustration with this. There's no clear and obvious way to add a child element if it doesn't already exist.
I could see this going in several ways. Maybe even a merge of some of their ideas. Here's one:
- An option could be added to the
add_children
command that allows you to specify the behavior of addition.
I can think of three common ways people approach this
- Default behavior, just add the element where you say to, this may mean a parent adding another sibling of the same type within it's scope
- Update behavior, if the element exists already, and does not look like what we say it should, then update the element to look as defined
- No-replace behavior, if the element exists in the given scope -- in any form -- then skip the operation
It becomes more challenging when we consider that a variety of things may be contained in any given parent's scope. What if we have an element foo defined several times in a parent element, but each instance of foo has different attribute (values) or element text values. For example:
<funwords>
<foo>with words!</foo>
<foo awesome="1" />
<foo title="The best">Mega Frobber</foo>
</funwords>
I guess you'd want to do a kind of "does it exist already?" task and register the result, and then an only_if on the subsequent add.
Or modify your playbook approach. If you're adding an element to an xml file, are you only doing that once to configure a service? Maybe split your playbook up more.
Maybe you've got a set of defined items you need to have as children somewhere, you can use yaml for variables to ensure the children of a parent are exactly defined as you say in the yaml.
This surely is an interesting issue.
from ansible-xml.
I concur with @tbielawa; definitely an interesting issue. You are correct that add_children
is not idempotent. However, it's counterintuitive having a command with the word "add" be idempotent.
I think the best way to handle this scenario is at the playbook level and use add_children
conditionally. Depending on your need, sometimes it would make sense to use set_children
in place of add_children
.
I'm going to close this issue without a fix, but I am open to changing my position on how add_children
should work in the future, or if it should be depreciated.
from ansible-xml.
Related Issues (20)
- '_ElementStringResult' object has no attribute 'attrname' HOT 2
- Older lxml versions have no predictable element attribute order HOT 1
- Fails on python3 due to unicode-related errors HOT 1
- How to create multiple nodes? HOT 8
- Feature idea: Add 'namespace catch' in issue_template.md HOT 8
- xpath is not a legal parameter in an Ansible task or handler HOT 1
- winrm send_input failed HOT 2
- Out-of sync with upstream
- No idempotency when combining namespace and set_children HOT 3
- Do we need an "issue template" HOT 5
- comprescott.xm fails with centos user HOT 1
- deliverable package HOT 3
- Update "xml:base" attribute HOT 4
- Convert xml file to yaml file using java
- Get entire xml node HOT 1
- add_children before other element HOT 6
- Make this repo readonly? HOT 2
- Add_children in an XML file is not working HOT 2
- How to assign mulity attribute value in xml node
- Ansible: Custom Tag field of a Dictionary. Error: Invalid tag name '}'
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ansible-xml.