IAAS:python
不提供OS 只購買硬件(網絡,存儲,計算)nginx
PAAS:web
提供硬件和OS和開發和運行環境 只須要開發應用軟件redis
SAAS:shell
提供 硬件 os 軟件 至關於直接購買軟件服務器
1.有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊 網絡
2.部署簡單,基於python和SSH(默認已安裝),agentless 數據結構
3.支持playbook編排任務 編排定義Ansible任務集的配置 文件,由Ansible順序依次執行,一般是JSON格式的YML文件 架構
4.冪等性: 一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況 less
ansible只有首先配置好主機清單纔可以管理其它主機,若是沒有配置ansible將沒法管理任何主機
默認的inventory file 爲 /etc/ansible/hosts
inventory file能夠有多個,且也能夠經過Dynamic Inventory來動態生成
ansible命令執行過程
1. 加載本身的配置文件 默認/etc/ansible/ansible.cfg
2. 加載本身對應的模塊文件,如command
3. 經過ansible將模塊或命令生成對應的臨時py文件,並將該 文件傳輸至遠程服務器 的對應執行用戶$HOME/.ansible/tmp/ansible-tmp-數字/XXX.PY文件
4. 給文件+x執行
5. 執行並返回結果
6. 刪除臨時py文件,sleep 0退出
執行狀態:
綠色:執行成功而且不須要作改變的操做
黃色:執行成功而且對目標主機作變動
紅色:執行失敗
[root@localhost ~]# yum install ansible [root@localhost ~]# ansible --version ansible 2.5.3 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] [root@localhost ~]# vi /etc/ansible/hosts [root@localhost ~]# ansible 192.168.231.7 -m ping -k SSH password: 192.168.231.7 | SUCCESS => { "changed": false, "ping": "pong" } [root@localhost .ssh]# ansible webservers -m ping -k SSH password: 192.168.231.7 | SUCCESS => { "changed": false, "ping": "pong" } [root@localhost .ssh]# ansible 192.168.231.7 -vvv -m ping -k # -vvv 輸出ansible操做的詳細信息,能夠看成調試日誌 [root@localhost .ssh]# ssh-keygen [root@localhost .ssh]# ssh-copy-id 192.168.231.7 [root@localhost .ssh]# ansible all -m command -a 'ss -ntul' #command模塊不支持命令管道(|),重定向(>),變量($HOSTNAME) [root@localhost .ssh]# ansible all -m shell -a 'echo $HOSTNAME' [root@localhost .ssh]# ansible all -m shell -a 'echo "333">1ansible.aaa' 192.168.231.7 | SUCCESS | rc=0 >> [root@localhost .ssh]# ansible all -a 'echo "333">1ansible.aaa' 192.168.231.7 | SUCCESS | rc=0 >> 333>1ansible.aaa [root@localhost ~]# ansible all -m fetch -a 'src=/root/guess.sh dest=/root' #owner mode #fetch 只能拉取文件,不能拉取目錄或者匹配通配符 192.168.231.7 | SUCCESS => { "changed": true, "checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", "dest": "/root/192.168.231.7/root/guess.sh", "md5sum": "435fe28b40aa89a35f9dc63c7063b1a7", "remote_checksum": "656427f4ebbcbb4745fa80fbffc456b88378c4ed", "remote_md5sum": null } [root@localhost ~]# ansible all -m file -a 'name=/root/yxh state=directory' #file模塊包括對文件夾的操做 #file不能刪除使用通配符批量刪除目錄下的文件,只能刪除整個目錄 [root@localhost ~]# ansible all -m shell -a 'rm -fr /data/*'
使用#號註釋代碼
縮進必須是統一的,不能空格和tab混用
縮進的級別也必須是一致的,一樣的縮進表明一樣的級別,程序判別配置的級別是經過縮進結合換行來實現的
YAML文件內容和Linux系統大小寫判斷方式保持一致,是區別大小寫的,k/v的值均需大小寫敏感
k/v的值可同行寫也可換行寫,同行使用:分隔
v但是個字符串,也但是另外一個列表
一個完整的代碼塊功能需最少元素需包括 name: task
一個name只能包括一個task
YAML文件擴展名一般爲yml或yaml
List: 列表,其全部元素均使用 "-" 打頭
Dictionary: 字典,一般由多個key與value構成 skill: Elite
也能夠將key:value放置於{}中進行表示, 用,分隔多個key:value {name: Example Developer, job: Developer, skill: Elite}
YAML的語法和其餘高階語言相似,而且能夠簡單表達清單、散列表、標量等數據結構.
其結構(Structure)經過空格來展現,序列(Sequence)裏的項用 "-" 來表明,Map裏的鍵值對用":"分隔
children: children表示一個序列, name 和 age 表示序列中的一個數據項
- name: Jimmy Smith
age: 17
- name: Jenny Smith
age 13
playbook是由一個或多個 "play" 組成的列表
play的主要功能在於將事先歸併爲一組的主機裝扮成事先經過ansible中的task定義好的角色.
所謂task無非是調用ansible的一個module. 將多個play組織在一個playbook中,便可以讓它們聯同起來按事先編排的機制順序執行
1.普通(主機)變量 在inventory中定義主機時爲其添加主機變量以便於在playbook中使用
[websrvs]
192.168.99.101 http_port=8080 hname=www1
192.168.99.102 http_port=80 hname=www2
2.組變量 組變量是指賦予給指定組內全部主機上的在playbook中可用的變量
[websrvs]
www1.magedu.com
www2.magedu.com
[websrvs:vars]
ntp_server=ntp.magedu.com
nfs_server=nfs.magedu.com
3.命令行指定變量
ansible websvrs –e http_port=8000 –m hostname –a 'name={{ hname }}{{ mark }}{{ http_port }}'
4.在playbook中定義
vars:
- var1: value1
- var2: value2
5.單獨使用一個yaml文件定義全部的變量
vi myvars.yaml
var1: httpd
var2: vsftpd
var3: nginx
vi playbook.yaml
vars_files:
- myvars.yaml
task:
- name: install {{ var1 }} package
6.在role中定義
變量的優先級
1. 經過命令行指定變量,優先級最高 ansible-playbook –e varname=value
2. 在playbook中定義的變量
3.普通(主機)變量: 主機組中主機單獨定義,優先級高於公共變量
4.公共(組)變量: 針對主機組中全部主機定義統一變量 優先級最低
變量的調用方式
經過 {{ variable_name }} 調用變量,且變量名先後必須有空格,有時用 "{{ variable_name }}" 才生效
yaml文件中的縮進是很是重要的,同一級別的必須寫到同一個縮進,不然程序沒法運行 yaml裏面的task是按照次序依次執行,不會出現執行順序不一樣的問題 一個name只能包含一個task(命令模塊) #按照指定的task的順序依次執行 #ansible的task中相對路徑是相對於當前yaml文件的所在目錄 [root@localhost playbook]# ansible-playbook test2.yaml PLAY [webservers] *************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [192.168.231.7] TASK [create new file] ********************************************************************************** changed: [192.168.231.7] TASK [create new user] ********************************************************************************** changed: [192.168.231.7] TASK [copy file] **************************************************************************************** changed: [192.168.231.7] TASK [start httpd] ************************************************************************************** changed: [192.168.231.7] PLAY RECAP ********************************************************************************************** 192.168.231.7 : ok=5 changed=4 unreachable=0 failed=0 [root@localhost playbook]# ansible-playbook test2.yaml --list-tasks playbook: test2.yaml play #1 (webservers): webservers TAGS: [] tasks: create new file TAGS: [] create new user TAGS: [] copy file TAGS: [] start httpd TAGS: [] [root@yxh6 conf]# netstat -ntlp | grep httpd tcp 0 0 :::9527 :::* LISTEN 8013/httpd --- - hosts: webservers remote_user: root tasks: - name: install httpd pagckage yum: name=httpd tags: installhttpd - name: copy conf file action copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart httpd service - name: start httpd service service: name=httpd state=started enabled=yes tags: rshttpd
#tags inshttpd,rshttpd #經過ansible命令單獨執行指定標籤的task action命令,而不是執行整個playbook. #多個action能夠共用一個標籤 [root@localhost playbook]# ansible-playbook -t inshttpd,rshttpd handler.yaml --- - hosts: webservers remote_user: root tasks: - name: install httpd pagckage yum: name=httpd tags: installhttpd - name: copy conf file action copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify: restart httpd service - name: start httpd service service: name=httpd state=started enabled=yes tags: rshttpd
#ansible收集主機信息,同時也能夠作爲變量傳遞給playbook中 [root@localhost playbook]# ansible webservers -m setup [root@localhost playbook]# ansible webservers -m setup -a 'filter=*address*' #playbook中自定義變量{{ bialiangmin }} tasks: - name: install {{ packname }} pagckage yum: name={{ packname }} tags: installhttpd #執行的時候傳遞變量值 [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd' bianliang.yaml [root@localhost playbook]# ansible-playbook -e 'packname=vsftpd packname2=redis' bianliang.yaml PLAY [webservers] *************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [192.168.231.6] TASK [install vsftpd pagckage] ************************************************************************* changed: [192.168.231.6] PLAY RECAP ********************************************************************************************** 192.168.231.6 : ok=2 changed=1 unreachable=0 failed=0 變量使用的第二種方式: - hosts: webservers remote_user: root vars: - packname: httpd - packname2: vsftpd 變量使用的第三種方式 在/etc/ansible/hosts中定義
1 --- 2 - hosts: webservers 3 remote_user: root 4 5 tasks: 6 - name: install httpd pagckage 7 yum: name=httpd 8 tags: installhttpd 9 - name: copy conf file action 10 copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes 11 notify: restart httpd service 12 - name: start httpd service 13 service: name=httpd state=started enabled=yes 14 tags: rshttpd 15 16 #handlers必須和notify配合使用,二者不能分開使用 17 handlers: 18 - name: restart httpd service 19 service: name=httpd state=restarted 20 - name: testaction 21 shell: ls