1、在Inventory中定义变量python
详见《Ansible2:主机清单》mysql
2、在Playbook中定义变量nginx
一、经过vars关键字定义:web
vars: sql
http_port: 80shell
server_name: localhost数据库
cert_file: /etc/nginx/ssl/nginx.crtjson
key_file: /etc/nginx/ssh/nginx.key服务器
conf_file: /etc/nginx/conf/default.conf负载均衡
二、经过vars_files关键字引入变量文件:
- hosts: all
remote_user: root
vars:
favcolor: blue
vars_files:
- /vars/external_vars.yml
- /vars/nginx_vars.yml
/vars/nginx_vars.yml示例:
http_port: 80
server_name: localhost
cert_file: /etc/nginx/ssl/nginx.crt
key_file: /etc/nginx/ssh/nginx.key
conf_file: /etc/nginx/conf/default.conf
三、经过vars_prompt来实现人机交互:
hosts: all
remote_user: root
vars_prompt:
- name: 'https_passphrase' #存储数据的变量名
prompt: 'Key Passphrase' #手工输入数据
private: yes #当该值为yes,则用户的输入不会被打印
四、经过playbook的roles定义变量
详见《ansible10:Playbook的角色与包含》
3、注册变量
在有些时候,咱们但愿把某一条任务执行的结果保存下来,能够在接下的任务中调用或者作些判断,能够经过register关键字来实现:
hosts: all tasks: - shell: cat /etc/motd register: motd_contents - shell: echo "motd contains the word hi" when: motd_contents.stdout.find('hi') != -1下面是一个register的变量在循环中使用的例子:- name: registered variable usage as a with_items list hosts: all tasks: - name: retrieve the list of home directories command: ls /home register: home_dirs - name: add home dirs to the backup spooler file: path=/mnt/bkspool/{{ item }} src=/home/{{ item }} state=link with_items: home_dirs.stdout_lines # same as with_items: home_dirs.stdout.split()
4、经过fact获取远程主机变量
咱们在以前讲ad-hoc经常使用模块的时候提到setup模块,用于获取远程主机的相关信息,并能够将这些信息做为变量在playbook里进行调用。而setup模块获取这些信息的方法就是依赖于fact。在这里,咱们再也不详细说明获取到的默认fact的内容。ansible除了能获取到预约义的fact的内容,还支持手动为某个主机定制fact。称之为本地fact。本地fact默认存放于目标主机的/etc/ansible/facts.d目录下,若是文件为.ini格式或者json格式,ansible会自动识别。以这种形式加载的fact是key为ansible_local的特殊变量。
下面是一个简单的示例,一个.ini格式的example.fact文件内容以下:
[book]
title=Ansible Book
author=Breeze Yan
将其复制到目标主机的/etc/ansible/facts.d/目录,经过debug模块打印输出:
- name: print ansible_local
debug: var=ansibl_local
会打印出以下内容:
ok: [localhost] => {
"var": {
"ansible_local": {
"example": {
"book": {
"author": "Breeze Yan",
"title": "Ansible Book"
}
}
}
}
}
若是不想从fact中获取变量,能够经过以下方法关闭fact:
- hosts: whatever
gather_facts: no
5、使用set_fact模块定义新的变量
在《ansible7:Playbook经常使用模块》中有对set_fact模块用法的详细说明
6、内置变量
一、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地址来取代,只能使用主机名或别名。
二、inventory_hostname与inventory_hostname_short
inventory_hostname是Ansible所识别的当前正在运行task的主机的主机名。若是在inventory里定义过别名,那么这里就是那个别名,若是inentory包含以下一行:
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
三、group_names
用于标识当前正在执行task的目标主机位于的主机组。假如咱们有三台主机,用来配置成一主二从的mysql服务器。inventory配置以下:
[mdb]
db1
[sdb]
db2
db3
mysql配置文件my.conf.j2示例以下:
{% 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组,当db1与当前执行c一组时,咱们认为当前主机即在mdb组,因此对当前主机应用mysql master的配置
{% 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 #当db1与当前主机不在同一组时,则认为当前主机不在mdb组,即应用my slave的配置
{% endif %}
咱们执行以下task:
- name: copy config file to mysql master
template: src=my.conf.j2 dest=/etc/my.cnf
四、groups
当你想要访问一组主机的变量时,groups变量会颇有用。假如咱们有一个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
server server2 192.168.1.2
再给一个例子,在全部的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']
五、play_hosts #当前playbook会在哪些hosts上运行
六、ansible_version #当前ansible的版本
七、inventory_dir #主机清单所在目录
八、inventory_file #主机清单文件
7、经过命令行设置变量
示例以下:
---
- hosts: '` hosts `'
remote_user: '` user `'
tasks:
- ...
ansible-playbook release.yml --extra-vars "hosts=vipers user=starbuck"
也能够写成相似以下方式:
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'
为了方便调试,ansible提供了debug模块来很方便的查看模块。用法能够参考经过fact获取主机变量中的打印本地fact的示例9、变量优先级
一、extra vars(命令中-e)最优先
二、inventory 主机清单中链接变量(ansible_ssh_user 等)
三、play 中 vars、vars_files 等
四、剩余的在 inventory 中定义的变量
五、系统的 facts 变量
六、角色定义的默认变量(roles/rolesname/defaults/main.yml)
注:子组会覆盖父组,主机老是覆盖组定义的变量
本文出自 “无名小卒” 博客,请务必保留此出处http://breezey.blog.51cto.com/2400275/1757734