Hey Giovanni,
It's good that you want to separate your data from your logic. It's a
design pattern you won't regret, now and going forward. Here's how I see
your problem resolved.
A simple Playbook for looping over the data, adding groups (first) and
users:
---
# oracle_users.yaml
- hosts: oracledb
sudo: yes
tasks:
- name: Create our (active) groups
group: name={{item.name}} state={{item.state}}
with_items: oracle_groups
- name: Create our (active) users
user: name={{item.name}} state={{item.state}}
with_items: oracle_users
And our actual data, which defines our groups and users. Keep in mind this
file is being utilised in an important way: it's going into 'group_vars/'.
As you're likely grouping up your hosts in your inventory file, this means
you can easily apply a default, "global" configuration to all systems in
that group, using group_vars. If you have just one Oracle server you want
the users to exist on, however, then you can just move the data to
host_vars/, and call the file the same name as the host's hostname in the
inventory. Don't include any extensions, such as .yaml, to the file.
# oracledb
oracle_groups:
- name: oracle_users
state: present
- name: oracle_admins
state: present
oracle_users:
- name: oracle_user_1
state: present
groups:
- oracle_users
- oracle_admins
- name: oracle_user_2
state: present
groups:
- oracle_user
And our inventory file, for a complete example. Note I'm using Vagrant
locally, so this is how it looks for me. These files are a complete working
example with a simple, practically default, Vagrantfile.
[oracledb]
localdev ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
Overall you should be using 'group_vars/all' to define truly global data
state that applies to everything in your estate. This is a great place to
define the default users that can SSH into your systems, like sysads, as
well as other handy features such as a base set of packages that must be
installed, etc. If you need to override these settings, then you can use
'group_vars/$group_name' and 'host_vars/$host_name'.
You can also change the 'hash_behaviour' from the default of 'replace' to
'merge', which means as you work your way close to a specific host's
configuration, hashes and arrays can have their values overridden OR new
values introduced, those allowing you to merge global configuration with
more host or group specific configuration. An example of this might be
merging the global users from 'group_vars/all' with your Oracle users (from
above) in 'group_vars/oracledb'.
I hope this makes helps. If you have any questions, let me know.
- M
On Sunday, 1 February 2015 21:03:41 UTC, Giovanni Tirloni wrote:
>
> oracle_users:
> - name: userX
> group: groupX
> groups: groupY,groupZ
> home: /home/userX
> - name: userY
> group: ....
> Hi,
>
> As I build more complex playbooks that will be used by other teams that
> have zero knowledge of Ansible (read: big corporation), I started to
> migrate much of the configuration data to variable files. The idea was
> to enforce certain things in the playbooks (thing that won't ever
> change and are standards -- famous last words) and let these users
> change the moving parts through variables.
>
> Initially it was nice because I was asking them to fill in a variable
> named "oracle_sid" and I would use it throughout the plays in all sorts
> of ways. The "users" didn't have to mess with Jinja filters, get the
> chance to break the logic, etc.
>
> Then it got weird when I was creating lists of dictionaries for users
> that should exist for a given role, like this:
>
> oracle_users:
> - name: userX
> group: groupX
> groups: groupY,groupZ
> home: /home/userX
> - name: userY
> group: ....
>
> The YAML file with these variables is _almost_ like the playbook file
> itself and I'm just looping over the list creating users with _almost_
> all parameters defined by the end-user through that vars file.
>
> So I got stuck thinking if I should be radical and not allow any
> configuration data in the playbooks, only get it from variables. Or if I
> should let these other operation teams mess directly with the playbooks.
>
> I'm really divided about this and really appreciate any feedback.
>
> Giovanni
>
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/27ce899f-7b95-47d5-8ce9-807484ef84a4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.