brent timothy saner on 27 Jun 2016 13:45:27 -0700


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] Ansible for updating in the field


On 06/27/2016 04:15 PM, JP Vossen wrote:
> Thanks Brent!  It sounds like I'm not missing anything obvious, and I
> like your path forward.

thanks! i did it with a large number (can't say how many exactly because
NDA, but i will say "100*n") of servers recently, so this is coming from
what i learned.

"LUGs: where others make mistakes so you can learn from them!"

> 
>>> Background:
>>> I have SSH connectivity as a non-root user who does have `sudo` access.
>> https://docs.ansible.com/ansible/become.html
> 
> Yup, I do that all the time, that's why I (unclearly) mentioned I'm good
> to go there.
> 

ah! sorry, i think i missed that.

>>> By my design, all my 120+ files can be arbitrarily overwritten, any
>>> special snowflakes are handled via *.local files that are per-device and
>>> only ever touched manually.  (The nodes are mostly cattle, not pets, but
>>> there are some "special" ones.)
>>
>> this can be handled by ansible logic. there's a couple different ways to
>> do this- via jinja2, host_variables, or the least-elegant "when:
>> ansible.host != 'somehostname'".
> 
> Yes, but that also requires that the tier1/tier2 guy who did the work
> tells me about it, so I don't accidentally nuke it later.  That will not
> happen, so the policy is "only ever touch one-offs manually, on the
> device."  Yes , that sucks, but there it is.
> 
> I might have another project that might help that later, but that's
> months out at least, so for now...
> 

This could probably serve you well in at the least detecting it:
https://docs.ansible.com/ansible/playbooks_checkmode.html

With some perl or python (and the --diff flag), you could probably even
write out some "patching" to your templates or host_vars or what have
you to keep it consistent down the line.

> 
>>> I already have a `setup.sh` that can install missing RPMs, create
>>> symlinks, fix permissions/owner, etc.  It is idempotent and designed to
>>> be run any time just for the hell of it to make sure stuff is correct.
>>> There were Good Reasons to start that way instead of Ansible from
>>> scratch, but now I'm torn.  The tier1/tier2 folks working on these
>>> devices will not have Ansible access, nor do they have strong Linux
>>> skills, so having a local "just make it right" script is very handy.
>>> OTOH, it duplicates the hell out of Ansible's domain.
>>
>> who says you can't have both? granted, it means any updated
>> checks/tasks/etc. have to be now added to two places instead of one, etc.
> 
> That's why, double-entry is BAD.

an alternate idea here might be to set up a git project (via gitolite
or.. (sigh) github or gitlab) where the tasks/playbooks/etc. could be
kept with ACL. give T1 and T2 seperate branches and have them submit
pull requests (REAL[0] ones, preferably ;) ), and merge them into *your*
branch (which the ansible master can then do a cron'd pull from).

downsides:
-requires extra steps from T1/T2
-...requires T1/T2 to read/write YAML.
-requires review before adding it to production deployment

it's a bit overcomplicated, but i'm an engineer. we can't help it.

>> alternatively you could just use the copy module to copy over the
>> relevant task/playbook/what have you, have ansible installed on the
>> local machine, and run it via local_action or ansible host as
>> "localhost".
> 
> I could.  As below I was thinking
> http://docs.ansible.com/synchronize_module.html was a better fit though.

i didn't even know this was a thing. thanks!

> 
>> there are more elegant ways, however:
>> https://www.stavros.io/posts/automated-large-scale-deployments-ansibles-pull-mo/
>>
> 
> Oh that's awesome!  I used to with with Stavros at $WORK-- and I've
> talked about Ansible with him a little, but never about pull that I
> recall.  I do follow his blog.
> 
> I really want a push though, my question is just about the best way to
> organize it in Ansible idiom.
> 

due to how every infra's different and there's so many ways to skin a
cat(1) in *nix, this is i'd say largely up to you and your organization.
however, this gives a good starting point in getting into that "ansible
mindset":

https://docs.ansible.com/ansible/playbooks_best_practices.html

> (SNIP)

> Thanks again,
> JP

any time!


[0] https://www.kernel.org/doc/Documentation/SubmittingPatches

Attachment: signature.asc
Description: OpenPGP digital signature

___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug