一 基礎使用
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 root@172.18.67.12 [root@node1 ~]# ssh-copy-id root@172.18.67.13
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'