3.2 企業自動化運維ansible
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 就是取交集
邏輯非
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
- 設定一個用戶擁有拷貝到遠程節點的文件權限
- src
- 把復制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代表刪除
- follow
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,默認是安裝
當然也可以用命令模塊安裝或卸載包 - disable_gpg_check
例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‘
這相當於先啟動服務,然後在把服務設置成開機啟動 - enabled
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
- 指定用戶的密碼
- home
-
範例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‘1ansible 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: roottasks:
- name: test yml
file: name=/app/test12 state=touch
- name: test yml
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