-
Notifications
You must be signed in to change notification settings - Fork 200
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a multi_ansible provisioner #1579
base: master
Are you sure you want to change the base?
Conversation
wbclark
commented
Sep 9, 2022
A box may be configured with `multi_ansible`, which specifies an ordered list of ansible provisioner names, at least one of which must be the standard name 'ansible'. Forklift will expect to find a key corresponding to each provisioner name within the top level box configuration. Each provisioner may be configured with any of the same options supported by the base ansible provisioner; you may also pass `reuse_vars: true` as a shorthand to simply copy all variables from the base 'ansible' named provisioner. For example, example-box: multi_ansible: - 'bootstrap' - 'ansible' - 'post' boostrap: reuse_vars: true config_file: ansible_bootstrap.cfg playbook: - 'playbooks/bootstrap.yml' ansible: variables: var1: "value1" playbook: - 'playbooks/main.yml' post: variables: var1: "value2" playbook: - 'user_playbooks/editor.yml' - 'user_playbooks/dotfiles.yml' Forklift will run the Ansible provisioners in stages, in the order defined by `multi_ansible`. Files named ansible_*.cfg are added to .gitignore so that the user may define additional ansible config files for their custom provisioner stages.
028bb30
to
94e3a8e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than going this route, wouldn't it make sense to treat playbooks
as a hash for this?
example-box:
ansible:
bootstrap:
playbook: 'playbooks/bootstrap.yml'
config_file: 'ansible_bootstrap.cfg'
reuse_vars: true
main:
playbook: 'playbooks/main.yml'
variables:
var1: "value1"
A primary concern was that everyone's existing boxes with a single ansible provisioner (actually, there is already a 2nd one, due to My thinking is that organizing the data this way was the best way to achieve that. Forklift always expects to find a portion of the yaml hash called What looks to me like the hard part of your proposal is 1. cleanly distinguishing the case of the single named |
I imagined it'd be similar to GH actions where triggers can be an array or a hash: https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#using-events-to-trigger-workflows Normally I'm not a big fan of that style of programming, but in this case I think it provides a better user experience. I'll admit I haven't fully thought this through. Other things that come to mind is using some sort of inventory file. Essentially the box gains state. A whole different approach is to change things up completely and instead focus on building a base box that has all these steps set up. Then you don't need all this complex provisioning, but instead move it into the box building phase. We already do a similar thing for Katello's stable dev box using packer. |