1. 程式人生 > >95.ansible介紹 安裝 命令 拷貝 執行指令碼 crontab

95.ansible介紹 安裝 命令 拷貝 執行指令碼 crontab

開發十年,就只剩下這套架構體系了! >>>   

24.15 ansible介紹

24.16 ansible安裝

24.17 ansible遠端執行命令

24.18 ansible拷貝檔案或目錄

24.19 ansible遠端執行指令碼

24.20 ansible管理任務計劃

 

 

 

 

24.15 ansible介紹

 

 

 

不需要安裝客戶端,通過sshd去通訊

基於模組工作,模組可以由任何語言開發

不僅支援命令列使用模組,也支援編寫yaml格式的playbook,易於編寫和閱讀

安裝十分簡單,centos上可直接yum安裝

playbook類似於saltstack的top.sls,top.sls又指向了一些子配置檔案

有提供UI(瀏覽器圖形化)www.ansible.com/tower,收費的

官方文件 http://docs.ansible.com/ansible/latest/index.html

ansible已經被redhat公司收購,它在github上是一個非常受歡迎的開源軟體,github地址https://github.com/ansible/ansible

一本不錯的入門電子書 https://ansible-book.gitbooks.io/ansible-first-book/

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

24.16 ansible安裝

 

 

 

 

1.準備兩臺機器,前面我們做實驗的兩臺機器aming-01,aming-02

2.只需要在aming-01上安裝ansible

yum list |grep ansible 可以看到自帶源裡就有2.4版本的ansible

yum install -y ansible

3.aming-01上生成金鑰對 ssh-keygen -t rsa(表示-t生成型別為rsa)

4.把公鑰放到aming-02上,設定金鑰認證

5.vi /etc/ansible/hosts //增加(配置主機組)。管理機器的時候可以把他們分成多個組,比如web組、db組,每一個組裡面都要若干個機器。後期可以針對主機組去做操作

[testhost]

127.0.0.1

192.168.208.130

說明: testhost為主機組名字,自定義的。 下面兩個ip為組內的機器ip。

 

 

例項:

[root@axinlinux-01 ~]# yum list |grep ansible

ansible.noarch 2.7.4-1.el7 epel

ansible-doc.noarch 2.7.4-1.el7 epel #文件

[root@axinlinux-01 ~]# yum install -y ansible ansible-doc #兩個都安裝上

[root@axinlinux-01 ~]# ls /root/.ssh/ #因為之前有做過,有這兩個檔案。如果沒有就ssh-keygen來生成

authorized_keys id_rsa id_rsa.pub known_hosts

[root@axinlinux-01 ~]# cat /root/.ssh/id_rsa.pub #複製01機器的公鑰

[root@axinlinux-02 ~]# vim /root/.ssh/authorized_keys #將複製的公鑰放到這裡

[root@axinlinux-01 ~]# vim /root/.ssh/authorized_keys #本機上也要公鑰

[root@axinlinux-01 ~]# ssh axinlinux-02 #登入是否成功

[root@axinlinux-01 ~]# vim /etc/ansible/hosts #配置主機組

[testhost]

127.0.0.1

axinlinux-02 #此處也可以是ip,主機名的話要設定一下/etc/hosts

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

24.17 ansible遠端執行命令

 

 

 

1.ansible  testhost -m command -a 'w' 

#testhost為主機組裡的機器

-m指的是模組

-a指的是什麼命令

2.這樣就可以批量執行命令了。這裡的testhost 為主機組名,-m後邊是模組名字,-a後面是命令。當然我們也可以直接寫一個ip,針對某一臺機器來執行命令。

ansible 127.0.0.1 -m command -a 'hostname'

錯誤: "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解決: yum install -y libselinux-python

3.還有一個模組就是shell同樣也可以實現 (比如遠端執行一個shel指令碼,也支援想要一個命令)

ansible  testhost -m shell -a 'w'

 

 

 

例項:

[root@axinlinux-01 ~]# ansible testhost -m command -a 'w'

[root@axinlinux-01 ~]# ansible testhost -m command -a 'hostname'

axinlinux-02 | CHANGED | rc=0 >>

axinlinux-02

 

axinlinux-01 | CHANGED | rc=0 >>

axinlinux-01

[root@axinlinux-01 ~]# ansible axinlinux-02 -m command -a 'hostname' #也可以僅看一臺機器

axinlinux-02 | CHANGED | rc=0 >>

axinlinux-02

[root@axinlinux-01 ~]# ansible testhost -m shell -a 'hostname' #shell模組也可以寫一個命令

axinlinux-02 | CHANGED | rc=0 >>

axinlinux-02

 

axinlinux-01 | CHANGED | rc=0 >>

axinlinux-01

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

24.18 ansible拷貝檔案或目錄

 

 

 

1.ansible aming-02 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=0755" (拷貝目錄)

#copy是拷貝模組,可以拷貝檔案、目錄

src指定來源的檔案或目錄是誰

dest目標,來源是檔案,那目標也要是檔案

owner指定屬主

mode許可權,也可以寫755

注意:源目錄會放到目標目錄下面去,如果目標指定的目錄不存在,它會自動建立。如果拷貝的是檔案,dest指定的名字和源如果不同,並且它不是已經存在的目錄,相當於拷貝過去後又重新命名。但相反,如果desc是目標機器上已經存在的目錄,則會直接把檔案拷貝到該目錄下面。

2.ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/123" (拷貝檔案)

這裡的/tmp/123和源機器上的/etc/passwd是一致的,但如果目標機器上已經有/tmp/123目錄,則會再/tmp/123目錄下面建立passwd檔案

 

 

例項:

[root@axinlinux-01 ~]# ansible axinlinux-02 -m copy -a "src=/etc/ansible dest=/tmp/ansibletest owner=root group=root mode=755"

axinlinux-02 | CHANGED => {

"changed": true,

"dest": "/tmp/ansibletest/",

"src": "/etc/ansible"

}

[root@axinlinux-02 ~]# ls /tmp/ansibletest/ansible/ #看一下02機器是否有。被建立了目標目錄

ansible.cfg hosts roles/

[root@axinlinux-02 ~]# ls -ld /tmp/ansibletest/

drwxr-xr-x 3 root root 21 12月 9 22:32 /tmp/ansibletest/

[root@axinlinux-02 ~]# date

2018年 12月 09日 星期日 22:34:07 CST

[root@axinlinux-01 ~]# ansible axinlinux-02 -m copy -a "src=/etc/passwd dest=/tmp owner=root group=root mode=755"

axinlinux-02 | CHANGED => {

"changed": true,

"checksum": "eea17158509c38ed0c80faae566407c920c47c31",

"dest": "/tmp/passwd",

"gid": 0,

"group": "root",

"md5sum": "4a6c40d0208f75636981b494f55109ea",

"mode": "0755",

"owner": "root",

"size": 2374,

"src": "/root/.ansible/tmp/ansible-tmp-1544366308.12-248977953608911/source",

"state": "file",

"uid": 0

}

[root@axinlinux-02 ~]# ls -ld /tmp/passwd

-rwxr-xr-x 1 root root 2374 12月 9 22:38 /tmp/passwd

[root@axinlinux-02 ~]# date

2018年 12月 09日 星期日 22:40:06 CST

[root@axinlinux-01 ~]# ansible axinlinux-02 -m copy -a "src=/etc/passwd dest=/tmp/1.txt owner=root group=root mode=755" #改名字的話,直接指定目標檔案的名字即可。跟cp命令差不多

[root@axinlinux-02 ~]# ls -ld /tmp/1.txt

-rwxr-xr-x 1 root root 2374 12月 9 22:42 /tmp/1.txt

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

24.19 ansible遠端執行指令碼

 

 

 

1.首先建立一個shell指令碼

vim  /tmp/test.sh  //加入內容

#!/bin/bash

echo `date` > /tmp/ansible_test.txt #將系統時間輸出到這個檔案裡

2.然後把該指令碼分發到各個機器上(ansible需要將指令碼放在相應的機器上才可以執行)

ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755"

#指令碼的許可權要是755才可以執行

3.最後是批量執行該shell指令碼

ansible testhost -m shell -a "/tmp/test.sh"

shell模組,還支援遠端執行命令並且帶管道 #command不支援

ansible testhost -m shell -a "cat /etc/passwd|wc -l "

 

 

 

例項:

[root@axinlinux-01 ~]# vim /tmp/test.sh

#!/bin/bash

echo `date` > /tmp/ansible_test.txt

[root@axinlinux-01 ~]# ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mode=0755" #將指令碼分發到各個機器上去

[root@axinlinux-01 ~]# ansible testhost -m shell -a "/tmp/test.sh" #執行各個機器上的test.sh指令碼

axinlinux-02 | CHANGED | rc=0 >>

 

 

axinlinux-01 | CHANGED | rc=0 >>

[root@axinlinux-01 ~]# ls /tmp/ansible_test.txt #檢查是否建立了腳本里的檔案

/tmp/ansible_test.txt

[root@axinlinux-01 ~]# cat !$ #內容

cat /tmp/ansible_test.txt

2018年 12月 09日 星期日 22:53:17 CST

[root@axinlinux-01 ~]# ansible testhost -m command -a "cat /etc/passwd|wc -l" #command不支援管道

axinlinux-02 | FAILED | rc=1 >>

cat:無效選項 -- l

Try 'cat --help' for more information.non-zero return code

 

axinlinux-01 | FAILED | rc=1 >>

cat:無效選項 -- l

Try 'cat --help' for more information.non-zero return code

 

[root@axinlinux-01 ~]# ansible testhost -m shell -a "cat /etc/passwd|wc -l" #shell支援管道

axinlinux-02 | CHANGED | rc=0 >>

31

 

axinlinux-01 | CHANGED | rc=0 >>

46

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

24.20 ansible管理任務計劃

 

 

 

1.ansible testhost -m cron -a "name='test cron' job='/bin/touch /tmp/1212.txt'  weekday=6"

#-m cron 用到了cron模組

name指定任務計劃的名字

job指定命令是什麼

weekday=6就是星期六,也就是這裡指定分時日月周,不指定的話就是星

2.若要刪除該cron 只需要加一個欄位 state=absent 

ansible testhost -m cron -a "name='test cron' state=absent"

 

3.其他的時間表示:分鐘 minute 小時 hour 日期 day 月份 month

4.不要手動的crontab -e去更改裡面的東西,一旦更改了,就沒法利用ansible去管理使用了。

 

 

例項:

[root@axinlinux-01 ~]# ansible axinlinux-02 -m cron -a"name='test cron' job='/bin/touch /tmp/1212.txt' weekday=6"

axinlinux-02 | CHANGED => {

"changed": true,

"envs": [],

"jobs": [

"test cron"

]

}

[root@axinlinux-02 ~]# crontab -l

# Lines below here are managed by Salt, do not edit

#Ansible: test cron #這就是我們定義的名字

* * * * 6 /bin/touch /tmp/1212.txt

[root@axinlinux-01 ~]# ansible axinlinux-02 -m cron -a"name='test cron' state=absent" #刪除這個任務計劃

axinlinux-02 | CHANGED => {

"changed": true,

"envs": [],

"jobs": []

}

[root@axinlinux-02 ~]# crontab -l

# Lines below here are managed by Salt, do not edit

[root@axinlinux-01 ~]# ansible axinlinux-02 -m cron -a"name='test cron' job='/bin/touch /tmp/1212.txt' minute=20 hour=10 weekday=6"

axinlinux-02 | CHANGED => {

"changed": true,

"envs": [],

"jobs": [

"test cron"

]

}

[root@axinlinux-02 ~]# crontab -l

# Lines below here are managed by Salt, do not edit

#Ansible: test cron

20 10 * * 6 /bin/touch /tmp/1212.txt