1. 程式人生 > >ansible--變量

ansible--變量

ansible variables

ansible中的變量主要來源於以下幾種場景:

  1. Inventory(host vars,group vars)

  2. playbook裏面

  3. 命令行

  4. playbook執行task過程中產生結果,可以register起來,作為變量給下面的task使用

  5. roles裏面

  6. 來自於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 [email protected] [email protected]



第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

再看看,執行結果

技術分享


本文出自 “Gavin” 博客,請務必保留此出處http://guopeng7216.blog.51cto.com/9377374/1945869

ansible--變量