當(dāng)前位置:
首頁 >
运维自动化------ansible搭建
發(fā)布時間:2025/7/25
34
豆豆
生活随笔
收集整理的這篇文章主要介紹了
运维自动化------ansible搭建
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
運維自動化發(fā)展歷程及技術(shù)應(yīng)用 IaaS基礎(chǔ)設(shè)施即服務(wù)(相當(dāng)于賣硬件) ,PaaS平臺即服務(wù)(賣操作系統(tǒng)),SaaS軟件即服務(wù)(賣軟件) 企業(yè)實際應(yīng)用場景分析 灰度環(huán)境(生產(chǎn)環(huán)境的一部分) 功能:在全量發(fā)布代碼前將代碼的功能面向少量精準(zhǔn)用戶發(fā)布的環(huán)境,可基于主機(jī)或用戶執(zhí)行灰度發(fā)布 案例:共100臺生產(chǎn)服務(wù)器,先發(fā)布其中的10臺服務(wù)器,這10臺服務(wù)器就是灰度服務(wù)器 灰度環(huán)境:往往該版本功能變更較大,為保險起見特意先讓一部分用戶優(yōu)化體驗該功能,待這部分用戶使用沒有重大問題的時候,再全量發(fā)布至所有服務(wù)器 程序發(fā)布 程序發(fā)布要求: 不能導(dǎo)致系統(tǒng)故障或造成系統(tǒng)完全不可用 不能影響用戶體驗 預(yù)發(fā)布驗證: 新版本的代碼先發(fā)布到服務(wù)器(跟線上環(huán)境配置完全相同,只是未接入到調(diào)度器) 灰度發(fā)布: 基于主機(jī),用戶,業(yè)務(wù) 發(fā)布路徑: /webapp/tuangou /webapp/tuangou-1.1 /webapp/tuangou-1.2 發(fā)布過程:在調(diào)度器上下線一批主機(jī)(標(biāo)記為maintanance狀態(tài)) --> 關(guān)閉服務(wù) --> 部署新版本的應(yīng)用程序 --> 啟動服務(wù) --> 在調(diào)度器上啟用這一批服務(wù)器 自動化灰度發(fā)布:腳本、發(fā)布 常用自動化運維工具 Ansible:python,Agentless,中小型應(yīng)用環(huán)境 (管理上百臺機(jī)器) 利用ssh協(xié)議遠(yuǎn)程來進(jìn)行管理,基于key驗證,把管理者的公鑰傳到被管理的主機(jī)上去, Saltstack:python,一般需部署agent(代理),執(zhí)行效率更高 (管理上千臺機(jī)器) Puppet:ruby, 功能強(qiáng)大,配置復(fù)雜,重型,適合大型環(huán)境 (管理上百臺機(jī)器) Fabric:python,agentless Chef: ruby,國內(nèi)應(yīng)用少 Cfengine func Ansible簡介 Ansible是一個簡單的自動化運維管理工具,基于Python語言實現(xiàn),由ParamikoPyYAML兩個關(guān)鍵模塊構(gòu)建,可用于自動化部署應(yīng)用、配置、編排task(持續(xù)交付、無宕機(jī)更等)。 Ansible官網(wǎng):https://www.ansible.com/ github地址:https://github.com/Ansible 特性 模塊化:調(diào)用特定的模塊,完成特定任務(wù),一千多個模塊 有Paramiko,PyYAML,Jinja2(模板語言)三個關(guān)鍵模塊 支持自定義模塊 基于Python語言實現(xiàn) 部署簡單,基于python和SSH(默認(rèn)已安裝)免代理,agentless 安全,基于OpenSSH 支持playbook編排任務(wù) 冪等性:一個任務(wù)執(zhí)行1遍和執(zhí)行n遍效果一樣,不因重復(fù)執(zhí)行帶來意外情況 無需代理不依賴PKI(無需ssl) 可使用任何編程語言寫模塊 AML格式,編排任務(wù),支持豐富的數(shù)據(jù)結(jié)構(gòu) 較強(qiáng)大的多層解決方案 Ansible主要組成部分 1:ANSIBLE PLAYBOOKS:任務(wù)劇本(任務(wù)集),編排定義Ansible任務(wù)集的配置文件,由Ansible順序 依次執(zhí)行,通常是JSON格式的YML文件 2:INVENTORY:Ansible管理主機(jī)的清單/etc/ansible/hosts 3:MODULES:Ansible執(zhí)行命令的功能模塊,多數(shù)為內(nèi)置核心模塊,也可自定義 4:PLUGINS:模塊功能的補(bǔ)充,如連接類型插件、循環(huán)插件、變量插件、過濾插件等,該功能不常用 5:API:供第三方程序調(diào)用的應(yīng)用程序編程接口 6:ANSIBLE:組合INVENTORY、API、MODULES、PLUGINS的綠框,可以理解為是ansible命令工 具,其為核心執(zhí)行工具 7:Ansible命令執(zhí)行來源: U7SER,普通用戶,即SYSTEM ADMINISTRATOR CMDB(配置管理數(shù)據(jù)庫) API 調(diào)用 PUBLIC/PRIVATE CLOUD API調(diào)用 USER-> Ansible Playbook -> Ansibile 8:利用ansible實現(xiàn)管理的方式: Ad-Hoc 即ansible命令,主要用于臨時命令使用場景 Ansible-playbook 主要用于長期規(guī)劃好的,大型項目的場景,需要有前提的規(guī)劃 9:Ansible-playbook(劇本)執(zhí)行過程: 將已有編排好的任務(wù)集寫入Ansible-Playbook 通過ansible-playbook命令分拆任務(wù)集至逐條ansible命令,按預(yù)定規(guī)則逐條執(zhí)行 10:Ansible主要操作對象: HOSTS主機(jī) NETWORKING網(wǎng)絡(luò)設(shè)備 11:注意事項 執(zhí)行ansible的主機(jī)一般稱為主控端,中控,master或堡壘機(jī) 主控端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 確認(rèn)安裝: ansible --version 配置文件 /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,(軟連接指向新版本,方便) /etc/ansible/hosts 主機(jī)清單 , /etc/ansible/roles/ 存放角色的目錄 程序 /usr/bin/ansible 主程序,臨時命令執(zhí)行工具 /usr/bin/ansible-doc 查看配置文檔,模塊功能查看工具,相當(dāng)于man命令 /usr/bin/ansible-galaxy(銀河) 下載/上傳優(yōu)秀代碼或Roles模塊的官網(wǎng)平臺 /usr/bin/ansible-playbook 定制自動化任務(wù),編排劇本工具/usr/bin/ansible-pull (拉取)遠(yuǎn)程執(zhí)行命令的工具 /usr/bin/ansible-vault 文件加密工具 /usr/bin/ansible-console 基于Console界面與用戶交互的執(zhí)行工具 主機(jī)清單inventory Inventory 主機(jī)清單 ansible的主要功用在于批量主機(jī)操作,為了便捷地使用其中的部分主機(jī),可以在inventory file中 將其分組命名 /etc/ansible/hosts文件格式 inventory文件遵循INI文件風(fēng)格,中括號中的字符為組名。可以將同一個主機(jī)同時歸并到多個不同的組中;此外,當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以在主機(jī)名稱之后使用冒號加端口號來標(biāo)明 ntp.magedu.com [webservers] www1.magedu.com:2222 www2.magedu.com [dbservers] db1.magedu.com db2.magedu.com db3.magedu.com 如果主機(jī)名稱遵循相似的命名模式,還可以使用列表的方式標(biāo)識各主機(jī) · 示例: [websrvs] www[01:100].example.com [dbsrvs] db-[a:f].example.com ansible 配置文件 Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默認(rèn)) [defaults] #inventory = /etc/ansible/hosts # 主機(jī)列表配置文件 #library = /usr/share/my_modules/ # 庫文件存放目錄 #remote_tmp = $HOME/.ansible/tmp #臨時py命令文件存放在遠(yuǎn)程主機(jī)目錄 #local_tmp = $HOME/.ansible/tmp # 本機(jī)的臨時命令執(zhí)行目錄 #forks = 5 # 默認(rèn)并發(fā)數(shù) #sudo_user = root # 默認(rèn)sudo 用戶 #ask_sudo_pass = True #每次執(zhí)行ansible命令是否詢問ssh密碼 #ask_pass = True #remote_port = 22 #host_key_checking = False # 檢查對應(yīng)服務(wù)器的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實現(xiàn)配置管理、應(yīng)用部署、任務(wù)執(zhí)行等功能,建議配置ansible端能基于密鑰認(rèn)證的方式聯(lián)系各被管理節(jié)點 ansible <host-pattern> [-m module_name] [-a args] (-a加參數(shù)) --version 顯示版本 -m module 指定模塊,默認(rèn)為command -v 詳細(xì)過程 –vv -vvv更詳細(xì) --list-hosts 顯示主機(jī)列表,可簡寫—list -k, --ask-pass 提示輸入ssh連接密碼,默認(rèn)Key驗證 -K, --ask-become-pass 提示輸入sudo時的口令 -C, --check 檢查,并不執(zhí)行 (測試) -T, --timeout=TIMEOUT 執(zhí)行命令的超時時間,默認(rèn)10s -u, --user=REMOTE_USER 執(zhí)行遠(yuǎn)程執(zhí)行的用戶 -b, --become 代替舊版的sudo 切換 一、環(huán)境準(zhǔn)備 centos7 192.168.30.110做主控端 192.168.30.100 、192.168.30.107 192.168.30.114 做被控端 二、搭建配置ansible [root@centos7 ~]# yum -y install ansible 查看版本信息 這里面的ping是ansible的ping模塊; 清單列表不包括本機(jī); 把要管理的主機(jī)加入到主機(jī)清單中 etc/ansible/hosts [root@centos7 ~]# ansible 192.168.30.100 -m ping 測試存活性是基于ssh服務(wù)的,基于密碼和key驗證,通常是基于key驗證;部署是把ssh的可以驗證做好 建議:在控制主機(jī)登錄主機(jī)的同時,如果不要每次都通過驗證登錄,則修改配置文件,默認(rèn)提供YES啟動日志的功能,手動注釋取消就行了 [root@centos7 ~]# vim /etc/ansible/ansible.cfg 在控制端主機(jī)生成公鑰,把公鑰傳到三臺被控制端主機(jī)上去,實現(xiàn)key驗證 可以對主機(jī)清單做分組 ansible的Host-pattern(主機(jī)列表) 匹配主機(jī)的列表 All :表示所有Inventory(主機(jī)清單)中的所有主機(jī) ansible all –m ping * :通配符 ansible “*” -m ping ansible 192.168.1.* -m ping ansible “*srvs” -m ping 或關(guān)系 ansible “websrvs:appsrvs” -m ping ansible “192.168.1.10:192.168.1.20” -m ping 邏輯與 ansible “websrvs:&dbsrvs” –m ping 在websrvs組并且在dbsrvs組中的主機(jī) 邏輯非 ansible ‘websrvs:!dbsrvs’ –m ping 在websrvs組,但不在dbsrvs組中的主機(jī) 注意:此處為單引號 綜合邏輯 ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ –m ping 正則表達(dá)式 ansible “websrvs:&dbsrvs” –m ping ansible “~(web|db).*\.magedu\.com” –m ping 邏輯與 ansible命令執(zhí)行過程 ansible命令執(zhí)行過程 1. 加載自己的配置文件 默認(rèn)/etc/ansible/ansible.cfg 2. 加載自己對應(yīng)的模塊文件,如command 3. 通過ansible將模塊或命令生成對應(yīng)的臨時py文件,并將該 文件傳輸至遠(yuǎn)程服務(wù)器的對應(yīng)執(zhí)行用戶$HOME/.ansible/tmp/ansible-tmp-數(shù)字/XXX.PY文件 4. 給文件+x執(zhí)行 5. 執(zhí)行并返回結(jié)果 6. 刪除臨時py文件,sleep 0退出 執(zhí)行狀態(tài): 綠色:執(zhí)行成功并且不需要做改變的操作 黃色:執(zhí)行成功并且對目標(biāo)主機(jī)做變更 紅色:執(zhí)行失敗 ansible使用示例 示例 sudo 切換身份默認(rèn)就是root, 以wang用戶執(zhí)行ping存活檢測 ansible all -m ping -u wang -k 以wang sudo至root執(zhí)行ping存活檢測(用wang用戶連接對方后,sudo到root身份執(zhí)行操作) ansible all -m ping -u wang –b -k 以wang sudo至mage用戶執(zhí)行ping存活檢測 ansible all -m ping -u wang –b -k --become-user mage 以wang sudo至root用戶執(zhí)行l(wèi)s ansible all -m command -u wang --become-user=root -a 'ls /root' -b –k -K ansible常用模塊 Command:在遠(yuǎn)程主機(jī)執(zhí)行命令,默認(rèn)模塊,可忽略-m選項 ansible srvs -m command -a ‘service vsftpd start’ ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功此命令 不支持 $VARNAME < > | ; & 等,用shell模塊實現(xiàn) Shell:和command相似,用shell執(zhí)行命令 vim /etc/ansible/ansible.cfg 1:ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’ :2:調(diào)用bash執(zhí)行命令 類似 cat /tmp/stanley.md | awk -F‘|’ ‘{print $1,$2}’ &>/tmp/example.txt 這些復(fù)雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠(yuǎn)程,執(zhí)行,再把需要的結(jié)果拉回執(zhí)行命令的機(jī)器 Script:運行腳本 腳本模式、用于批量執(zhí)行腳本 -a "/PATH/TO/SCRIPT_FILE“ snsible websrvs -m script -a f1.sh 在控制端的主機(jī)上編寫一個腳本,但是運行是在被控制端的主機(jī)上 Copy:從服務(wù)器復(fù)制文件到客戶端, ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600,backup=yes” 如目標(biāo)存在,默認(rèn)覆蓋,此處指定先備份 ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 利用內(nèi)容,直接生成目標(biāo)文件 復(fù)制模塊、批量復(fù)制,拷貝文件到遠(yuǎn)程主機(jī) ansible [主機(jī)ip、主機(jī)組] -m copy -a "src=源文件 dest=目標(biāo)路徑 owner=所有者 mode=權(quán)限 backup=yes/no是否備份" 備份文件名稱比較長的 Fetch(抓取):把遠(yuǎn)程的主機(jī)文件抓取到控住端的主機(jī)上,copy相反,目錄可先tar ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’ File:設(shè)置文件屬性 (刪除文件的效果,創(chuàng)建軟硬連接) 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(遞歸的刪除,缺席)' 已經(jīng)刪除data文件夾 還可以[root@centos7 ~]# ansible all -m file -a 'path=/data/test.txt state=touch' 在被控制端的主機(jī)上創(chuàng)建test.txt 文件 創(chuàng)建軟連接 Hostname:管理主機(jī)名 ansible node1 -m hostname -a “name=websrv” 永久生效,但hosts文件沒有被改 Cron:計劃任務(wù) [root@centos7 ~]# ansible-doc -s cron 調(diào)用模塊 支持時間:minute,hour,day,month,weekday ansible srv -m cron -a “minute=*/5(每5分鐘) job(后跟執(zhí)行的命令)=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 創(chuàng)建任務(wù) ansible srv -m cron -a ‘state=absent name=Synctime’ 刪除任務(wù) 結(jié)果 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:管理服務(wù) 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‘ 刪除用戶及家目錄等數(shù)據(jù) [root@centos7 ~]# ansible all -m user -a 'name=testuser(用戶名) system=yes(系統(tǒng)賬號) 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劇本框架工具,根據(jù)自己的需求下載相關(guān)的角色) 連接 https://galaxy.ansible.com 下載相應(yīng)的roles 列出所有已安裝的galaxy ansible-galaxy list(列出有哪些裝好的角色) 安裝galaxy ansible-galaxy install geerlingguy.redis 刪除galaxy ansible-galaxy remove geerlingguy.redis ansible-pull 推送命令至遠(yuǎn)程,效率無限提升,對運維要求較高 Ansible-playbook(劇本) ansible-playbook hello.yml(劇本文件) cat hello.yml #hello world yml file - hosts(主機(jī)清單): websrvs (主機(jī)清單的分組名) remote_user: root (遠(yuǎn)程連接以root身份) tasks:(任務(wù)) - name: hello world(之后要做的事) ommand: /usr/bin/wall hello world (是-a后的所有的操作) [root@centos7 ~]# vim hello.yml [root@centos7 ~]# ansible-playbook hello.yml 用次命令執(zhí)行 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 創(chuàng)建新文件 Ansible-console:2.0+新增,可交互執(zhí)行命令,支持tab root@test (2)[f:10] $ 執(zhí)行用戶@當(dāng)前操作的主機(jī)組 (當(dāng)前組的主機(jī)數(shù)量)[f:并發(fā)數(shù)]$ 設(shè)置并發(fā)數(shù): forks n 例如: forks 10 切換組: cd 主機(jī)組 例如: cd web 列出當(dāng)前組主機(jī)列表: list 列出所有的內(nèi)置命令: ?或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?
轉(zhuǎn)載于:https://www.cnblogs.com/wang-jin/p/9333333.html
總結(jié)
以上是生活随笔為你收集整理的运维自动化------ansible搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一次写小程序,遇到的坑
- 下一篇: 【清北前紧急补课3】水题集锦