ansible介紹+基本操作
1ansible介紹
- Ansible基於Python語言實現,由paramiko和PyYAML兩個關鍵模塊構建
- 不需要安裝客戶端,通過sshd去通信
- 基於模塊工作,模塊可以由任何語言開發
- 不僅支持命令行使用模塊,也支持編寫yaml格式的playbook,易於編寫和閱讀
- 有提供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/
- Ansible的基本架構:
1. 核心引擎:即圖中所看到的ansible
2. 核心模塊(core module):在模塊庫(module library)中分為兩塊,一個是核心模塊另外一個就是自定義模塊(custom modules)。核心模塊中都是ansible自帶的模塊,Ansible模塊資源分發到遠程節點使其執行特定任務或匹配一個特定的狀態。這些核心核心模塊都遵循這batteries included哲學。其實這裏這個還是很有意思的,batterires included:Python has a large standard library, commonly cited as one of Python’s greatest strengths,providing tools suited to many tasks. 這就意味著Python有這巨大的庫支持你完成你想完成的任務工作。
3. 自定義模塊(custom modules):如果在Ansible中滿足不了你所需求的模塊,那麽Ansible也能提供添加自定義化的模塊。
4. 插件(plugin):這裏我的理解就是完成較小型的任務。輔助協助模塊來完成某個功能。
5. 劇本(playbook):定義需要給遠程主機執行的一系列任務。例如安裝一個nginx服務,那麽我們可以把這拆分為幾個任務放到一個playbook中。例如:第一步需要下載nginx的安裝包。第二步我可能考慮需要做的就是將我事先寫好的nginx.conf的配置文件下發的目標服務器上。第三步,我們需要把服務啟動起來。第四步,我們可能需要檢查端口是否正常開啟。那麽這些步驟可以通過playbook來進行整合,然後通過inventory來下發到想要執行劇本的主機上。並且playbook也支持交互式執行playbook裏面的步驟,而且如果有那一個步驟執行返回了一個錯誤報告,那麽我們可以僅僅只單獨執行這個步驟。你可以把playbook理解成為一個組策略,控制管理這個OU下所有的主機行為。
6. 連接插件(connectior plugins):Ansible默認是基於SSH連接到目標機器上執行操作的。但是同樣的Ansible支持不同的連接方法,要是這樣的話就需要連接插件來幫助我們完成連接了。
7. 主機清單(host inventory):為Ansible定義了管理主機的策略。一般小型環境下我們只需要在host文件中寫入主機的IP地址即可,但是到了中大型環境我們有可能需要使用靜態inventory或者動態主機清單來生成我們所需要執行的目標主機。
2 ansible安裝
- 環境:準備兩臺機器
- chy 192.168.212.10 //只需要在這臺機器上安裝ansible
- chy01 192.168.212.11
- 安裝如下 chy//192.168.212.10
[root@chy ~]# yum list |grep ansible //看到有2.4版本的yum包,只需要安裝自帶的源即可 ansible.noarch 2.4.0.0-5.el7 extras ansible-doc.noarch 2.4.0.0-5.el7 extras ansible-inventory-grapher.noarch 2.3.2-1.el7 epel ansible-lint.noarch 3.4.15-1.el7 epel ansible-openstack-modules.noarch 0-20140902git79d751a.el7 epel ansible-review.noarch 0.13.0-2.el7 epel kubernetes-ansible.noarch 0.6.0-0.1.gitd65ebd5.el7 epel python2-ansible-tower-cli.noarch 3.1.7-1.el7 epel [root@chy ~]# yum install -y ansible ansible-doc //安裝ansible [root@chy ~]# ls /root/.ssh/ //查看有沒有密鑰對,如果有就無需在重新生成,如果之前沒有生成過需要用ssh-keygen生成一下密鑰對。 authorized_keys id_rsa id_rsa.pub known_hosts 之後將公鑰復制到另一臺機器上 [root@chy01 ~]# cat .ssh/authorized_keys //公鑰已經放在了裏面 [root@chy ~]# ssh chy01 The authenticity of host ‘chy01 (192.168.212.11)‘ can‘t be established. ECDSA key fingerprint is de:d2:32:86:e0:89:5c:2c:51:68:92:9b:7e:40:52:5c. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ‘chy01‘ (ECDSA) to the list of known hosts. Last login: Wed Nov 8 01:04:24 2017 from chy # cat /etc/motd [root@chy ~]# vi /etc/ansible/hosts //配置主機組 ## [webservers] ## alpha.example.org ## beta.example.org ## 192.168.1.100 ## 192.168.1.110 [testhost] chy02 chy01 說明: testhost為主機組名字,自定義的。 下面兩個ip為組內的機器ip。 增加testhost裏的內容,testhost下面可以寫主機名也可以寫ip地址,如果寫了主機名切記需要去/etc/hosts裏配置,如果做了dns則不需要去/etc/hosts配置(這裏需要註意的是組裏添加的機器的前提是都要做密鑰認證的)
3ansible遠程執行命令
-遠程執行命令操作如下
[root@chy ~]# ansible testhost -m command -a ‘w‘ chy01 | SUCCESS | rc=0 >> 01:46:28 up 1:00, 2 users, load average: 0.16, 0.05, 0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.212.1 00:54 37:48 0.02s 0.02s -bash root pts/1 chy 01:46 0.00s 0.26s 0.05s w chy02 | SUCCESS | rc=0 >> 01:46:28 up 2:24, 2 users, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.212.1 00:27 1:08m 0.02s 0.02s -bash root pts/1 chy 01:46 1.00s 0.30s 0.00s w 語法介紹:ansible 後跟定義的主機組 -m 跟模塊,- a跟需要執行的命令 [root@chy ~]# ansible chy01 -m command -a ‘hostname‘ chy01 | SUCCESS | rc=0 >> chy01 如上也可以只針對一臺機器進行操作
如果出現了如下錯誤,請按照如下的方法解決
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
4 anonymous拷貝文件或目錄
[root@chy ~]# ansible chy01 -m copy -a "src=/etc/ansible dest=/tmp/ansible_test owner=root group=root mode=0755" chy01 | SUCCESS => { "changed": true, "dest": "/tmp/ansible_test/", "failed": false, "src": "/etc/ansible" } 拷貝目錄註意:源目錄會放到目標目錄下面去,如果目標指定的目錄不存在,它會自動創建。如果拷貝的是文件,dest指定的名字和源如果不同,並且它不是已經存在的目錄,相當於拷貝過去後又重命名。但相反,如果desc是目標機器上已經存在的目錄,則會直接把文件拷貝到該目錄下面。 [root@chy ~]# ansible chy01 -m copy -a "src=/etc/passwd dest=/tmp owner=root group=root mode=0755" //copy文件 chy01 | SUCCESS => { "changed": true, "checksum": "84c5bb4be970a90c7157c2d57401ca0ac0039eca", "dest": "/tmp/passwd", "failed": false, "gid": 0, "group": "root", "md5sum": "177c3249629069b366250d27ef7820df", "mode": "0755", "owner": "root", "size": 2182, "src": "/root/.ansible/tmp/ansible-tmp-1510078509.74-153887684649484/source", "state": "file", "uid": 0 }
[root@chy ~]# ansible chy01 -m copy -a "src=/etc/passwd dest=/tmp/copy.txt owner=root group=root mode=0755" //這裏需要註意一下就是如果想要將cp過去的文件改名稱直接可以在cp的過程中改名字,在操作時拷貝到相應的目錄後,後面直接跟文件名,這樣就會直接cp過去的
chy01 | SUCCESS => {
"changed": true,
"checksum": "84c5bb4be970a90c7157c2d57401ca0ac0039eca",
"dest": "/tmp/copy.txt",
"failed": false,
"gid": 0,
"group": "root",
"md5sum": "177c3249629069b366250d27ef7820df",
"mode": "0755",
"owner": "root",
"size": 2182,
"src": "/root/.ansible/tmp/ansible-tmp-1510078638.87-216978821762184/source",
"state": "file",
"uid": 0
}
[root@chy01 ~]# ls -ls /tmp/copy.txt //可以查看到已經cp過來並且已經改名成功
4 -rwxr-xr-x 1 root root 2182 Nov 8 02:17 /tmp/copy.txt
5 ansible遠程執行腳本
- shell模塊是用來執行腳本的,如下是更詳細的操作
[root@chy ~]# cat /tmp/1.sh #!/bin/bash echo `date` > /tmp/ansible_test.txt 寫一個輸出時間的腳本 之前的saltstack腳本可以直接搞到遠程並且執行,但是ansible必須先拷貝,之後在執行 [root@chy ~]# ansible testhost -m copy -a "src=/tmp/1.sh dest=/tmp/test.sh mode=0755" //執行的是兩臺機器 chy02 | SUCCESS => { "changed": true, "checksum": "1d452b51a06996a4ead87e91a7a288d3318f3e0c", "dest": "/tmp/test.sh", "failed": false, "gid": 0, "group": "root", "md5sum": "8d6e5eb9fca38ae7c456a9da182e4426", "mode": "0755", "owner": "root", "size": 50, "src": "/root/.ansible/tmp/ansible-tmp-1510080028.29-281241865001849/source", "state": "file", "uid": 0 } chy01 | SUCCESS => { "changed": true, "checksum": "1d452b51a06996a4ead87e91a7a288d3318f3e0c", "dest": "/tmp/test.sh", "failed": false, "gid": 0, "group": "root", "md5sum": "8d6e5eb9fca38ae7c456a9da182e4426", "mode": "0755", "owner": "root", "size": 50, "src": "/root/.ansible/tmp/ansible-tmp-1510080028.3-155921385180503/source", "state": "file", "uid": 0 } [root@chy ~]# ansible testhost -m shell -a "/tmp/test.sh" //之後在執行腳本,-a 後跟執行的腳本即可 chy01 | SUCCESS | rc=0 >> chy02 | SUCCESS | rc=0 >>
- command不能帶管道符,而shell可以用管道符
測試如下
[root@chy ~]# ansible chy01 -m command -a "cat /etc/passwd|wc -l" chy01 | FAILED | rc=1 >> cat:無效選項 -- l Try ‘cat --help‘ for more information.non-zero return code [root@chy ~]# ansible chy01 -m shell -a "cat /etc/passwd|wc -l" chy01 | SUCCESS | rc=0 >> 34
6 管理計劃
- 管理計劃用到的模塊是cron
如下操作
[root@chy ~]# ansible chy01 -m cron -a "name=‘test cron‘ job=‘/bin/touch/tmp/1212.txt‘ weekday=6" -m 後跟模塊的名稱,-a 跟執行的命令"name 跟任務的名稱,job跟命令是什麽,在後面就是分時日月周,如果定義就跟具體的,不定義直接跟*就可以 chy01 | SUCCESS => { "changed": true, "envs": [], "failed": false, "jobs": [ "test cron" ] } [root@chy01 ansible]# crontab -l //查看任務計劃 0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh 0 1 * * * /bin/python /home/jumpserver/manage.py crontab run 3718e5baf203ed0f54703b2f0b7e9e16 # django-cronjobs for jumpserver */10 * * * * /bin/python /home/jumpserver/manage.py crontab run 9956b75140f4453ab1dc4aeb62962a74 # django-cronjobs for jumpserver # Lines below here are managed by Salt, do not edit #Ansible: test cron * * * * 6 /bin/touch/tmp/1212.txt You have new mail in /var/spool/mail/root [root@chy ~]# ansible testhost -m cron -a "name=‘test cron‘ state=absent" 刪除任務計劃 chy01 | SUCCESS => { "changed": true, "envs": [], "failed": false, "jobs": [] } 切記在做任務計劃時千萬不要手動修改,任務計劃裏的# # Lines below here are managed by Salt, do not edit #Ansible: test cron 這行內容。
希望看過的童鞋多多指教,謝謝!
ansible介紹+基本操作