Jay Taylor's notes
back to listing indexAnsible – some random useful things. | David Goodwin
[web search]Linux, PHP, running, geeky stuff, Bromsgrove and other bits
Tags
Recent ramblings
Pages
Search
Ansible – some random useful things.
Some random useful things for Ansible users:
inventory_hostname
‘inventory_hostname‘ contains the name of the current node being worked on…. (as in, what it is defined in your hosts file as) so if you want to skip a task for a single node –
- name: Restart amavis service: name=amavis state=restarted when: inventory_hostname != "boris"
(Don’t restart Amavis for boris, do for all others).
You could also use :
... when: inventory_hostname not in groups['group_name'] ...
if your aim was to (perhaps skip) a task for some nodes in the specified group.
Need to check whether you need to reboot for a kernel update?
- If /vmlinuz doesn’t resolve to the same kernel as we’re running
- Reboot
- Wait 45 seconds before carrying on…
- name: Check for reboot hint. shell: if [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; then echo 'reboot'; else echo 'no'; fi ignore_errors: true register: reboot_hint - name: Rebooting ... command: shutdown -r now "Ansible kernel update applied" async: 0 poll: 0 ignore_errors: true when: kernelup|changed or reboot_hint.stdout.find("reboot") != -1 register: rebooting - name: Wait for thing to reboot... pause: seconds=45 when: rebooting|changed
Fixing ~/.ssh/known_hosts
Often an ansible script may create a remote node – and often it’ll have the same IP/name as a previous entity. This confuses SSH — so after creating :
- name: Fix .ssh/known_hosts. (1) local_action: command ssh-keygen -f "~/.ssh/known_hosts" -R hostname
If you’re using ec2, for instance, you could do something like :
- name: Fix .ssh/known_hosts. local_action: command ssh-keygen -f "~/.ssh/known_hosts" -R {{ item.public_ip }} with_items: ec2_info.instances
Where ec2_info is your registered variable from calling the ‘ec2′ module.
Debug/Dump a variable?
- name: What's in reboot_hint? debug: var=reboot_hint
which might output something like :
"reboot_hint": { "changed": true, "cmd": "if [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; then echo 'reboot'; else echo 'no'; fi", "delta": "0:00:00.024759", "end": "2014-07-29 09:05:06.564505", "invocation": { "module_args": "if [ $(readlink -f /vmlinuz) != /boot/vmlinuz-$(uname -r) ]; then echo 'reboot'; else echo 'no'; fi", "module_name": "shell" }, "rc": 0, "start": "2014-07-29 09:05:06.539746", "stderr": "", "stdout": "reboot", "stdout_lines": [ "reboot" ] }
Which leads on to —
Want to run a shell command do something with the output?
Registered variables have useful attributes like :
- changed – set to boolean true if something happened (useful to tell when a task has done something on a remote machine).
- stderr – contains stringy output from stderr
- stdout – contains stringy output from stdout
- stdout_lines – contains a list of lines (i.e. stdout split on \n).
(see above)
- name: Do something shell: /usr/bin/something | grep -c foo || true register: shell_output
So – we could :
- name: Catch some fish (there are at least 5) shell: /usr/bin/somethingelse when: shell_output.stdout > "5"
Default values for a Variable, and host specific values.
Perhaps you’ll override a variable, or perhaps not … so you can do something like the following in a template :
... max_allowed_packet = {{ mysql_max_allowed_packet|default('128M') }} ...
And for the annoying hosts that need a larger mysql_max_allowed_packet, just define it within the inventory hosts file like :
[linux_servers] beech busy-web-server mysql_max_allowed_packet=256M