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