魔法變量
Ansible默認會提供一些內置的變量以實現一些特定的功能,我們稱之為魔法變量。下面列舉一些常用的魔法變量。
1. hostvars
獲取某台指定的主機的相關變量。如果有一台web服務器的配置文件中需要指定db服務器的ip地址,我們假定這台db服務器的hostname為db.exmaple.com,ip地址綁定在eth0網卡上,我們可以通過如下方法在web服務器上調用db服務器的ip地址:
{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
需要注意的是db.example.com不能使用ip地址來取代,只能使用主機名或別名。
2. inventory_hostname
inventory_hostname是Ansible所識別的當前正在運行task的主機的主機名。如果在inventory里定義過別名,那么這里就是那個別名,如果inventory包含如下一行:
server1 ansible_ssh_host=192.168.1.1
則inventory_hostname
即為server1
利用hostvars
和inventory_hostname
變量,可以輸出與當前主機相關聯的所有變量:
- debug: var=hostvars[inventory_hostname]
與inventory_hostname相近的還有一個inventory_hostname_short,如果一台主機的inventory_hostname為server1.exmaple.com,則inventory_hostname_short的值為server1
3. group_names
用於標識當前正在執行task的目標主機位於的主機組。假如我們有三台主機,用來配置成一主二從的mysql服務器。inventory配置如下:
[mdb]
db1
[sdb]
db2
db3
mysql配置文件my.conf.j2示例如下:
#我們知道db1在mdb組,當db1與當前正在執行任務的主機位於同一組時,我們認為當前主機即在mdb組,所以對當前主機應用mysql master的配置
{% if 'db1' in group_names %}
[mysqld]
server-id=1
log-bin=mysql-bin
log-bin-index=mysql-bin.index
sync-binlog=1
innodb_flush_log_at_trx_commit=1
#當db1與當前主機不在同一組時,則認為當前主機不在mdb組,即應用my slave的配置
{% else %}
[mysqld]
server-id=2
relay-log=relay-log
relay-log-index=relay-log.index
read-only = yes
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
relay_log_recovery = 1
skip_slave_start
{% endif %}
我們執行如下task:
- name: copy config file to mysql master
template: src=my.conf.j2 dest=/etc/my.cnf
4. groups
groups是inventory中所有主機組的列表,可用於枚舉主機組中的所有主機。
假如我們有一個inventory文件定義如下:
[web]
server1
server2
在配置一台HAproxy的負載均衡器時,我們的配置文件肯定需要web主機組的所有服務器的IP,配置文件包含如下片段:
backend web-backend
{% for host in groups.web%}
server {{host.inventory_hostname}} {{ host.ansible_default_ipv4.address }}:80
{% endfor %}
最終生成的文件如下:
backend web-backend
server server1 192.168.1.1:80
server server2 192.168.1.2:80
再給一個例子,在所有的dbservers組的服務器上創建一個數據庫用戶kate:
- name: Create a user for all db servers
mysql_user: name=kate password=test host={{ hostvars.[item].ansible_eth0.ipv4.address }} state=present
with_items: groups['dbservers']
5. play_hosts
當前playbook會在哪些hosts上運行
6. inventory_dir
主機清單所在目錄
7. inventory_file
主機清單文件