您好,登錄后才能下訂單哦!
ansible中的變量主要來源于以下幾種場景:
Inventory(host vars,group vars)
playbook里面
命令行
playbook執行task過程中產生結果,可以register起來,作為變量給下面的task使用
roles里面
來自于nodes上面的facts
其中1-4一般來說都是用戶自己定義的,而5和facts則主要是ansible從nodes上面拉取過來,當然facts也可以自己定義。
Inventory里面的變量
/etc/ansible/hosts
[salt]
salt-master http_port=80 ##主機變量
10.240.162.112 ansible_connection=paramiko
[salt:vars] ##組變量
mysql_port=3306
/etc/ansible/host_vars/salt-master ##定義在文件里主機變量,文件名和主機名要一致
lxc:lixc
/etc/ansible/group_vars/salt ##定義在文件里的組變量,文件名要和組名一致
lss:
- liss
- ansible
playbooks里面的變量
---
- hosts: all
user: lixc
vars:
time: 120 ##變量
port: 80
keeplive: 100
vars_files:
- /vars/test.yml ##也可以導入外部的文件里的變量
playbooks里面可以定義變量,也可以導入外部的文件里面的變量
命令行里面的變量
命令行,傳遞變量給playbooks大概有三種方式
第1種方式,比較簡單了。
cat command_vars.yml
---
- hosts: salt-master
remote_user: '`uservar`' ##命令行變量
tasks:
- name: run this command and ignore the result
shell: echo `echovar`
- debug: msg='`result`.`stdout`'
ansible-playbook command_vars.yml -e "uservar=lixc echovar=hellomysql" ##傳入變量參數
第2種方式,以json的格式傳遞變量。
ansible-playbook command_vars.yml -e '{"uservar":"lixc", "echovar":"hellomysql"}'
##變量形式較復雜的時候,用json格式較方便,一般的直接用第一種方式就可以了
第3種方式,傳入json文件。第二種,第三種方法,一般用于變量形式較復雜的情況。不過,一般估計很少用,因為在命令行傳變量本來就不多用吧,還是第一種命令行傳遞方式稍微常用點。
cat test.json ##json文件
uservar: lixc
echocar: hellomysql
ansible-playbook command_vars.yml -e '@test.json' ##用@加上json文件
第4種方式,register task的結果,作為變量,給下面的task使用
---
- hosts: slat-master
tasks:
- name: test
command: ls /home
register: result
- debug: msg='`result`.`stdout`'
第五種方式,在roles里定義。
├── group_vars ##全局組變量
│ └── salt
├── hosts
├── roles
│ ├── mysql
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ ├── configure.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ └── my.cnf
│ │ └── vars ##當前role變量
│ │ └── main.yml
第六種方方式,從nodes獲取facts,facts和salt-stack里面的grains差不多,主要是nodes本身的一個系統信息,bios信息,網絡,硬盤等等信息。不過,facts比salt-stack中的grains獲取的信息。要更多一些。
ansible slat-master -m setup|wc -l ##查看facts
284
salt ‘*’ grains.items|wc -l ##查看grains
65
自定義facts
自定義facts有多種方法,有能力的同學,可以直接去修改,setup這個模塊。不過官方的東西,咱們還是不要隨便改了。
第二種方法,定義在nodes上面,默認定義在/etc/ansible/fact.d/*fact里面。
定義文件的格式,大概三種,分別是ini格式,json格式,或者可執行文件,不過他們返回的必須是json格式。
lixc.fact
{"json":["hello","world"]} ##這個文件內容是json格式
lss.fact
#!/usr/bin/env python ##這個文件是python腳本,返回json格式的字典
import json
dic = {"ansible_addresses": ["10.240.161.139","192.168.115.164"]}
print json.dumps(dic)
lxc.fact
[ini] ##ini格式
lixc=hello
lss=world
在node上創建文件夾并把測試的fact文件傳送過去。修改lss.fact這個文件的屬性為其它組可執行的權限,否則待會執行不了,用-s參數試了下,也執行不了
ansible salt-master -a "mkdir -p /etc/ansible/fact.d" -s
for file in `ls `;do ansible salt-master -m copy -a "src=${file} dest=/etc/ansible/facts.d/" -s;done >/dev/null
ansible salt-master -m file -a "dest/etc/ansible/facts.d/lss.fact mode=755" > /dev/null -s
##上述有修改python腳本屬性,待會要執行
ansible salt-master -m setup -a "filter=ansible_local"
自定義模塊,只不過這個模塊,返回一個facts格式的結果罷了。
在ansible的module里面,自定義一個文件夾,放自己的module,然后丟給自定義的module進去
mkdir /usr/share/ansible/custom
cat chengge
#!/usr/bin/env python
import json
dic = {"ansible_facts": {'chengge': 'Hello ansible','liss': "Hello salt=stack"}}
print json.dumps{dic}
##字典的key要為ansible_facts,要不然playbooks里不能用facts了
cp chengge /usr/share/ansible/custom
ansible salt-master -m chengge
具體如何使用自定義模塊:
其實,我們想用模塊里返回的facts,那么顯然,我們使用之前,肯定要先執行以下我們自定義的module
先看看playbooks
---
- hosts: slat-master
tasks:
- name: test custom module
action: chengge ##先執行下自定義module
- debug: msg='`chengge`' ##使用facts
再看看,執行結果
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。