a. ansible是一個基於Python開發的自動化運維工具 b. ansible是一個基於ssh協議實現遠程管理的工具 c. ansible軟件能夠實現多種批量管理操做(批量系統配置、批量軟件部署、批量文件拷貝、批量運行命令) saltstack puppet
a ansible軟件服務端(管理端):不須要啓動任何服務 默認服務端不須要任何的配置 b ansible軟件客戶端(受控端):沒有客戶端軟件安裝
1 .ansible軟件自動化環境架構規劃html
管理主機1臺: 10.0.0.61 m01 受控主機3臺: 10.0.0.41 backup 10.0.0.31 nfs01 10.0.0.7 web01 Linux系統 6.9
2 ansible軟件自動化部署條件python
a .ssh密鑰對建立(管理主機,建議基於ssh密鑰方式創建遠程鏈接)linux
ssh-keygen -t dsa 影響免交互建立密鑰對建立因素: 1)須要指定私鑰存放路徑 -f /root/.ssh/id_dsa 2)須要進行私鑰文件密碼設定 -N/-P -N ""/-P "" 免交互建立密鑰對方法 ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
b .分發公鑰文件(管理主機進行分發)web
ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 影響免交互批量分發密鑰因素 1)須要有確認鏈接過程,須要輸入yes/no -o StrictHostKeyChecking=no sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.31" 2)須要解決密碼問題 sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub 172.16.1.31 Now try logging into the machine, with "ssh '172.16.1.31'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 免交互批量分發公鑰腳本: #!/bin/bash rm /root/.ssh/id_dsa ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" for ip in 31 41 7 do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip" done
c .檢查是否能夠進行基於密鑰遠程管理shell
ssh 172.16.1.31 uptime 免交互批量檢查測試腳本 #!/bin/bash rm /root/.ssh/id_dsa ssh-keygen -t dsa -f /root/.ssh/id_dsa -N "" for ip in 31 41 7 do sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 172.16.1.$ip" done 基於ssh口令方式創建遠程鏈接(也能夠) vim /etc/ansible/hosts [oldboy] 172.16.1.7 172.16.1.31 ansible_user=root ansible_password=123456 172.16.1.41 ansible 172.16.1.31 -m command -a "hostname" -k --- 實現口令交互式遠程管理 SSH password: 172.16.1.31 | SUCCESS | rc=0 >> nfs01
3 ansible軟件下載安裝vim
ansible管理主機軟件安裝: yum install -y ansible ansible受控主機軟件安裝:(可選) yum install -y libselinux-python
4.ansible軟件受控主機添加配置bash
cat /etc/ansible/hosts [oldboy] 172.16.1.7 172.16.1.31 172.16.1.41
ansible軟件模塊架構
ansible-doc -l|wc -l 1378 ansible 管理主機信息或者主機組信息 -m 模塊名稱 -a 相關模塊參數 主機信息:遠程主機IP地址 遠程主機組名稱 遠程全部主機all -m 指定相應模塊 -a 利用模塊中某些參數功能
命令類型模塊:app
第一個模塊:command運維
官方參考連接:http://docs.ansible.com/ansible/latest/modules/command_module.html 參數:chdir---在執行某個命令前,先切換目錄 [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /tmp [root@m01 ansible]# ansible 172.16.1.31 -m command -a "chdir=/etc/ pwd" 172.16.1.31 | SUCCESS | rc=0 >> /etc 參數:creates---判斷一個文件是否存在,若是已經存在了,後面的命令就不會執行 [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.conf exists [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.conf.bak hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.conf.bak exists [root@m01 ansible]# ansible 172.16.1.41 -m command -a "creates=/etc/rsyncd.123456 hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup 參數:removes---判斷一個文件是否存在,若是不存在,後面的命令就不會執行 [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.conf hostname" 172.16.1.41 | SUCCESS | rc=0 >> backup [root@m01 ansible]# ansible 172.16.1.41 -m command -a "removes=/etc/rsyncd.1212213123 hostname" 172.16.1.41 | SUCCESS | rc=0 >> skipped, since /etc/rsyncd.1212213123 does not exist 參數(必需要有的):free_form---表示執行command模塊時,必需要有linux合法命令信息 ansible 172.16.1.41 -m command -a "ls" 172.16.1.41 | SUCCESS | rc=0 >> 1 anaconda-ks.cfg dead.letter heqing
第二個模塊:shell模塊(萬能模塊)
參數:chdir---在執行莫個命令前,先切換目錄 參數:creates---判斷一個文件是否存在,若是已經存在了,後面的命令就不會執行 參數:removes---判斷一個文件是否存在,若是不存在,後面的命令就不會執行 參數(必需要有的):free_form---表示執行command模塊時,必需要有linux合法命令信息 [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls;pwd" 172.16.1.41 | SUCCESS | rc=0 >> 1 anaconda-ks.cfg dead.letter /root 說明:shell模塊能夠知足command模塊全部功能,而且能夠支持識別特殊字符信息 < > | ;
第三個模塊:script---專門運行腳本模塊
參數:chdir---在執行莫個命令前,先切換目錄 參數:creates---判斷一個文件是否存在,若是已經存在了,後面的命令就不會執行 參數:removes---判斷一個文件是否存在,若是不存在,後面的命令就不會執行 參數(必需要有的):free_form---表示執行command模塊時,必需要有linux合法命令信息
文件類型模塊
第一個模塊:copy----複製模塊
參數:backup---對數據信息進行備份 [root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/ backup=yes" 172.16.1.41 | SUCCESS => { "backup_file": "/tmp/file01.txt.71887.2018-04-02@23:33:19~", "changed": true, "checksum": "029b054db136cc36d5605e3818305825ff4b8ffb", "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "md5sum": "434660b5ad7deeba8815349f71409405", "mode": "0644", "owner": "root", "size": 6, "src": "/root/.ansible/tmp/ansible-tmp-1522683197.05-52744169892601/source", "state": "file", "uid": 0 } 參數:src---定義要推送數據信息 參數:dest---定義將數據推送到遠程主機什麼目錄中 [root@m01 ansible]# touch /tmp/file01.txt [root@m01 ansible]# ansible 172.16.1.41 -m copy -a "src=/tmp/file01.txt dest=/tmp/" 172.16.1.41 | SUCCESS => { "changed": true, "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "md5sum": "d41d8cd98f00b204e9800998ecf8427e", "mode": "0644", "owner": "root", "size": 0, "src": "/root/.ansible/tmp/ansible-tmp-1522682948.27-60532389065095/source", "state": "file", "uid": 0 } [root@m01 ansible]# ansible 172.16.1.41 -m shell -a "ls -l /tmp/" 172.16.1.41 | SUCCESS | rc=0 >> total 24 -rw-r--r-- 1 root root 0 Apr 2 23:29 file01.txt 參數:owner---設置複製後的文件屬主權限 參數:group---設置複製後的文件屬組權限 參數:mode---設置複製後的文件權限(600 755)
第二個模塊:file----文件屬性修改/目錄建立/文件建立
參數:owner---設置複製後的文件屬主權限 參數:group---設置複製後的文件屬組權限 參數:mode---設置複製後的文件權限(600 755) ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt owner=oldboy group=oldboy mode=600" 172.16.1.41 | SUCCESS => { "changed": true, "gid": 500, "group": "oldboy", "mode": "0600", "owner": "oldboy", "path": "/tmp/file01.txt", "size": 6, "state": "file", "uid": 500 } 參數:state---用於指定建立目錄或文件 建立文件 ansible 172.16.1.41 -m file -a "dest=/tmp/file01.txt state=touch" 172.16.1.41 | SUCCESS => { "changed": true, "dest": "/tmp/file01.txt", "gid": 0, "group": "root", "mode": "0644", "owner": "root", "size": 0, "state": "file", "uid": 0 } 建立目錄: ansible 172.16.1.41 -m file -a "dest=/tmp/dir01 state=directory" 172.16.1.41 | SUCCESS => { "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/dir01", "size": 4096, "state": "directory", "uid": 0 }
包管理模塊類型
模塊:yum---安裝軟件包模塊
name:執行要安裝軟件的名稱,以及軟件的版本 state:installed安裝 absent(卸載) ansible 172.16.1.41 -m yum -a "name=iftop state=installed" ansible 172.16.1.41 -m yum -a "name=iftop state=absent" list:指定軟件名稱,查看軟件是否能夠安裝,以及是否已經安裝過了 ansible 172.16.1.41 -m yum -a "list=iftop"
系統模塊類型
模塊:service---管理服務狀態模塊
name: 指定要管理的服務名稱(管理的服務必定在chkconfig中能夠看到) state:stopped started restarted reloaded enabled:yes表示服務開機自啓動 no表示服務開機不要自動啓動 ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"
cron---定時任務模塊
* * * * * /bin/sh /server/scripts/test.sh &>/dev/null minute=0-59 * */n , - hour day month weekday job='/bin/sh /server/scripts/test.sh &>/dev/null' 添加定時任務 ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'" #name,表示定時任務的名稱。 刪除定時任務 ansible 172.16.1.41 -m cron -a "name=oldboy02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent" ansible 172.16.1.41 -m cron -a "name=oldboy01 state=absent" 註釋定時任務 ansible 172.16.1.41 -m cron -a "name=oldboy01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes" ansible 172.16.1.41 -m cron -a "name=oldboy01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no" 總結ansible顏色信息: 綠色:查看遠程主機信息,不會對遠程主機系統作任何修改 紅色:執行操做出現異常錯誤 黃色:對遠程主機系統進行修改操做 粉色:警告或者忠告信息
編寫劇本規範: http://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html 遵循pyyaml ①. - 用法說明,表示列表顯示的內容 水果信息: - 蘋果 - 香蕉 - 西瓜 ②. : 用法說明: 姓名: 張三 性別: 男 人員信息: - 運維人員: sa - 開發人員: dev - 存儲人員: dba ③. 空格 用法說明: 對內容進行分級時,須要有兩個空格表示分級 軟件安裝步驟: - 服務端安裝步驟: 第一個里程碑: 檢查軟件是否安裝 第二個里程碑: 編寫配置文件內容 - 客戶端安裝步驟: 補充:必須使用空格分隔ansible劇本級別,必定不要使用tab鍵進行分割 執行腳本方法: ansible-playbook /etc/ansible/ansible-playbook/test.yaml ansible-playbook -C /etc/ansible/ansible-playbook/test.yaml --syntax-check:檢測yaml文件的語法。 -C:預測試,不會改變目標主機的任何設置。 --list-tasks:列出yaml文件的任務列表。 --list-hosts:列出yaml文件影響的主機列表。 --list-tags:列出yaml文件中的標籤。 -t TAGS:表示只執行指定標籤的任務。 --skip-tags=SKIP_TAGS:表示出了指定標籤的任務,執行其餘任務。 --start-at-task=START_AT:從指定任務開始往下運行。 做業: 01. nfs服務一鍵化部署 02. inotify/sersync軟件一鍵化部署