參考另一篇文章python
http://blog.51cto.com/weiweidefeng/1895261mysql
when條件 參考http://blog.51cto.com/breezey/1757593nginx
安裝目錄:sql
程序: ansible ansible-playbook ansible-doc 配置文件: /etc/ansible/ansible.cfg 主機清單: /etc/ansible/hosts 插件目錄: /usr/share/ansible_plugins/
ansible playbookshell
roles/{mysql,nginx,..}/ 目錄結構json
defaults 默認尋找路徑
tasks 此目錄中至少應該有一個名爲main.yml的文件,用於定義各task;其它的文件須要由main.yml進行「包含」調用;
files 存儲由copy或script等模塊調用的文件
templates 存儲由template模塊調用的模板文本;
handlers notify調用部分,此目錄中至少應該有一個名爲main.yml的文件,用於定義各handler;其它的文件須要由main.yml進行「包含」調用;
vars roles內變量存放路徑,此目錄中至少應該有一個名爲main.yml的文件,用於定義各variable;其它的文件須要由main.yml進行「包含」調用;
meta 此目錄中至少應該有一個名爲main.yml的文件,定義當前角色的特殊設定及其依賴關係;其它的文件須要由main.yml進行「包含」調用;
ansible.cfg 覆蓋/etc/ansible/ansible.cfg的相同配置,以下配置在nginx目錄下,做用是:添加一個ansible查找role的路徑,這樣ansible-playbook運行時能夠識別到路徑
運行playbook,使用ansible-playbook命令
(1) 檢測語法 ansible-playbook --syntax-check /path/to/playbook.yaml (2) 測試運行 ansible-playbook -C /path/to/playbook.yaml --list-hosts -list-tasks --list-tags (3) 運行 ansible-playbook /path/to/playbook.yaml -t TAGS, --tags=TAGS --skip-tags=SKIP_TAGS --start-at-task=START_AT
1.任務:tasks main.yml 主要執行的操做
---
-name install nginx
yum: name=nginx state=present #yum安裝軟件
-name start service nginx
service: name=nginx state=restarted #service重啓
2.變量:Variables
第一種、自定義變量
---
- hosts: all
vars:
key: aaa
kkk: bbb
tasks:
- name display vars
debug: msg='{{key}}--->{{kkk}}'
第二種 自定義變量 經過文件
#vars.yml
---
- hosts: all
vars_files:
- var.file
tasks:
- name display vars
debug: msg='{{key}}--->{{kkk}}'
#var.yml
---
key: 111
kkk: 222
第三種 第一個task結果的值傳遞給第二個task register
---
- hosts: all
tasks:
- name register vars
shell: hostname
register: info #shell裏的hostname值傳給info
- name display vars
debug: msg='{{info.stdout}}' #info是個字典,取key爲stdout的值
第四種 循環執行任務 with_items
4.1 一層for循環
---
- hosts: all
tasks:
- name debug
debug: msg='{{item.key}},,,{{item.valu}}'
with_items:
- {key: "aa",value: "bb"}
- {key: "cc",value: "dd"}
4.2 嵌套循環 for for..
...
debug: msg='{{item[0]}} , {{item[1]}}'
with_nested:
- ["a","b"]
- ["A","B","C"]
3.模板:Templates nginx.conf.j2 (*.j2結尾)
文本文件,內部嵌套有模板語言腳本(使用Jinja2模板語言編寫)
4.角色:roles main.yml
以特定的層級目錄結構進行組織的tasks、variables、handlers、templates、files等目錄;
5.執行入口yml
---
- hosts: all
gather_facts: no
roles:
- nginx #這裏填寫目錄,好比nginx目錄 mysql目錄等
inventory 靜態文件centos
#host-------------這一行不在以下文件內
---
- hosts all
remote_user: root #遠程ssh主機認證用戶
gather_facts no #執行ansible時,不收集遠端主機信息,執行速度會加快
vars:
nginx_ports:80
vars_files:
- "b.yml" #音樂var文件,當前路徑
ansible -i (hosts文件或hosts目錄) ssh
inventory 動態文件ide
動態inventory的意思是全部的變量能夠從外部獲取,也就是說咱們能夠從CMDB以及zabbix系統拉取全部的主機信息而後使用ansible進行管理。測試
cat inverti.py
#!/usr/bin/env python # coding=utf-8 import json host1ip = ['192.168.1.15'] host2ip = ['192.168.1.110'] group = 'test11' group2 = 'test22' hostdata = {group:{"hosts":host1ip},group2:{"hosts":host2ip}} print json.dumps(hostdata,indent=4)
執行命令
[root@vagrant-centos65 opt]# ansible -i inverti.py all -a 'uptime' -k SSH password: 192.168.1.15 | SUCCESS | rc=0 >> 07:25:27 up 3:56, 3 users, load average: 0.00, 0.00, 0.00 192.168.1.110 | SUCCESS | rc=0 >> 07:25:27 up 7 min, 3 users, load average: 0.00, 0.02, 0.00