一 基礎使用
1. 簡介
ansible是新出現的自動化運維工具,基于Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實作了批量系統配置、批量程式部署、批量運作指令等功能。
ansible是基于子產品工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運作的子產品,ansible隻是提供一種架構。主要包括:
(1). 連接配接插件connection plugins:負責和被監控端實作通信;
(2). host inventory:指定操作的主機,是一個配置檔案裡面定義監控的主機;
(3). 各種子產品核心子產品、command子產品、自定義子產品;
(4). 借助于插件完成記錄日志郵件等功能;
(5). playbook:劇本執行多個任務時,非必需可以讓節點一次性運作多個任務。
2. 總體架構

3. 應用場景
<1>. Dev開發環境
使用者:程式員
功能:程式員開發軟體測試BUG的環境
管理者:千萬不能是運維,一定是要程式員自已
<2>. 測試環境
使用者:qa測試工程師
功能:測試經過Dev環境測試通過的軟體的功能
管理者:運維
備注:測試環境往往有多套(測試環境滿足測試功能即可,不宜過多)
(1)測試者希望測試環境有多套
公司的産品多産品線并發,即多個版本,意味着多個版本同步測試
(2)通常情況下,測試環境有多少套和産品線數量保持一樣
<3>. 釋出環境(代碼釋出機,有些公司堡壘機(安全屏障))
使用者:運維
功能:釋出代碼至生産環境
管理者:運維(有經驗的)
釋出機:往往需要有2台(主備)
<4>. 生産環境
使用者:運維,隻能是運維(極少數情況下會開放權限給核心開發人員,極少數公司将該 環境權限完全開放給開發人員并讓開發人員維護)
功能:對使用者提供公司産品的服務
管理者:隻能是運維
生産環境伺服器數量:一般比較多,且應用非常重要。往往需要自動工具協助部署配置應用。機器數量具體和公司業務規模相關。
<5>. 灰階環境(生産環境的一部分)
功能:在全量釋出代碼前将代碼的功能面向少量精準使用者釋出的環境
案例:
大家手頭100台伺服器,先釋出其中的10台伺服器,這10台伺服器就是灰階伺服器。
為什麼灰階環境:往往該版本功能變更較大,為保險起見特意先讓一部分使用者優化體驗該功能,待這部分使用者使用沒有重大問題的時候,再全量釋出至所有伺服器。
4. 優點
Agentless(去中心化)
Stupied Simple (上手簡單,學習曲線平滑)
SSH by default (安全,無需安裝用戶端)
YAML no code,定制劇本 (文法簡單,維護友善)
5. 任務執行流程
二 安裝及配置
1. 安裝
[root@node1 ~]# yum install ansible -y
[root@node1 ~]# ansible --version
ansible 2.2.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
2. ssh免秘鑰登入設定
[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id [email protected]
[root@node1 ~]# ssh-copy-id [email protected]
3. ansible配置
[root@node1 ~]# vim /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts # 主機清單配置檔案
#library = /usr/share/my_modules/ # 自定義庫檔案存放目錄
#remote_tmp = $HOME/.ansible/tmp # 生成的臨時py指令檔案存放在遠端主機的目錄
#local_tmp = $HOME/.ansible/tmp # 本機的臨時指令執行目錄
#forks = 5 # 預設并發數
#poll_interval = 15 # 預設的線程池
#sudo_user = root # 預設sudo 使用者
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
#roles_path = /etc/ansible/roles #roles預設存放目錄
#host_key_checking = False # 檢查對應伺服器的host_key
#timeout = 10 #檢查逾時
[privilege_escalation] #定義權限[paramiko_connection]
[ssh_connection]
[accelerate] #定義加速
[selinux]
[colors] #指令輸出顔色顯示
三 ansible常用子產品的使用
1. command子產品:使用ansible自帶子產品執行指令,如果要用 > < | & ' ' 使用shell子產品
[root@node1 ~]# ansible web -m command -a 'ls /tmp' #成功執行
[root@node1 ~]# ansible web -m command -a 'cat /tmp/mrlapulga.md | grep echo' #執行失敗,即使不傳回失敗結果也不會正常生效
- creates #command指令不能使用管道符,<>&等
a filename or (since 2.0) glob pattern, when it already exists, this
step will *not* be run.
[Default: None]
2. shell 子產品: 調用bash執行指令 類似 cat /tmp/mrlapulga.md | awk -F'|' '{print $1,$2}' &> /tmp/mrlapulga.txt 這些複雜指令,即使使用shell也會失敗,解決辦法:寫到腳本時,copy到遠端,執行,再把需要的結果拉回執行指令的機器(執行Ansible指令的機器往往稱為:Master機或者中控機或者堡壘機)
[root@node1 ~]# ansible web -m shell -a 'echo 123456 | passwd –-stdin mrlapulga'
3. copy:複制本地檔案至遠端伺服器,并且能夠改屬性等
[root@node1 ~]# ansible web -m copy -a 'src=/root/125.sh dest=/root/p.sh owner=mrlapulga group=mrlapulga backup=no mode=600'
4. cron:定時執行任務的子產品
* * * * *
分 時 日 月 周
增加一條crontab
[root@node1 ~]# ansible web -m cron -a 'minute="*/5" job="/usr/sbin/ntpdate 172.18.0.1 &> /dev/null" name="Synctimemrlapulga"'
删除名為Synctimemrlapulga的crontab任務
[root@node1 ~]# ansible web -m cron -a 'state=absent name="Synctimemrlapulga"'
5. fetch子產品: 從遠端伺服器拉取檔案至本機
隻能fetch檔案,不能fetch目錄,如果拉目錄,先tar/zip 再拉到本機即可
[root@node1 ~]# ansible web -m fetch -a 'src=/root/p.sh dest=/root/ppp.sh'
6. file子產品: 設定檔案屬性
[root@node1 ~]# ansible web -m file -a 'path=/root/p.sh mode=755' # 設定檔案權限
[root@node1 ~]# ansible web -m file -a 'src=/root/p.sh dest=/tmp/pp.sh mode=644 state=touch' # 複制檔案并且設定檔案屬性
7. pip 子產品: Python的包管理工具
[root@node1 ~]# ansible web -m pip -a 'name=pip2'
8. ping 子產品: 檢測主機存活
[root@node1 ~]# ansible web -m ping
9. yum子產品: 安裝軟體
[root@node1 ~]# ansible web -m yum -a 'name=httpd state=latest' # 安裝httpd包
[root@node1 ~]# ansible web -m shell -a 'ss -tnl | grep 80 '
[root@node1 ~]# ansible web -m command -a 'ss -tnl '
[root@node1 ~]# ansible web -m command -a 'systemctl start httpd.service'
[root@node1 ~]# ansible web -m command -a 'systemctl stop httpd.service'
10. service子產品
[root@node1 ~]# ansible web -m service -a 'name=httpd state=started'
[root@node1 ~]# ansible web -m service -a 'name=httpd state=stopped'
11.user子產品
[root@node1 ~]# ansible web -m user -a 'name=mrlapulga home=/tmp/mrlapulga/ shell=/bin/bash uid=2000 comment="test user" group=root'