ansible背景
1.什么是ansible?
ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。
2.ansible的是怎么工作的?
ansible基礎
1.ansible安裝
yum install wget -y #安裝wget wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下載epel源文件 yum install ansible -y #安裝ansible
2.ansible的命令格式
-a MODULE_ARGS, --args=MODULE_ARGS #模塊參數 -C, --check #白跑一次,不做任何改變 -f FORKS, --forks=FORKS #指定進程數,做並發用 --list-hosts #列出主機 -m MODULE_NAME #模塊名稱 --syntax-check #檢查語法 -k, --ask-pass ask for connection password #指定密碼
3.查看ansible生成的配置文件
rpm -ql ansible
配置hosts文件,比如我有四台機器 ip段 192.168.220.133/134/135/136,此時安裝ansible機器為192.168.220.133,以下配置
vi /etc/ansible/hosts
192.168.220.134 192.168.220.135 192.168.220.136 #將這3個機器ip寫入hosts文件中
4.ansible如何通過ssh與遠程服務器連接?
第一種: 密碼 ssh root@192.168.220.133 -->輸入root密碼即可
第二種:秘鑰 (推薦)
- ssh -keygen #生成秘鑰
- ssh-copy-id root@192.168.220.134 #將秘鑰文件復制到遠程主機
當通過ansible控制量級比較大的機器的時候,使用秘鑰連接的方法最為快捷方便
5.ansible的第一個命令ping
ping走的是icmp協議
ansible 192.168.220.134 -m ping
#反饋如下便能建立連接 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" }
以此類推 ...
ansible 192.168.220.135 -m ping
ansible 192.168.220.136 -m ping
ansible all -m ping --->所有機器,hosts文件
ansible 192.168.220.135,192.168.220.136 -m ping --->探測部分機器
6.ansible分組查看機器
#在hosts文件中寫入以下配置 [web] 192.168.220.134 192.168.220.135 [cache] 192.168.220.135 192.168.220.136 [db] 192.168.220.134 192.168.220.135 192.168.220.136
ansible web --list-hosts #用來獲取符合條件的主機
#反饋情況為: [root@localhost ~]# ansible web --list-hosts hosts (2): 192.168.220.135 192.168.220.134
ansible web -m ping #探測web組內的所有機器
ansible分組並集
ansible web,cache -m ping #探測web,cache兩個組的並集機器
[root@localhost ~]# ansible web,cache,db -m ping 192.168.220.135 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.220.136 | SUCCESS => { "changed": false, "ping": "pong" } #兩者組內所有
ansible分組交集
- ansible 'web:cache' -m ping #獲取web cache兩個組交集的機器
- ansible 'web:&cache' -m ping #獲取web cache兩個組交集的機器
[root@localhost ~]# ansible 'web:&cache' -m ping 192.168.220.135 | SUCCESS => { "changed": false, "ping": "pong" } #兩者分組中共有的
ansible分組差集
ansible 'web:!cache' -m ping #獲取web cache兩個組差集的機器
[root@localhost ~]# ansible 'web:!cache' -m ping 192.168.220.134 | SUCCESS => { "changed": false, "ping": "pong" }
#兩者分組中不一樣的,表現為前者分組中機器為后者沒有,
弱口令校驗
服務器密碼符合規則:
必須有大小寫字母,數字,特殊字符;
密碼必須12位以上;
密碼3個月輪換;
host-pattern的格式
- 單個主機
- 單個組
- 多個組
#交集 "web:&cache" #並集 "web:cache" "web,cache" #差集 "web:!&cache"
- 所有機器 all
- 多個主機
ansible常用模塊
獲取模塊的幫助信息
[root@localhost ~]# ansible-doc -h # 顯示全部信息 Usage: ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin] -j, --json #以json的方式返回所有模塊的信息 -l # 列出所有的模塊 -s, --snippet # 以片段式顯示模塊的幫助信息 ansible-doc -l |wc -l #統計ansible的模塊 2080
1.command模塊
執行命令,不支持特殊字符,如$ & < > | ;
#參數 chdir #切換目錄 一般編譯安裝使用 creates #判斷是否存在,如果存在就 不 執行,不存在,就執行 removes #與creates正好相反 ansible web -m command -a 'pwd' #執行web組所有機器pwd命令 ,拿到所有機器的 /root -m表示調用模塊, -a 表示參數 ansible web -m command -a "ls /tmp" #執行web組所有機器查看tmp目錄下的文件 ansible web -m command -a "chdir=/tmp pwd" #切換目錄到/tmp下,一般編譯安裝 ansible web -m command -a "creates=/tmp pwd" #不被執行,直接跳過 ,因為/tmp已存在 ansible web -m command -a "creates=/tmp2 pwd" #執行,因為/tmp2不存在 ansible web -m command -a "creates=/tmp2 mkdir /data" #會被執行,並且創建/data目錄,因為/tmp2不存在 ansible web -m command -a "removes=/tmp2 pwd" #不執行,因為tmp2不存在 ansible web -m command -a "removes=/tmp pwd" #執行
補充:
#查看用戶是否被成功創建 1. ll /home 2. tail -1 /etc/passwd #查看passwd文件(存放密碼)最后一行 3. tail /etc/shadow #查看shadow(存放用戶信息) 4. id coco #查詢指定用戶id #給用戶設置密碼,不需要二次確認 先創建一個用戶 useradd Sheldon echo "ni666" |passwd --stdin Sheldon #單引號和雙引號在echo命令的不同 [root@localhost ~]# name=coco [root@localhost ~]# echo "$name" coco [root@localhost ~]# echo '$name' $coco
2.shell模塊
執行遠程機器上的shell腳本或python腳本
ansible web -m shell -a "echo 'coco'|passwd --stdin coco " #給遠程機器設置用戶密碼,前提是遠程主機上有coco賬戶 # shell 腳本 要在文件頂部寫上#!/bin/bash ansible 192.168.220.134 -m shell -a "bash /data/a.sh" #執行shell a.sh腳本內容,前提是該機器有這個文件,並有內容 #示例1 ansible 192.168.220.134 -m shell -a "chmod u+x /data/a.sh" #先遠程將a.sh腳本改成可執行 ansible 192.168.220.134 -m shell -a "/data/a.sh" #遠程執行腳本 # python腳本 開頭寫上如下兩句 #!/bin/env python #coding:utf-8 ansible 192.168.220.134 -m shell -a "python /root/b.py" #調用python解釋器運行 ansible 192.168.220.134 -m shell -a " /root/b.py" #自己將該目錄下的b.py權限設置為可執行的即可 chmod u+x /root/b.py
3.script模塊
執行的是管控機/本地的腳本
ansible db -m script -a "python /root/a.py" #執行的是本地的腳本,管控機上的腳本 ansible db -m script -a "creates=/root/a.py /root/a.sh" # 判斷是遠程主機是否存在,如果存在,就不執行,如果不存在,就執行 ansible db -m script -a "removes=/root/a.py /root/a.sh" # 判斷是遠程主機是否存在,如果存在,就不執行,如果不存在,就執行 #以上也就是多了個遠程主機的條件,但是執行的是本地的腳本
4.copy模塊
將本地文件復制到遠程機上
#參數 backup #創建備份文件,以時間戳結尾 content #直接寫內容 dest #目標地址 group #文件的屬組 mode #文件的權限W2 R4 X1 owner #文件的屬主 src #源文件 ansible db -m copy -a "src=/root/a.py dest=/root/a.py" #復制本地文件到遠程主機 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755" #復制文件到遠程主機指定路徑,並且改變文件權限 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco" #復制文件到遠程主機指定路徑,改變文件權限 屬主,根據md5值進行比對,注意coco需要在遠程主機建立該用戶. ansible db -m copy -a "src=/etc/init.d dest=/tmp/" #復制文件夾 ansible db -m copy -a "src=/etc/init.d/ dest=/tmp/" #復制文件夾下面的所有文件 ansible db -m copy -a "src=/etc/init.d dest=/tmp/ owner=coco " #復制文件夾,並改變文件夾的屬性,文件夾的文件的屬性也會跟着改變 ansible db -m copy -a "content='生活需要勇氣' dest=/tmp/a.sh" #覆蓋寫入文字,慎用 ansible db -m copy -a "src=/root/a.py dest=/data/a.py mode=755 owner=coco backup=yes" #注意: 備份文件,如果遠程機器上沒有要備份的文件,即使指定了backup=yes也不會去備份文件
5.file模塊
在遠程主機上創建文件,文件夾,軟連接,硬鏈接
#參數 access_time #訪問事件 group #屬組 mode #權限 owner #屬主 path #路徑 src #原文件,link和hard的時候使用 state: directory 文件夾 file touch 空文件 link 軟連接: hard 硬鏈接 absent 刪除 補充: #軟連接:windows的快捷方式 ln -s 原文件 目標文件 源文件改變,目標文件也改變,可以跨越分區,源文件刪除,鏈接失效 #硬鏈接:指向同一個硬盤的地址 ln 原文件 目標文件 原文件改變,目標文件也改變,不可以跨越分區,原文件刪除,不會受影響 #軟連接類似於python中的淺拷貝,硬鏈接則是像極了深拷貝
示例
ansible db -m file -a "path=/data/temp state=directory" #在遠程機上創建一個目錄 ansible db -m file -a "path=/data/task state=directory owner=coco mode=644" #在遠程機上創建一個屬主為coco 且權限為drw - r -r 權限的目錄 ansible db -m file -a "path=/data/aiqing.txt state=touch owner=coco mode=644" #在遠程機上創建一個屬主為coco 的文件 ansible db -m file -a "path=/tmp/fffff src=/data/aiqing.txt state=link" #在遠程機創建一個軟連接 ansible db -m file -a "path=/tmp/fffff state=absent" #刪除軟連接
------------ 平常心 ------------ 面對 ------------ ALL DIFFICULTIES ------------ 勤能補拙,熟能生巧 ------------

1- 獲取db組/opt目錄下文件 2- 創建icon用戶,並設置密碼為xiaokeai 3- 在/tmp目錄下生成aa.txt文件,文件的內容為"大弦嘈嘈如急雨,小弦切切如私語,嘈嘈切切錯雜彈,大珠小珠落玉盤" 4- 將本地的網卡配置文件復制到遠程機器上,並命名為network,用戶為icon,用戶組為icon,權限為744 5- 在/opt目錄下創建ab.py文件,並指定用戶為icon,用戶組為icon,權限為744 6- 在/opt目錄下創建canglaoshi目錄

1. ansible db -m command -a "ls /opt" 2. [root@localhost ~]# ansible db -m command -a "useradd icon" [root@localhost ~]# ansible db -m shell -a "echo 'xiaokeai'|passwd --stdin 'icon' " #由於command模塊不支持特殊字符,因此需要shell模塊支持 3. [root@localhost ~]# ansible db -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私語,嘈嘈切切錯雜彈,大珠小珠落玉盤' dest=/tmp/aa.txt" 4.[root@localhost ~]# ansible db -m copy -a "src=/etc/sysconfig/network-scripts/ifcfg-ens33 dest=/opt/network group=icon owner=icon mode=744" 5. ansible db -m file -a "path=/opt/ab.py state=touch group=icon owner=icon mode=744" 6. ansible db -m file -a "path=/opt/canglaoshi state=directory"
6.fetch模塊
fetch (英 /fetʃ/ vt.取來) 將遠程主機器上的文件拉取到本地/管控機,以ip或者主機名生成目錄,並保留原先目錄結構
#fetch ---參數 dest #目標地址 src #源地址 ansible web -m fetch -a "dest=/data src=/data/a.py" #注意拉取遠程主機文件的時候如果只獲取到目錄,無文件無效
7.yum模塊
① yum與rpm的區別
rpm適用於所有環境,而yum要搭建本地yum源才可以使用;
yum是上層管理工具,自動解決依賴關系,而rpm是底層管理工具。
② yum 源的配置
#配置信息 /etc/yum.repos.d/epel.repo [epel] #名稱 name=Extra Packages for Enterprise Linux 7 - $basearch #描述信息 baseurl=http://mirrors.aliyun.com/epel/7/$basearch #yum源的地址 failovermethod=priority enabled=1 #指定yum源是否可用,1表示可用,0則相反 gpgcheck=0 #是否檢查gpgkey文件,0表示不檢查,1表示檢查 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
③ 包組
linux --> lib | windows ---> dll
yum grouplist #查看包組 yum groupinstall #安裝包組
④查看包安裝狀態
yum list|grep redis #出現 @ 代表安裝成功 rpm -q redis rpm -qa #查看所有安裝包 rpm -ql #查看安裝包生成的文件
⑤ 參數以及使用
#yum 參數 disable_gpg_check #是否檢查key disablerepo #禁用repo name #包名 state #狀態 installed removed #注意:在給遠程機器安裝包組的時候要確保遠程機器上有epel.repo 文件 ansible db -m copy -a "src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/" ansible web -m yum -a "name=python2-pip" #安裝一個包 ansible web -m yum -a "name='@Development Tools'" # 安裝包組 ansible web -m yum -a "name=redis,python2-pip" # 同時安裝多個包 ansible web -m yum -a "name=redis state=absent" # 卸載
8.pip模塊
①pip命令
pip list #查看所有的python第三方包 pip freeze > requirements.txt #導出所有第三方包到 requirements.txt pip install -r requirements.txt #安裝這些包
②參數以及使用
#參數 virtualenv #虛擬環境 name #包名 ansible web -m pip -a "name=django==1.11.18" ansible web -m pip -a "name=flask"
9.service模塊
①相關linux常用命令
ps -ef|grep redis #查看redis進程 ss -tnlp #查看端口信息 #啟動服務,停止和重啟分別為stop,restart systemctl start redis #Centos7啟動方式 service redis start #Centos6啟動方式 #開機自啟動 systemctl enable redis #Centos7啟動方式 chkconfig redis on #Centos6啟動方式
②參數以及使用
enabled #設置開機自啟動 name #名稱 state #狀態 started stopped restarted #重啟 reload #重新加載 ansible web -m service -a "name=redis state=strarted" #開啟遠程機器redis ansible web -m service -a "name=redis state=stopped" #關閉 ansible web -m service -a "name=redis state=started enabled=yes" #給遠程機器設置開機自啟redis
10.crontab模塊
crontab模塊 --->定時任務
①linux常用命令
crontab 用途:收集日志,備份數據,同步時間 * * * * * job 分 時 日 月 周 任務 0-59 0-23 1-31 1-12 0-7 job 1 * * * * job #代表每個小時的第一分鍾執行job 2/ * * * * * job #代表每隔2分鍾執行job 1 10-19 * * * job #代表10到19點的第一分鍾執行job #注意: 分鍾不要用*,最好是指定時間 crontab -l #查看計划任務 crontab -r # 刪除所有計划任務 crontab -e #編輯計划任務
②參數以及使用
#注意 ansible中沒有crontab 它表現的為cron模塊 如下參數 day huor job #任務 minute #分鍾 month #月 name state #狀態 user #執行計划任務的用戶 weekday #周 disabled #禁止 ansible web -m cron -a "minute=21 job='touch /tmp/cron.txt' name=touchfile" # 設置計划任務 ansible web -m cron -a "minute=23 job='touch /tmp/cron.txt' name=touchfile4 disabled=yes" # 禁用計划任務,表現為加注釋 ansible web -m cron -a "name=touchfile4 state=absent" # 刪除計划任務
11.user模塊
①常用命令
關於user,必須聊聊用戶的分類
超級用戶 --- root uid :0
其他用戶
- 系統用戶 ---啟動服務來專門設置的用戶 1-999 Centos7 | 1-499 Centos6
- 登錄用戶 ---普通的登錄用戶 1000-65535 Centos | 500-65535 Centos6
#useradd 命令參數 -d # 指定家目錄 -g # 組id -G, --groups GROUPS # 附加組 -r, --system # 創建系統用戶 -s, --shell SHELL # 登陸shell -u, --uid UID #用戶id useradd -s /sbin/nologin -u 2000 -d /opt/coco coco #創建用戶,指定用戶的登錄shell為不登錄, id 2000,家目錄在/opt/coco useradd -s /sbin/nologin -G root,na -d /opt/na na #指定附加組,最大的后面+1 useradd -r feige # 創建系統用戶,從999倒序 userdel feige # 刪除用戶 userdel -r fei # 刪除用戶並刪除用戶的家目錄
②參數以及使用
#參數 group #組 groups #附件組 home #家目錄 name #用戶名 password #密碼 shell #登錄shell remove #刪除用戶並且刪除用戶家目錄 state #狀態 system #系統用戶 uid #用戶id ansible db -m user -a "name=dafei shell=/sbin/nologin home=/opt/dafei uid=2001 group=root" #創建用戶,指定用戶家目錄,登錄shell情況,uid,組 #解釋: /sbin/nologin 作用 指的是不允許login當前Linux系統。當用戶配置成/sbin/nologin時,如果再使用該用戶ssh到linux操作系統,會提示如下內容:This account is currently not available。該功能類似於封掉某個帳戶。 ansible db -m user -a "name=dafei system=yes" #創建系統用戶 ansible db -m user -a "name=xiaofei state=absent" #刪除用戶 ansible db -m user -a "name=xiaofei state=absent remove=yes" #刪除用戶並且刪除其家目錄
12.group模塊
①linux常用命令
#用戶組的分類 超級組 root uid 0 其他組 系統組 uid 1-999 centos7 | 1-499 centos6 普通組 uid 1000-65535centos7 | 500-65535 centos6 -g #指定組的id -r #指定系統組 cat /etc/group #查看所有組 groupadd -g 3000 xiaofei #創建一個組id為3000的組 groupdel xiaofei #指定刪除改組
②參數以及使用
# 常用參數 gid #組id name #組名 state #狀態 system #系統組 ansible db -m group -a "name=xiaoliu" #創建普通組 ansible db -m group -a "name=xiaowang system=yes" #創建系統組 ansible db -m group -a "name=xiaowang state=absent" #刪除組

#web組操作 1 - 創建yuanyaun用戶,指定用戶的家目錄為/opt/,指定用戶的id為3000,指定用戶的附加組為root 2 - 創建tiantian用戶組 3 - 將本地的/etc/fstab 復制到遠程,並指定屬主是yuanyuan,屬組是tiantian 4 - 安裝redis並啟動,設置開機自啟動 5 - 安裝django 6 - 設置計划任務每天凌晨2點半備份/etc/目錄,tar

1. ansible web -m user -a "name=yuanyuan home=/opt/ uid=3000 groups=root" 2. ansible web -m user -a "name=tiantian" 3.ansible web -m copy -a "src=/etc/fstab dest=/etc/ owner=feige group=feige" 4.ansible web -m yum -a "name=redis" ansible web -m service -a "name=redis state=started enabled=yes" 5.absible web -m pip -a "name=django" 6. 30 2 * * * tar -zvcf alletc.tar.gz /etc/* ansible web -m cron -a "minute=30 hour=2 job='tar a.tar.gz /etc/*' name=aaa"