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