7 ms·
>The YAML file is essentially code YAML is not turing complete and is hence not "code". That is a large part of what makes ansible such a powerful tool - it en
by crdoconnor 9y ago
>The YAML file is essentially code
YAML is not turing complete and is hence not "code". That is a large part of what makes ansible such a powerful tool - it enforces a strict separation of concerns between the definition of server configuration and its execution and keeps one in a language that is deliberately not able to be made more complex than is needed, is thus kept readable and straightforward to maintain.
By contrast, turing complete languages are veritable magnets for technical debt, which is why a bad chef playbook will always be worse than a bad ansible playbook. Haskell, being turing complete, would suffer the same issue albeit not to the same degree as ruby.
>YAML the format is also not a great way to encode systems data. Thankfully Ansible has documented the gotchas with its space-indentation and need for explicit quoting in http://docs.ansible.com/ansible/latest/YAMLSyntax.html#gotch... http://docs.ansible.com/ansible/latest/YAMLSyntax.html#gotch.... But that is just an attempt to band-aid over the unsuitability of YAML for this purpose.
YAML has a few oblique gotchas but they don't affect the fundamental suitability of it for this purpose. Once you get used to it, space indentation becomes a feature, not a bug.
- emmelaich 9y agoI agree with most of your comment but > YAML is not turing complete and is hence not "code". seems wrong to me. In fact I've heard code/coding to include non-Turing complete languages (e.g. html) as distinct from programs/programming.
- guywhocodes 9y agoI think SQL is another prime example, being able to solve a problem effectively without resorting to Turing-completeness is preferable to me, as long as that language is simple enough.
- gshakir 9y agoYes agreed, Declarative languages like SQL or Ansible are great for most of the use cases. You can always use extensions to get down to imperative steps.
- DerBesserWisser 9y agoHTML is a markup language and not a programming language. IMHO you can only "code" in programming languages (not necesseraly executed by a CPU). A programming language does not need to be turing complete though to "code" in it. You're just limited to the problems you can solve with a turing-incomplete language. It's interesting to think if using a problem-declaration language is coding.
- jasim 9y agoAny sufficiently complicated configuration language contains an ad hoc, informally-specified, bug-ridden, slow implementation of a Turing complete programming language. Ansible playbooks have variables, loops, conditionals, scoping rules, inheritance, and you can even extend it by writing custom modules in Python, which is a Turing complete language. The problem with not using a real programming language when you're trying to essentially "program" is that you're expressing complex programs without any of the abstractions and tooling support that a real language has. Despite all that I like Ansible's constrained format and the resulting simplicity compared to Chef. But I think we can take those design aesthetics and apply it in a statically typed library and maybe get something more sturdy.
- crdoconnor 9y ago>Ansible playbooks have variables, loops, conditionals, scoping rules, inheritance As far as I am aware, variables, scoping rules and inheritance don't imply turing completeness and the way it does loops and conditionals could really more be characterized as configuration for loops/conditionals further down the stack (e.g. as seen here http://docs.ansible.com/ansible/latest/playbooks_loops.html#loops-and-includes-in-2-0 http://docs.ansible.com/ansible/latest/playbooks_loops.html#... ) >you can even extend it by writing custom modules in Python, which is a Turing complete language. Yes, the idea is that you have the power to break into a (good) turing complete language when it is necessary but you can keep that code - and by extension the technical debt it would attract - to an absolute minimum. I've personally never felt the need to write a custom module in python when using ansible despite using it a lot, so for me, minimum is zero. I'm sure I'm not alone either. >The problem with not using a real programming language when you're trying to essentially "program" is that you're expressing complex programs without any of the abstractions and tooling support that a real language has. Yes, this is a problem if you're trying to work within a problem space that is not heavily constrained. If almost every time I used ansible I felt the need to write a python module to do almost everything I would agree that it is a fundamentally unsuitable task. I feel this issue when writing build scripts which I think absolutely have to be kept turing complete, but never server orchestration.
- 9y ago
- Aissen 9y agoIf only it were that simple. There are enough filters, that this is not true IMHO. I haven't gotten around to prove it yet, but I think it could be proven that the playbook language is turing-complete. Others have the same hunch: https://stackoverflow.com/questions/40127586/is-ansible-turing-complete https://stackoverflow.com/questions/40127586/is-ansible-turi...
- deleted 9y ago[deleted]
- dozzie 9y ago>> The YAML file is essentially code > YAML is not turing complete and is hence not "code". You do realize that YAML is a data serialization format, and as such is not a programming language by any stretch, right? And it's the Ansible's language encoded as YAML that is the problem? And I wouldn't be so sure that the language is not Turing complete, especially that this YAML is templated with Jinja2 (or has something changed recently?), which is Turing complete.
- zeckalpha 9y agoThis is why I wrote YAPL: https://github.com/kmarekspartz/yapl/ https://github.com/kmarekspartz/yapl/
- emmelaich 9y agoBrilliant. You must be reading my mind. > Inspired by YAML, Scheme, and TCL. Based on ulithp. Converts YAML to s-expressions then evaluates using ulithp.
- lima 9y agoI fully agree. While technically inferior to Chef and Puppet, the simplicity of Ansible's syntax is what makes it so useful. Learning curve and preventing people from being "clever" is absolutely essential for a tool which is used by a team of developers.
- hedwall 9y agoBut ansible playbooks are not just YAML. They’re YAML with Jinja2.