運維自動化------ansible搭建

 

運維自動化發展歷程及技術應用
IaaS基礎設施即服務(至關於賣硬件) ,PaaS平臺即服務(賣操做系統),SaaS軟件即服務(賣軟件)
企業實際應用場景分析
灰度環境(生產環境的一部分)
功能:在全量發佈代碼前將代碼的功能面向少許精準用戶發佈的環境,可基於主機或用戶執行灰度發佈
案例:共100臺生產服務器,先發布其中的10臺服務器,這10臺服務器就是灰度服務器
灰度環境:每每該版本功能變動較大,爲保險起見特地先讓一部分用戶優化 體驗該功能,待這部分用戶使用沒有重大問題的時候,再全量發佈至全部服務器
程序發佈
程序發佈要求:
不能致使系統故障或形成系統徹底不可用
不能影響用戶體驗
預發佈驗證:
新版本的代碼先發布到服務器(跟線上環境配置徹底相同,只是未接入到調度器)
灰度發佈:
基於主機,用戶,業務
發佈路徑:
/webapp/tuangou
/webapp/tuangou-1.1
/webapp/tuangou-1.2
發佈過程:在調度器上下線一批主機(標記爲maintanance狀態) --> 關閉服務 --> 部署新版本的應用程序 --> 啓動服務 --> 在調度器上啓用這一批服務器
自動化灰度發佈:腳本、發佈
 
經常使用自動化運維工具
Ansible:python,Agentless,中小型應用環境 (管理上百臺機器)
利用ssh協議遠程來進行管理,基於key驗證,把管理者的公鑰傳到被管理的主機上去,
Saltstack:python,通常需部署agent(代理),執行效率更高 (管理上千臺機器)
Puppet:ruby, 功能強大,配置複雜,重型,適合大型環境 (管理上百臺機器)
Fabric:python,agentless
Chef: ruby,國內應用少
Cfengine
func
Ansible簡介
Ansible是一個簡單的自動化運維管理工具,基於Python語言實現,由ParamikoPyYAML兩個關鍵模塊構建,可用於自動化部署應用、配置、編排task(持續交付、無宕機更等)。
   Ansible官網:https://www.ansible.com/
   github地址:https://github.com/Ansible
特性
  模塊化:調用特定的模塊,完成特定任務, 一千多個模塊
  有Paramiko,PyYAML,Jinja2(模板語言)三個關鍵模塊
  支持自定義模塊
  基於Python語言實現
  部署簡單,基於python和SSH(默認已安裝) 免代理,agentless
  安全,基於OpenSSH
  支持playbook編排任務
冪等性:一個任務執行1遍和執行n遍效果同樣,不因重複執行帶來意外狀況
  無需代理不依賴PKI(無需ssl)
  可以使用任何編程語言寫模塊
  AML格式,編排任務,支持豐富的數據結構
  較強大的多層解決方案
Ansible主要組成部分
1:ANSIBLE PLAYBOOKS:任務劇本(任務集),編排定義Ansible任務集的配置文件,由Ansible順序 依次執行,一般是JSON格式的YML文件
2:INVENTORY: Ansible管理主機的清單/etc/ansible/hosts
3:MODULES:Ansible執行命令的功能模塊,多數爲內置核心模塊,也可自定義
4:PLUGINS:模塊功能的補充,如鏈接類型插件、循環插件、變量插件、過濾插件等,該功能不經常使用
5:API:供第三方程序調用的應用程序編程接口
6:ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,能夠理解爲是ansible命令工 具,其爲核心執行工具
7:Ansible命令執行來源:
U7SER,普通用戶,即SYSTEM ADMINISTRATOR
CMDB(配置管理數據庫) API 調用
PUBLIC/PRIVATE CLOUD API調用
USER-> Ansible Playbook -> Ansibile
8:利用ansible實現管理的方式:
Ad-Hoc 即ansible命令,主要用於臨時命令使用場景
Ansible-playbook 主要用於長期規劃好的,大型項目的場景,須要有前提的規劃
9:Ansible-playbook(劇本)執行過程:
將已有編排好的任務集寫入Ansible-Playbook
經過ansible-playbook命令分拆任務集至逐條ansible命令,按預約規則逐條執行
10:Ansible主要操做對象:
HOSTS主機
NETWORKING網絡設備
11:注意事項
執行ansible的主機通常稱爲主控端,中控,master或堡壘機
主控端Python版本須要2.6或以上
被控端Python版本小於2.4須要安裝python-simplejson
被控端如開啓SELinux須要安裝libselinux-python
windows不能作爲主控端
安裝
rpm包安裝: EPEL源
yum install ansible
編譯安裝:
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
Git方式:
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
pip安裝: pip是安裝Python包的管理器,相似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip install --upgrade pip
pip install ansible --upgrade
確認安裝: ansible --version
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工做特性,( 軟鏈接指向新版本,方便)
/etc/ansible/hosts 主機清單 ,
/etc/ansible/roles/ 存放角色的目錄
程序
/usr/bin/ansible 主程序,臨時命令執行工具
/usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具, 至關於man命令
/usr/bin/ansible-galaxy (銀河) 下載/上傳優秀代碼或Roles模塊的官網平臺
/usr/bin/ansible-playbook 定製自動化任務,編排劇本工具/usr/bin/ansible- pull (拉取)遠程執行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基於Console界面與用戶交互的執行工具
主機清單inventory
Inventory 主機清單
ansible的主要功用在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在inventory file中 將其分組命名
/etc/ansible/hosts文件格式
inventory文件遵循INI文件風格,中括號中的字符爲組名。能夠將同一個主機同時歸併到多個不一樣的組中;此外,當如若目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號來標明
ntp.magedu.com
[webservers]
www1.magedu.com:2222
www2.magedu.com
[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com
若是主機名稱遵循類似的命名模式,還可使用列表的方式標識各主機
· 示例:
[websrvs]
www[01:100].example.com
[dbsrvs]
db-[a:f].example.com
ansible 配置文件
Ansible 配置文件/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 # 默認併發數
#sudo_user = root # 默認sudo 用戶
#ask_sudo_pass = True #每次執行ansible命令是否詢問ssh密碼
#ask_pass = True
#remote_port = 22
#host_key_checking = False # 檢查對應服務器的host_key,建議取消註釋
#log_path=/var/log/ansible.log #日誌文件
 
Ansible系列命令
ansible ansible-doc ansible-playbook ansible-vault
  ansible-console ansible-galaxy ansible-pull
  ansible-doc: 顯示模塊幫助
ansible-doc [options] [module...]
-a 顯示全部模塊的文檔
-l, --list 列出可用模塊
-s, --snippet顯示指定模塊的playbook片斷
示例:
ansible-doc –l 列出全部模塊
ansible-doc ping 查看指定模塊幫助用法
ansible-doc –s ping 查看指定模塊幫助用法
 
ansible
ansible經過ssh實現配置管理、應用部署、任務執行等功能,建議配置ansible端能基於密鑰認證的方式聯繫各被管理節點
ansible <host-pattern> [-m module_name] [-a args] (-a加參數)
--version 顯示版本
-m module 指定模塊,默認爲command
-v 詳細過程 –vv -vvv更詳細
--list-hosts 顯示主機列表,可簡寫—list
-k, --ask-pass 提示輸入ssh鏈接密碼,默認Key驗證
-K, --ask-become-pass 提示輸入 sudo時的口令
-C, --check 檢查,並不執行 (測試)
-T, --timeout=TIMEOUT 執行命令的超時時間,默認10s
-u, --user=REMOTE_USER 執行遠程執行的用戶
    -b, --become 代替舊版的sudo 切換
1、環境準備
centos7 192.168.30.110作主控端
192.168.30.100 、192.168.30.107 192.168.30.114 作被控端
2、搭建配置ansible
[root@centos7 ~]# yum -y install ansible
查看版本信息
這裏面的ping是ansible的ping模塊;
清單列表不包括本機;
把要管理的主機加入到主機清單中 etc/ansible/hosts
 
[root@centos7 ~]# ansible 192.168.30.100 -m ping
測試存活性是基於ssh服務的,基於密碼和key驗證,一般是基於key驗證;部署是把ssh的能夠驗證作好
 
 
建議:在控制主機登陸主機的同時,若是不要每次都經過驗證登陸,則修改配置文件,默認提供YES啓動日誌的功能,手動註釋取消就好了
[root@centos7 ~]# vim /etc/ansible/ansible.cfg
 
在控制端主機生成公鑰,把公鑰傳到三臺被控制端主機上去,實現key驗證
 
能夠對主機清單作分組
 
 
ansible的Host-pattern(主機列表)
匹配主機的列表
All :表示全部Inventory(主機清單)中的全部主機
ansible all –m ping
* :通配符
ansible 「*」 -m ping
ansible 192.168.1.* -m ping
ansible 「*srvs」 -m ping
或關係
ansible 「websrvs:appsrvs」 -m ping
ansible 「192.168.1.10:192.168.1.20」 -m ping
邏輯與
ansible 「websrvs:&dbsrvs」 –m ping
在websrvs組而且在dbsrvs組中的主機
邏輯非
ansible ‘websrvs:!dbsrvs’ –m ping
在websrvs組,但不在dbsrvs組中的主機
注意:此處爲單引號
綜合邏輯
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping
正則表達式
ansible 「websrvs:&dbsrvs」 –m ping
ansible 「~(web|db).*\.magedu\.com」 –m ping
邏輯與
 
ansible命令執行過程
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退出
執行狀態:
綠色:執行成功而且不須要作改變的操做
黃色:執行成功而且對目標主機作變動
紅色:執行失敗
 
ansible使用示例
示例 sudo 切換身份默認就是root,
以wang用戶執行ping存活檢測
ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測 (用wang用戶鏈接對方後,sudo到root身份執行操做)
ansible all -m ping -u wang –b -k
以wang sudo至mage用戶執行ping存活檢測
ansible all -m ping -u wang –b -k --become-user mage
以wang sudo至root用戶執行ls
ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K
ansible經常使用模塊
Command:在遠程主機執行命令,默認模塊,可忽略-m選項
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功此命令
不支持 $VARNAME < > | ; & 等,用shell模塊實現
 
Shell:和command類似,用shell執行命令
vim /etc/ansible/ansible.cfg
1:ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
:2:調用bash執行命令 相似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 這些複雜命令,即便使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把須要的結果拉回執行命令的機器
 
Script:運行腳本
腳本模式、用於批量執行腳本
-a "/PATH/TO/SCRIPT_FILE「
snsible websrvs -m script -a f1.sh
在控制端的主機上編寫一個腳本,可是運行是在被控制端的主機上
 
Copy:從服務器複製文件到客戶端,
ansible srv -m copy -a 「src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600,backup=yes」
  如目標存在,默認覆蓋,此處指定先備份
ansible srv -m copy -a 「content=‘test content\n’ dest=/tmp/f1.txt」 利用內容,直接生成目標文件
複製模塊、批量複製,拷貝文件到遠程主機
ansible [主機ip、主機組] -m copy -a "src=源文件 dest=目標路徑 owner=全部者 mode=權限 backup=yes/no是否備份"
 
備份文件名稱比較長的
 
Fetch(抓取):把遠程的主機文件抓取到控住端的主機上,copy相反,目錄可先tar
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
 
 
File:設置文件屬性 (刪除文件的效果,建立軟硬鏈接)
ansible srv -m file -a "path(管理的文件)=/root/a.sh owner=wang mode=755「
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link (軟鏈接)
ansible all -m file -a 'path(管理的文件)=/data state=absent(遞歸的刪除,缺席)'
已經刪除data文件夾
還能夠[root@centos7 ~]# ansible all -m file -a 'path=/data/test.txt state=touch'
在被控制端的主機上建立test.txt 文件
建立軟鏈接
 
 
Hostname:管理主機名
ansible node1 -m hostname -a 「name=websrv」
永久生效,但hosts文件沒有被改
 
Cron:計劃任務
[root@centos7 ~]# ansible-doc -s cron 調用模塊
支持時間:minute,hour,day,month,weekday
ansible srv -m cron -a 「minute=*/5 (每5分鐘) job(後跟執行的命令)=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’
 
 
name=Synctime」 建立任務
 
ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務
結果
 
Yum:管理包
ansible srv( all) -m yum -a ‘name=httpd state=latest(最新版)’ 安裝
[root@centos7 ~]# scp /etc/yum.repos.d/media.repo 192.168.30.107:/etc/yum.
repos.d/media.repo 100% 140 64.3KB/s 00:00
[root@centos7 ~]# ansible all -m yum -a 'name=httpd state=present'
ansible srv -m yum -a ‘name=httpd state=absent’ 刪除
ansible經常使用模塊
 
Service:管理服務 ansible-doc -s service
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=started'
 
ansible all –m service –a ‘name=httpd state=reloaded’
ansible all -m service -a 'name=httpd state=restarted'
 
User:管理用戶
ansible all-m user -a 'name=user1 comment=「test user」 uid=2048 home=/app/user1 group=root‘
ansible all -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
ansible all -m user -a ‘name=user1 state=absent remove=yes‘ 刪除用戶及家目錄等數據
[root@centos7 ~]# ansible all -m user -a 'name=testuser(用戶名) system=yes(系統帳號) groups(組)=wang,bin shell=/bin/csh' (shell類型)
 
 
Group:管理組
ansible srv -m group -a "name=testgroup(組名) system=yes「
ansible srv -m group -a "name=testgroup state= absen(刪除組)
 
ansible系列命令
ansible-galaxy (人們寫的劇本,下載ansible劇本框架工具,根據本身的需求下載相關的角色)
鏈接 https://galaxy.ansible.com 下載相應的roles
列出全部已安裝的galaxy
ansible-galaxy list(列出有哪些裝好的角色)
安裝galaxy
ansible-galaxy install geerlingguy.redis
刪除galaxy
ansible-galaxy remove geerlingguy.redis
ansible-pull
推送命令至遠程,效率無限提高,對運維要求較高
Ansible-playbook(劇本)
ansible-playbook hello.yml (劇本文件)
 
cat hello.yml
#hello world yml file
      - hosts( 主機清單): websrvs (主機清單的分組名)
        remote_user: root (遠程鏈接以root身份)
  tasks: (任務)
      - name: hello world (以後要作的事)
        ommand: /usr/bin/wall hello world (是-a後的全部的操做)
 
[root@centos7 ~]# vim hello.yml
[root@centos7 ~]# ansible-playbook hello.yml 用次命令執行
 
  Ansible-vault
功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
ansible-vault decrypt hello.yml 解密
ansible-vault view hello.yml 查看
ansible-vault edit hello.yml 編輯加密文件
ansible-vault rekey hello.yml 修改口令
ansible-vault create new.yml 建立新文件
Ansible-console:2.0+新增,可交互執行命令,支持tab
root@test (2)[f:10] $
執行用戶@當前操做的主機組 (當前組的主機數量)[f:併發數]$
設置併發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出全部的內置命令: ?或help
示例:
root@all (2)[f:5]$ list
root@all (2)[f:5]$ cd appsrvs
root@appsrvs (2)[f:5]$ list
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started
相關文章
相關標籤/搜索