1. 程式人生 > >3.2 企業自動化運維ansible

3.2 企業自動化運維ansible

改變 com 主機 xxx shell 錯誤 之前 python2 awk

ansible的Host-pattern

ansible的Host-pattern
匹配主機的列表
All :表示所有Inventory中的所有主機
ansible all –m ping
:通配符
ansible “
” -m ping 這個”*”號相當於all全部主機
技術分享圖片

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

 ![](http://i2.51cto.com/images/blog/201809/26/bd57177e77cf9769c23bdfae1c90ec52.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

 ![](http://i2.51cto.com/images/blog/201809/26/8c3d747259a4cdbe140e838d6f1f31a2.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
 這裏的波浪符表示是一個正則表達式,點在正則表示任意字符,所有要用反向單引號轉義

ansible命令執行過程

 ansible命令執行過程可以用-vvv來查看執行過程

可以用-vvv來查看命令執行的詳細過程[root@ansible ~]# ansible ‘~(web|db|ag)ser’ -m command -a “ls /root” -vvv

 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的配置文件裏定義的
技術分享圖片

 綠色:執行成功並且不需要做改變的操作

×××:執行成功並且對目標主機做變更
紅色:執行失敗

 ansible使用示例

以wang用戶執行ping存活檢測
ansible all -m ping -u wang -k
以wang sudo至root執行ping存活檢測
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常用模塊

ping :探測對方主機是否在開機,這裏的ping模塊並不是用ICMP協議的
“bash
將主機設置為禁止ping

[root@localhost ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

現在在測這個主機
[root@ansible .ssh]# ansible 192.168.27.101 -m ping
192.168.27.101 | SUCCESS => {
“changed”: false,
“ping”: “pong”
}
[root@ansible .ssh]# ping 192.168.27.101
PING 192.168.27.101 (192.168.27.101) 56(84) bytes of data.
^C
— 192.168.27.101 ping statistics —
6 packets transmitted, 0 received, 100% packet loss, time 5002ms
如果把ssh服務停了也是可以執行成功的,只有把網絡服務停了才會失敗

Command:在遠程主機執行命令,默認模塊,可忽略-m選項
-a是後面要執行的參數

  • 參數
  • chdir 運行command命令前先cd到這個目錄
  • creates 如果這個參數對應的文件存在,就不運行command
  • executable 將shell切換為command執行,這裏的所有命令需要使用絕對路徑
  • removes 如果這個參數對應的文件不存在,就不運行command
    bash
    ansible srvs -m command -a ‘service vsftpd start‘
    ansible srvs -m command -a ‘echo magedu |passwd --stdin wang‘ 不成功
    此命令不支持 $VARNAME < > | ; & 等,用shell模塊實現
    用chdir進入到某個目錄來執行參數
    [root@ansible ~]# ansible ‘dbser‘ -m command -a ‘chdir=/app/ ls‘
    192.168.27.102 | SUCCESS | rc=0 >>
    123

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
[root@ansible ~]# ansible ‘dbser‘ -m command -a ‘chdir=/app/ creates=123 ls‘
192.168.27.102 | SUCCESS | rc=0 >>
skipped, since 123 exists 這裏寫著123這個文件存在就跳過,而另一個主機沒有對應的文件所有執行ls

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd
技術分享圖片

如果文件不存在則不執行

技術分享圖片

Shell:和command相似,用shell執行命令

常用參數
chdir 跟command一樣的,運行shell之前cd到某個目錄
creates 跟command一樣的,如果某個文件存在則不運行shell
remove 跟command一樣的,如果某個文件不存在則不運行shell

ansible srv -m shell -a ‘echo magedu |passwd –stdin wang‘

調用bash執行命令 類似 cat /tmp/stanley.md | awk -F‘|‘‘{print $1,$2}‘ &> /tmp/example.txt 這些復雜命令,即使使用shell也可能會失敗,解決辦法:寫到腳本時,copy到遠程,執行,再把需要的結果拉回執行命令的機器
查看主機名
[root@ansible ~]# ansible ‘dbser‘ -m shell -a ‘echo $HOSTNAME‘
192.168.27.102 | SUCCESS | rc=0 >>
102

192.168.27.128 | SUCCESS | rc=0 >>
centos6.magedu.com
體驗shell和command的區別,先cd到某個需要編譯的目錄,執行condifgure然後,編譯,然後安裝。
ansible -i hosts all -m shell -a "./configure && make && make insatll" chdir=/xxx/yyy/
shell也支持條件判斷&&||
[root@ansible ~]# ansible ‘dbser‘ -m shell -a ‘grep -q root /etc/passwd && ls /app‘
192.168.27.102 | SUCCESS | rc=0 >>
123

192.168.27.128 | SUCCESS | rc=0 >>
1
aaa
access_log
awk.txt
dir
f1.txt
f2
lost+found
passwd

[root@ansible ~]# ansible ‘dbser‘ -m shell -a ‘grep -q rootsd /etc/passwd && ls /app‘
192.168.27.102 | FAILED | rc=1 >>
non-zero return code 如果沒有則會出現非0錯誤碼

192.168.27.128 | FAILED | rc=1 >>
non-zero return code

Script:運行腳本

  • 相當於先把腳本傳到遠方節點,然後在執行
  • 技術分享圖片

Copy:從服務器復制文件到客戶端

  • 常用參數
    • src
      • 用於定位ansible執行的機器上的文件,需要絕對路徑。如果拷貝的是文件夾,那麽文件夾會整體拷貝,如果結尾是”/”,那麽只有文件夾內的東西被考過去。一切的感覺很像rsync,源地址
    • content
      • 用來替代src,用於將指定文件的內容,拷貝到遠程文件內
    • dest
      • 用於定位遠程節點上的文件,需要絕對路徑。如果src指向的是文件夾,這個參數也必須是指向文件夾,目標文件
    • backup
      • 備份遠程節點上的原始文件,在拷貝之前。如果發生什麽意外,原始文件還能使用。
    • directory_mode
      • 這個參數只能用於拷貝文件夾時候,這個設定後,文件夾內新建的文件會被拷貝。而老舊的不會被拷貝
    • follow
      • 當拷貝的文件夾內有link存在的時候,那麽拷貝過去的也會有link
    • force
      • 默認為yes,會覆蓋遠程的內容不一樣的文件(可能文件名一樣)。如果是no,就不會拷貝文件,如果遠程有這個文件
    • group
      • 設定一個群組擁有拷貝到遠程節點的文件權限
    • mode
      • 等同於chmod,參數可以為“u+rwx or u=rw,g=r,o=r”
    • owner
      • 設定一個用戶擁有拷貝到遠程節點的文件權限
  • 把復制selinux配置文件
  • 技術分享圖片
  • 技術分享圖片

也可以改權限,所屬組,或所有者
技術分享圖片

技術分享圖片

也可以把內容復制到指定的文件中

[root@ansible ~]# ansible cen7 -m copy -a ‘content="df-h\nhhhhhhhhhhh\nls\n" dest=/app/f1.sh‘
[root@ansible ~]# ansible cen7 -a ‘cat /app/f1.sh‘
192.168.27.102 | SUCCESS | rc=0 >>
df-h
hhhhhhhhhhh
ls

192.168.27.101 | SUCCESS | rc=0 >>
df-h
hhhhhhhhhhh
ls

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" 利用內容,直接生成目標文件

Cron:計劃任務

支持時間:minute,hour,day,month,weekday

ansible srv -m cron -a "minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null‘
name=Synctime" 創建任務
ansible srv -m cron -a ‘state=absent
name=Synctime‘ 刪除任務

例1:每五分鐘周六周日執行

[root@ansible ~]# ansible cen7 -m cron -a ‘minute=/5 weekday=0,6 job="/usr/bin/wall cront job" name="test"‘
name就是給這個計劃任務起個名字
job表示要執行的命令或操作但是命令要寫絕對路徑
[root@ansible ~]# ansible cen7 -a ‘crontab -l‘
192.168.27.102 | SUCCESS | rc=0 >>
#Ansible: test
/5 * 0,6 /usr/bin/wall cront job

例2:禁用範例1的計劃任務

[root@ansible ~]# ansible cen7 -m cron -a ‘disabled=true job="/usr/bin/wall cront job" name=test ‘
必須要job
[root@ansible ~]# ansible cen7 -a ‘crontab -l‘
192.168.27.101 | SUCCESS | rc=0 >>
#Ansible: test
# * /usr/bin/wall cront job
開啟是disabled=no

Fetch:從客戶端取文件至服務器端,copy相反,目錄可先tar

ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts‘
例2,將遠程主機的passwd文件復制到本機上

[root@ansible ~]# ansible cen7 -m fetch -a ‘src=/etc/passwd dest=/app/‘
這裏的src是遠程主機的路徑,dest是本地路徑文件要復制到哪裏
在本機會成一個遠程主機ip名字的一個目錄裏面存放著文件

例3.將日誌文件打包壓縮,並復制到本地主機上
[root@ansible ~]# ansible cen7 -m shell -a ‘tar Jcf /app/log.tar.xz /var/log/*.log‘
[root@ansible ~]# ansible cen7 -m fetch -a ‘src=/app/log.tar.xz dest=/app/‘

有專門的tar模塊可以將打包並復制

File:設置文件屬性和管理文件

  • file模塊它包含了文件、文件夾、超級鏈接類的創立、拷貝、移動、刪除操作。
  • 常見參數
    • follow
      • 如果原來的文件是link,拷貝後依舊是link
    • force
      • 強制執行,沒說的
    • group
      • 設定所屬組權限
    • mode
      • 等同於chmod,參數可以為“u+rwx or u=rw,g=r,o=r”
    • owner
      • 設定文件的所有者
    • path
      • 目標路徑,也可以用dest,name代替
    • src
      • 待拷貝文件/文件夾的原始位置。
    • state = ile/link/directory/hard/touch/absent
      • file代表拷貝後是文件;link代表最終是個軟鏈接;directory代表文件夾;hard代表硬鏈接;touch代表生成一個空文件;absent代表刪除

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‘

例1:創建一個空文件
[root@ansible ~]# ansible cen7 -m file -a ‘path=/app/testfile state=touch‘

例2:把範例1創建的文件創建一個軟連接
[root@ansible ~]# ansible cen7 -m file -a ‘src=/app/testfile path=/app/testlink state=link‘
[root@ansible ~]# ansible cen7 -a ‘ls -l /app/‘ ansible不支持別名命令

例3:創建一個文件夾,推薦用file模塊因為比較穩定
方法一[root@ansible ~]# ansible cen7 -a ‘mkdir /app/mk1‘
方法二[root@ansible ~]# ansible cen7 -m file -a ‘path=/app/mk2 state=directory‘

例4:刪除文件夾或文件
[root@ansible ~]# ansible cen7 -m file -a ‘path=/app/mk1 state=absent‘
[root@ansible ~]# ansible cen7 -m file -a ‘path=/app/fstab state=absent‘

例5:清空整個文件夾
[root@ansible ~]# ansible cen7 -m shell -a ‘rm -rf /app/*‘

Hostname:管理主機名這裏改名是永久改,會把配置文件改掉

ansible node1 -m hostname -a "name=websrv"
ansible 192.168.27.101 -m hostname -a ‘name=g101.com‘

yum:管理包

  • 常用參數

    • disable_gpg_check
      • 在安裝包前檢查包,只會影響state參數為present或者latest的時候
    • name
      • 你需要安裝的包的名字,也能如此使用name=python=2.7安裝python2.7
    • state present/latest/absent
      • 用於描述安裝包最終狀態,present/latest用於安裝包,absent用於remove安裝包
    • update_cache
      • 用於安裝包前執行更新list,只會影響state參數為present/latest的時候

    範例1:安裝一個包,做這些一定要yum配置好
    [root@ansible ~]# ansible cen7 -m yum -a ‘name=tree state=present‘
    name是要安裝的包名,
    如果是安裝的話默認可以不寫state=present,默認是安裝
    當然也可以用命令模塊安裝或卸載包

例2:可以安裝包最新版
[root@ansible ~]# ansible cen7 -m yum -a ‘name=dstat state=latest‘

例3:也可以一次性安裝多個包,包之間用逗號隔開

[root@ansible ~]# ansible cen7 -m yum -a ‘name=httpd,vsftpd state=present‘1

ansible srv -m yum -a ‘name=httpd state=latest‘ 安裝
ansible srv -m yum -a ‘name=httpd state=absent‘ 刪除

Service:管理服務

  • 常用參數

    • enabled
      • 啟動os後啟動對應service的選項。使用service模塊的時候,enabled和state至少要有一個被定義,設置成開機啟動
    • name
      • 需要進行操作的service名字
    • state stared/stoped/restarted/reloaded
      • service最終操作後的狀態。

    範例1啟動服務並設置開機啟動
    [root@ansible ~]# ansible cen7 -m service -a ‘name=httpd state=started enabled=yes‘
    這相當於先啟動服務,然後在把服務設置成開機啟動

ansible service 模塊一條命令只能支持一個服務,name只能寫一個

ansible srv -m service -a ‘name=httpd state=stopped‘
ansible srv -m service -a ‘name=httpd state=started‘
ansible srv –m service –a ‘name=httpd state=reloaded‘
ansible srv -m service -a ‘name=httpd state=restarted‘

User:管理用戶

  • 常用參數
    • home
      • 指定用戶的家目錄
    • groups
      • 用戶的所屬組可以指定多個用逗號分隔
    • uid
      • 指定用戶uid
    • name
      • 要創建的用戶名
    • createhome
      • 是否創建家目錄 yes|no
    • system
      • 是否為系統用戶
    • remove
      • 當state=absent時,remove=yes則表示連同家目錄一起刪除,等價於userdel -r
    • state
      • 是創建還是刪除,默認是創建
    • shell
      • 指定用戶的shell環境
    • password
      • 指定用戶的密碼
  • 範例1:創建一個test1用戶,uid=2000,主組是guo,附屬組是root,bin.指定家目錄為根下 還有描述

    [root@ansible ~]# ansible cen7 -m user -a ‘name=test1 comment="test is user" uid=2000 home=/test group=guo groups=root,bin‘

    例2:創建一個系統用戶,系統用戶是沒有家目錄的所以要加上createhome=no不創建家目錄,如果不加這個選項則是默認創建家目錄
    [root@ansible ~]# ansible cen7 -m user -a ‘name=systemuser system=yes createhome=no‘

192.168.27.102 | SUCCESS => {
"changed": true,
"comment": "",
"createhome": false,
"group": 996,
"home": "/home/systemuser", 雖然這裏顯示是創建的,但是事實是沒有創建
"name": "systemuser",
"shell": "/bin/bash",
"state": "present",
"system": true,
"uid": 998
}
例3:刪除一個普通用戶,包括家目錄以前刪除當state=absent時remove=yes則表示連同家目錄一起刪除,如果只選state=absent則只刪除用戶,而不會刪除家目錄
[root@ansible ~]# ansible cen7 -m user -a ‘name=test1 state=absent remove=yes‘

ansible srv -m user -a ‘name=user1 comment="test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ‘
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘
刪除用戶及家目錄等數據

Group:管理組

  • 和user參數一樣
  • 範例1:創建組
    [root@ansible ~]# ansible cen7 -m group -a ‘name=group1‘

    例2:刪除一個組
    [root@ansible ~]# ansible cen7 -m group -a ‘name=group1 state=absent‘1

    ansible srv -m group -a "name=testgroup system=yes"
    ansible srv -m group -a "name=testgroup state=absent"

ansible-galaxy

連接 https://galaxy.ansible.com 下載相應的roles
這個網站是官方的,國外的一些大神做的比較好的playbook,和一些角色,會傳到這裏,可以下載使用或者參考
技術分享圖片

    列出所有已安裝的galaxy 
 ansible-galaxy list

安裝galaxy
ansible-galaxy install geerlingguy.redis

就將網站上的角色名寫著就可以
bash
[root@ansible ~]# ansible-galaxy install geerlingguy.nginx</li>
<li>downloading role ‘nginx‘, owned by geerlingguy</li>
<li>downloading role from https://github.com/geerlingguy/ansible-role-nginx/archive/2.5.0.tar.gz</li>
<li>extracting geerlingguy.nginx to /root/.ansible/roles/geerlingguy.nginx 這裏顯示了下載的位置</li>
<li>geerlingguy.nginx (2.5.0) was installed successfully

下載完後可以用ansible-galaxy list 查看
進入目錄看一下裏面的內容
bash
[root@ansible ~]# ls .ansible/roles/geerlingguy.nginx/
defaults handlers LICENSE meta README.md tasks templates tests vars

這裏都是playbook
最好復制一份並改名,這樣修改如果出現重大失誤可以有參考

刪除galaxy

  ansible-galaxy remove geerlingguy.redis

ansible-pull
推送命令至遠程,效率無限提升,對運維要求較高
Ansible-playbook
ansible-playbook hello.yml 後綴推薦用.yml它是用yml語言寫的

技術分享圖片

ansible-playbook 運行腳本 要用-C 檢查一下
語法要求很嚴格

創建一個空文件的一個腳本

[root@ansible ansible]# vim hellow.yml

  • hosts: cen7
    remote_user: root

    tasks:

    • name: test yml
      file: name=/app/test12 state=touch

Ansible-vault

功能:管理加密解密yml文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view]
ansible-vault encrypt hello.yml 加密
bash
[root@ansible ansible]# ansible-vault encrypt hellow.yml
New Vault password:
Confirm New Vault password:
Encryption successful

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:並發數]執行用戶@當前操作的主機組(當前組的主機數量)[f:並發數] 執行用戶@當前操作的主機組 (當前組的主機數量)[f:並發數]
設置並發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd web
列出當前組主機列表: list
列出所有的內置命令: ?或help
示例:
bahs
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
技術分享圖片

3.2 企業自動化運維ansible