"I understand having the ability to set a variable at a more global scope is important but I think by default it should not."
Opinion noted, though we're not going to be changing things. Sounds like your roles should use variables like rolename_varname if you want to build things this way. On Tue, Jul 1, 2014 at 12:52 PM, John Anderson <[email protected]> wrote: > Maybe if I discuss what I'm trying to do there will be a better solution > so that variable scope doesn't matter. > > I have an SOA architecture (40 python web services) and want each one > defined as their own role because they can be deployed on their own nodes > or on shared nodes. > > So my tree structure looks like this: > > http://paste.ofcode.org/aWr2A77wxXezkanhWHm5nC > > For every role I have a line in my group_vars/all file that defines > metadata about the role like what nginx port they use, if they use > requirements.txt, etc. This looks like this: > > $ cat group_vars/all.yml > --- > services: > anonweb: > repo: anonweb > version: upgrade_latest_packages > port: 8500 > nginx_port: 6005 > paths: > - / > > addressbookweb: > repo: AddressBookWeb > version: develop > port: 8765 > nginx_port: 6014 > paths: > - /addressbook > > <snip> > > and so if I want to deploy the usersvc role to 3 nodes in the staging > environment I do the following: > > ansible-playbook -i nova.py -u monkey deploy.yml --extra-vars > "group=mc3-usersvc role=usersvc" > > but then after I get them deployed I need to run my loadbalancer role to > grab the hosts from my dynamic inventory > file and each of the nodes to the load balancer configuration, which means > it needs to grab the nginx port and everything > that it will be proxying to on each node. > > All this works as expected because I've defined 1 specific role I want to > deploy so the var is globally scoped and can be used > every where but if I want to update the load balancer for *all* roles I > have no way of getting what the "current" role is, so all my > current configuration fails. > > Which brings us to where we are now, I tried to define role/<role>/vars/ > file with one setting role=<role> that way all the > configuration would still run. But I forgot to to set this in 3 roles > and they ended up getting configuration for the role that ran before > them because the variable scope was contained to where I defined it (like > it would be in standard python without the global keyword). > > This caused mayhem because now my load balancer is routing to the wrong > nodes and it isn't very clear *why*. I want it to fail and > alert me that I forgot to define a variable. > ---------------- > I understand having the ability to set a variable at a more global scope > is important but I think by default it should not. > > So with my minor example, the pythonapp is generic configuration and one > of the checks it does is "when: use_req_text is defined" and each role can > decide if it should use a requirements.txt to install. > > My problem now is that only half of my 40 projects use requirements.txt > but since Ansible is leaking the information it tries to use > requirements.txt for all of them. > > Is my only option to have to explicitly set this var in every role and > accept the fact that forgetting to do so will have bad consequences? > > On Tuesday, July 1, 2014 7:52:59 AM UTC-7, Michael DeHaan wrote: > >> It doesn't leak information in any way that is a problem, but rather the >> variable is still in scope. >> >> Variables from roles are available in other roles, but always guaranteed >> to be used WITHIN that role. >> >> Thus if you set in one role X, "a: 42" >> >> and another role Y, "a: 44" >> >> ansible is so written that role X always gets 42 and tasks in role Y >> always get 44. >> >> They won't clobber one another. >> >> Having one role being able to define variables for another is however >> important, for instance, a role might define presensce in a particular >> datacenter and define a server address used in other roles. >> >> >> >> >> >> On Tue, Jul 1, 2014 at 6:17 AM, John Anderson <[email protected]> wrote: >> >>> I have the following structure: >>> >>> roles/pythonapp/ >>> roles/billingsvc/ >>> roles/usersvc/ >>> >>> >>> pythonapp is a generic set of instructions like cloning and installing a >>> python package, billingsvc and usersvc both include it in their tasks. >>> >>> I have a variable that I set in billingsvc/vars/main.yml and I don't >>> want usersvc to see this var but as soon as billingsvc finishes it runs >>> usersvc and the var is there. >>> >>> Is there anyway to prevent this leaking of information? I've defined >>> the var in the role vars section specifically to keep it isolated from >>> everything else. >>> >>> -- >>> 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/d96b6d38-e618-4c8a-b06a- >>> 5843a3cf36df%40googlegroups.com >>> <https://groups.google.com/d/msgid/ansible-project/d96b6d38-e618-4c8a-b06a-5843a3cf36df%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > 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/7133b4d5-74e7-48ef-b78a-1dca39e607fa%40googlegroups.com > <https://groups.google.com/d/msgid/ansible-project/7133b4d5-74e7-48ef-b78a-1dca39e607fa%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- 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/CA%2BnsWgzUxFwMNYCBYqw3G5Y1COGKznoHGvBMRncZF7vsnvX%2Bgg%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
