自動化運維工具
shell腳本/Ansible(無客戶端)/Saltstack(master-minion)
回顧服務器部署的流程:
買雲主機->環境部署->軟件部署->配置部署->啟動服務->測試->加入集群
1.Ansible基本概述
ansible是一個配置管理系統configuration management system你只需要可以使用ssh訪問你的服務器或設備就行
Ansible能做什么
可以幫助我們完成一些批量任務,或者完成一些需要經常重復的工作。
Ansible軟件特點
1.ansible不需要單獨安裝客戶端,SSH相當於ansible客戶端
2.ansible不需要啟動任何服務,僅需安裝對應工具即可
3.ansible依賴大量的python模塊實現批量管理
4.ansible配置文件/etc/ansible/ansible.cfg
Ansible基礎架構
1.連接插件(connector plugins)用於連接主機 用來連接被管理端
2.核心模塊(core modules)連接主機實現操作,它依賴於具體的模塊來做具體的事情
3.自定義模塊(custom modules)根據自己的需求編寫具體的模塊
4.插件(plugins)完成模塊功能的補充
5.劇本(playbooks) ansible的配置文件,將多個任務定義在劇本中,由ansible自動執行
6.主機清單(host inventory)定義ansible需要操作主機的范圍
最重要的一點是ansible 事模塊化的 它所有的操作都依賴於模塊
2.Ansible配置
環境部署
m01 172.16.1.71 ansible管理端 backup 172.16.1.51 ansible受控端 nfs 172.16.1.41 ansible受控端 web01 172.16.1.7 ansible受控端
1).安裝ansible 一定先部署好epel源 [root@m01 ~]# yum install ansible 查看版本 [root@m01 ~]# ansible --version ansible 2.9.2 2).ssh部署公鑰 [root@m01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa -C anlione [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41 [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.51 [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7 3).配置ansible主機清單 主機清單配置文件/etc/ansible/hosts [root@m01 ~]# vim /etc/ansible/hosts .... [oldboy] 172.16.1.7 172.16.1.51 172.16.1.41 4)驗證ansible [root@m01 ~]# ansible oldboy -m ping 172.16.1.7 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 172.16.1.51 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 172.16.1.41 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } [root@m01 ~]# ansible oldboy -m command -a "hostname" 172.16.1.41 | CHANGED | rc=0 >> nfs 172.16.1.51 | CHANGED | rc=0 >> backup 172.16.1.7 | CHANGED | rc=0 >> web01
3.Ansible清單管理
inventory文件通常用於定義管理主機的認證信息,例如ssh登錄用戶名、密碼以及key相關信息。如何配置inventory文件
主機
1.支持主機名通配以及正則表達式,例如web[1:3].oldboy.com
2.支持基於非標准的ssh端口,例如web01.oldboy.com:6666
3.支持指定變量,可對個別主機特別配置,如登錄用戶,密碼等
主機組
1.支持嵌套組,例如[oldboy:children],那么在oldboy模塊下面的組都會被game所包含
2.支持指定變量,例如[oldboy:vars]在下面指定變量
//指定主機組 [backup] 172.16.1.51 [nfs] 172.16.1.41 [web] 172.16.1.7 [oldboy:children] nfs backup web 驗證: ansible oldboy -m ping ansible nfs -m ping ansible backup -m ping //指定變量 [oldboy] 172.16.1.7 172.16.1.51 172.16.1.41 [oldboy:vars] ansible_ssh_pass=123456
Ansible內置變量
4.Ansible常用模塊
安裝軟件包
修改配置文件
創建程序用戶組
創建程序用戶組
創建目錄,並修改所屬和權限
啟動服務
掛載
測試
在ansible中是指需要快速執行一條命令,並且不需要保存的命令,對於復雜的命令為playbook
Ansible注意事項->提示顏色信息說明
翔黃色:對遠程節點進行相應修改
帽子綠:對遠程節點不進行相應修改,或者只對遠程節點信息進行查看
深紅色:操作執行命令有異常
淺紫色:表示對命令執行發出警告信息(可能存在的問題,給你一下建議)
1.command模塊和shell模塊
# 默認模塊,執行命令 [root@m01 ~]# ansible oldboy -a "hostname" # 如果需要一些管道操作,則使用shell [root@m01 ~]# ansible oldboy -m shell -a "df -h | grep /$" -f 3 # -f =forks /etc/ansible/ansible.cfg #結果返回的數量 注意:command和shell模塊的區別: command只能調用一條指令 shell可以使用管道 不支持別名
舉例:統一創建用戶oldboy,並修改密碼為123
[root@m01 ~]# ansible oldboy -m shell -a "useradd oldboy" [root@m01 ~]# ansible oldboy -m command -a "echo 123 | passwd --stdin oldboy" 172.16.1.41 | CHANGED | rc=0 >> 123 | passwd --stdin oldboy 172.16.1.51 | CHANGED | rc=0 >> 123 | passwd --stdin oldboy 172.16.1.7 | CHANGED | rc=0 >> 123 | passwd --stdin oldboy [root@m01 ~]# ansible oldboy -m shell -a "echo 123 | passwd --stdin oldboy"
2.yum模塊
[root@m01 ~]# ansible web -m yum -a "name=httpd state=installed" name ---指定要安裝的軟件包名稱,如果有多個,用","隔開 state ---指定使用yum的方法 installed,present --安裝軟件包 removed,absent --移除軟件包 latest --安裝最新軟件包
3.copy模塊
# 推送文件模塊 [root@m01 ~]# ansible oldboy -m copy -a "src=/tmp/test dest=/etc/hosts" # 在推送覆蓋遠程端文件前,對遠端已有文件進行備份,按照時間信息備份 [root@m01 ~]# ansible oldboy -m copy -a "src=/tmp/test dest=/etc/hosts backup=yes" # 直接向遠端文件內寫入數據信息,並且會覆蓋遠端文件內原有數據信息 [root@m01 ~]# ansible oldboy -m copy -a "content='oldboy' dest=/tmp/oldboy" src ---推送數據的源文件信息 dest ---推送數據的目標路徑 backup ---對推送傳輸過去的文件,進行備份 content ---直接批量在管理端文件中添加內容 group ---將本地文件推送到遠端,指定文件屬組信息 owner ---將本地文件推送到遠端,指定文件屬主信息 mode ---將本地文件推送到遠端,指定文件權限信息
案例1:批量推送hosts文件,並備份
cat: /etc/host: 沒有那個文件或目錄 [root@m01 ~]# cat /etc/hosts 172.16.1.7 web01 172.16.1.41 nfs 172.16.1.51 backup 172.16.1.71 m01 [root@m01 ~]# ansible oldboy -m copy -a "src=/etc/hosts dest=/etc/hosts backup=yes"
案例2:添加rsync認證文件和rsync客戶端密碼
添加rsync服務端認證文件 [root@m01 ~]# ansible backup -m copy -a "content='rsync_backup:1' dest=/etc/rsync.passwd group=root owner=root mode=600" 驗證: [root@m01 ~]# ansible backup -m shell -a "ls -l /etc/rsync.passwd" 172.16.1.51 | CHANGED | rc=0 >> -rw------- 1 root root 14 1月 24 23:32 /etc/rsync.passwd [root@m01 ~]# ansible backup -m shell -a "cat /etc/rsync.passwd" 172.16.1.51 | CHANGED | rc=0 >> rsync_backup:1 添加rsync客戶端密碼文件 [root@m01 ~]# ansible oldboy -m copy -a "content='1' dest=/etc/rsync.pass group=root owner=root mode=600" 驗證: [root@m01 ~]# ansible oldboy -m shell -a "cat /etc/rsync.pass" 172.16.1.7 | CHANGED | rc=0 >> 1 [root@m01 ~]# ansible oldboy -m shell -a "ls -l /etc/rsync.pass" 172.16.1.41 | CHANGED | rc=0 >> -rw------- 1 root root 1 1月 24 23:35 /etc/rsync.pass
4.service模塊
[root@m01 ~]# ansible oldboy -m service -a "name=crond state=started enabled=yes" name # 定義要啟動服務的名稱 state # 指定服務狀態時停止或是允許,停止和運行指令要寫過去時 started # 啟動 stopped # 停止 restarted # 重啟 reloaded # 重載 enabled # 是否讓服務開啟自啟動
案例1:啟動web01的httpd服務,並添加一個首頁文件,通過瀏覽器可以訪問
[root@m01 ~]# ansible web -m service -a "name=httpd state=started enabled=yes" [root@m01 ~]# ansible web -m copy -a "content='11111' dest=/var/www/html/index.html"