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
Comments
Post a Comment