While playing around with group_vars, I noticed that a specific host never applied these group_vars.
Multiple PHP settings were defined in a group_vars:
ck@ansible:~$ cat /pub/ansible/inventory/group_vars/php_small.yaml
php:
fpm:
pool:
pm.max_children: 25
pm.start_servers: 2
php_admin_value[apc.shm_size]: 128M
php_admin_value[opcache.memory_consumption]: 128
php_admin_value[opcache.max_accelerated_files]: 32531
In the host inventory, the target host (webserver11) is listed under this group name "php_small":
ck@ansible:~$ cat /pub/ansible/inventory/containers
[...]
[php]
:children php_small
[php_small]
webserver11 ansible_ssh_host=10.10.55.1
So I would have assumed that these PHP settings for the group php_small are applied. But when I ran the playbook, the following error showed up:
TASK [PHP - Test host_vars] ******************************************************************************************
fatal: [webserver11]: FAILED! => {"msg": "Unable to look up a name or access an attribute in template string ({{ php.fpm.pool | dict2items }}).\nMake sure your variable name does not contain invalid characters like '-': dict2items requires a dictionary, got <class 'ansible.template.AnsibleUndefined'> instead."}
Meaning: The php.fpm.pool dictionary was not found.
To verify, that the webserver11 host is REALLY a member of the php_small group, you can add the following debug message as an early task into a playbook:
ck@ansible:~$ cat /pub/ansible/playbooks/group_membership.yaml
---
- name: ANSIBLE - Check group membership - Infiniroot LLC
hosts: '{{ target }}'
tasks:
- debug:
msg: "{{ group_names }}"
ignore_errors: True
When this playbook is run, the group_names (which is an array and can show multiple groups) are shown:
TASK [debug] **************************************************************
ok: [webserver11] => {
"msg": [
"webservers"
]
}
The output clearly shows that this host (webserver11) is member of the group "webserver", but not of php_small. No wonder my PHP settings are not applied.
It turns out to be an error in my inventory file. The group parent/child relationships need to be defined with another syntax as I used above:
ck@ansible:~$ cat /pub/ansible/inventory/containers
[...]
[php:children]
php_small
[php_small]
webserver11 ansible_ssh_host=10.10.55.1
After fixing the inventory file, the group_membership playbook now shows the following groups:
ck@ansible:~$ ansible-playbook /pub/ansible/playbooks/group_membership.yaml --extra-vars="target=webserver11"
[...]
TASK [debug] **************************************************************
ok: [webserver11] => {
"msg": [
"webservers",
"php",
"php_small"
]
}
Mystery solved!
As a reply to my Toot, Kevin Honka mentioned the possibility to use ansible-inventory. Indeed, the command can be used to do a group listing and nicely presents all the servers present in a group:
ck@ansible:~$ ansible-inventory --graph
[...]
|--@php:
| |--@php_large:
| | |--webserver10
| |--@php_small:
| | |--webserver11
| | |--webserver12
Thanks for the hint!
No comments yet.
AWS Android Ansible Apache Apple Atlassian BSD Backup Bash Bluecoat CMS Chef Cloud Coding Consul Containers CouchDB DB DNS Database Databases Docker ELK Elasticsearch Filebeat FreeBSD Galera Git GlusterFS Grafana Graphics HAProxy HTML Hacks Hardware Icinga Influx Internet Java KVM Kibana Kodi Kubernetes LVM LXC Linux Logstash Mac Macintosh Mail MariaDB Minio MongoDB Monitoring Multimedia MySQL NFS Nagios Network Nginx OSSEC OTRS Office PGSQL PHP Perl Personal PostgreSQL Postgres PowerDNS Proxmox Proxy Python Rancher Rant Redis Roundcube SSL Samba Seafile Security Shell SmartOS Solaris Surveillance Systemd TLS Tomcat Ubuntu Unix VMWare VMware Varnish Virtualization Windows Wireless Wordpress Wyse ZFS Zoneminder