因而咱們有了一份配置,以及一些基礎的其餘東西。如今讓咱們來作一些實用的事情。ansible 的強大很大程度上體如今 playbooks 上,後者基本上就是一些寫好的 ansible 腳本(大部分來講),不過在製做一個 playbook 以前,咱們將先從一些一句話腳本開始。如今讓咱們建立和配置 SSH 公鑰認證,以便省去 -c 和 --ask-pass 選項:linux
$ ssh-keygen -t rsa
樣例輸出:git
Generating public/private rsa key pair. Enter file in which to save the key (/home/mike/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/mike/.ssh/id_rsa. Your public key has been saved in /home/mike/.ssh/id_rsa.pub. The key fingerprint is: 94:a0:19:02:ba:25:23:7f:ee:6c:fb:e8:38:b4:f2:42 mike@ultrabook.linuxdork.com The key's randomart image is: +--[ RSA 2048]----+ |... . . | |. . + . . | |= . o o | |.* . | |. . . S | | E.o | |.. .. | |o o+.. | | +o+*o. | +-----------------+
如今顯然有不少種方式來把它放到遠程主機上應該的位置。不過既然咱們正在使用 ansible,就用它來完成這個操做吧:shell
$ ansible all -m copy -a "src=/home/mike/.ssh/id_rsa.pub dest=/tmp/id_rsa.pub" --ask-pass -c paramiko
樣例輸出:apache
SSH password: 127.0.0.1 | success >> { "changed": true, "dest": "/tmp/id_rsa.pub", "gid": 100, "group": "users", "md5sum": "bafd3fce6b8a33cf1de415af432774b4", "mode": "0644", "owner": "mike", "size": 410, "src": "/home/mike/.ansible/tmp/ansible-tmp-1407008170.46-208759459189201/source", "state": "file", "uid": 1000 }
下一步,把公鑰文件添加到遠程服務器裏。輸入:服務器
$ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko
樣例輸出:數據結構
SSH password: 127.0.0.1 | FAILED | rc=1 >> /bin/sh: /root/.ssh/authorized_keys: Permission denied
矮油,咱們須要用 root 來執行這個命令,因此仍是加上一個 -u 參數吧:dom
$ ansible all -m shell -a "cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys" --ask-pass -c paramiko -u root
樣例輸出:ssh
SSH password: 127.0.0.1 | success | rc=0 >>
請注意,我剛纔這是想要演示經過 ansible 來傳輸文件的操做。事實上 ansible 有一個更加方便的內置 SSH 密鑰管理支持:ide
$ ansible all -m authorized_key -a "user=mike key='{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}' path=/home/mike/.ssh/authorized_keys manage_dir=no" --ask-pass -c paramiko
樣例輸出:工具
SSH password: 127.0.0.1 | success >> { "changed": true, "gid": 100, "group": "users", "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCq+Z8/usprXk0aCAPyP0TGylm2MKbmEsHePUOd7p5DO1QQTHak+9gwdoJJavy0yoUdi+C+autKjvuuS+vGb8+I+8mFNu5CvKiZzIpMjZvrZMhHRdNud7GuEanusTEJfi1pUd3NA2iXhl4a6S9a/4G2mKyf7QQSzI4Z5ddudUXd9yHmo9Yt48/ASOJLHIcYfSsswOm8ux1UnyeHqgpdIVONVFsKKuSNSvZBVl3bXzhkhjxz8RMiBGIubJDBuKwZqNSJkOlPWYN76btxMCDVm07O7vNChpf0cmWEfM3pXKPBq/UBxyG2MgoCGkIRGOtJ8UjC/daadBUuxg92/u01VNEB mike@ultrabook.linuxdork.com", "key_options": null, "keyfile": "/home/mike/.ssh/authorized_keys", "manage_dir": false, "mode": "0600", "owner": "mike", "path": "/home/mike/.ssh/authorized_keys", "size": 410, "state": "file", "uid": 1000, "unique": false, "user": "mike" }
如今這些密鑰已經設置好了。咱們來試着隨便跑一個命令,好比 hostname,但願咱們不會被提示要輸入密碼:
$ ansible all -m shell -a "hostname" -u root
樣例輸出:
127.0.0.1 | success | rc=0 >>
成功!!!如今咱們能夠用 root 來執行命令,而且不會被輸入密碼的提示干擾了。咱們如今能夠輕易地配置任何在 ansible hosts 文件中的主機了。讓咱們把 /tmp 中的公鑰文件刪除:
$ ansible all -m file -a "dest=/tmp/id_rsa.pub state=absent" -u root
樣例輸出:
127.0.0.1 | success >> { "changed": true, "path": "/tmp/id_rsa.pub", "state": "absent" }
下面咱們來作一些更復雜的事情,我要肯定一些軟件包已經安裝了,而且已是最新的版本:
$ ansible all -m zypper -a "name=apache2 state=latest" -u root
樣例輸出:
127.0.0.1 | success >> { "changed": false, "name": "apache2", "state": "latest" }
很好,咱們剛纔放在 /tmp 中的公鑰文件已經消失了,並且咱們已經安裝好了最新版的 apache。下面咱們來看看前面命令中的 -m zypper,一個讓 ansible 很是靈活,而且給了 playbooks 更多能力的功能。若是你不使用 openSuse 或者 Suse enterprise 你可能還不熟悉 zypper, 它基本上就是 suse 世界中至關於 yum 的存在。在上面全部的例子中,個人 hosts 文件中都只有一臺機器。除了最後一個命令外,其餘全部命令都應該在任何標準的 *nix 系統和標準的 ssh 配置中使用,這形成了一個問題。若是咱們想要同時管理多種不一樣的機器呢?這即是 playbooks 和 ansible 的可配置性閃閃發光的地方了。首先咱們來少量修改一下咱們的 hosts 文件:
$ cat ~/ansible_hosts
樣例輸出:
[RHELBased] 10.50.1.33 10.50.1.47 [SUSEBased] 127.0.0.1
首先,咱們建立了一些分組的服務器,而且給了他們一些有意義的標籤。而後咱們來建立一個爲不一樣類型的服務器執行不一樣操做的 playbook。你可能已經發現這個 yaml 的數據結構和咱們以前運行的命令行語句中的類似性了。簡單來講,-m 是一個模塊,而 -a 用來提供模塊參數。在 YAML 表示中你能夠先指定模塊,而後插入一個冒號 :,最後指定參數。
--- - hosts: SUSEBased remote_user: root tasks: - zypper: name=apache2 state=latest - hosts: RHELBased remote_user: root tasks: - yum: name=httpd state=latest
如今咱們有一個簡單的 playbook 了,咱們能夠這樣運行它:
$ ansible-playbook testPlaybook.yaml -f 10
樣例輸出:
PLAY [SUSEBased] ************************************************************** GATHERING FACTS *************************************************************** ok: [127.0.0.1] TASK: [zypper name=apache2 state=latest] ************************************** ok: [127.0.0.1] PLAY [RHELBased] ************************************************************** GATHERING FACTS *************************************************************** ok: [10.50.1.33] ok: [10.50.1.47] TASK: [yum name=httpd state=latest] ******************************************* changed: [10.50.1.33] changed: [10.50.1.47] PLAY RECAP ******************************************************************** 10.50.1.33 : ok=2 changed=1 unreachable=0 failed=0 10.50.1.47 : ok=2 changed=1 unreachable=0 failed=0 127.0.0.1 : ok=2 changed=0 unreachable=0 failed=0
注意,你會看到 ansible 聯繫到的每一臺機器的輸出。-f 參數讓 ansible 在多臺主機上同時運行指令。除了指定所有主機,或者一個主機分組的名字之外,你還能夠把導入 ssh 公鑰的操做從命令行裏轉移到 playbook 中,這將在設置新主機的時候提供很大的方便,甚至讓新主機直接能夠運行一個 playbook。爲了演示,咱們把咱們以前的公鑰例子放進一個 playbook 裏:
--- - hosts: SUSEBased remote_user: mike sudo: yes tasks: - authorized_key: user=root key="{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}" path=/root /.ssh/authorized_keys manage_dir=no - hosts: RHELBased remote_user: mdonlon sudo: yes tasks: - authorized_key: user=root key="{{ lookup('file', '/home/mike/.ssh/id_rsa.pub') }}" path=/root /.ssh/authorized_keys manage_dir=no
除此以外還有不少能夠作的事情,好比在啓動的時候把公鑰配置好,或者引入其餘的流程來讓你按需配置一些機器。不過只要 SSH 被配置成接受密碼登錄,這些幾乎能夠用在全部的流程中。在你準備開始寫太多 playbook 以前,另外一個值得考慮的事情是,代碼管理能夠有效節省你的時間。機器須要不斷變化,然而你並不須要在每次機器發生變化時都從新寫一個 playbook,只須要更新相關的部分並提交這些修改。與此相關的另外一個好處是,如同我以前所述,你能夠從不一樣的地方管理你的整個基礎結構。你只須要將你的 playbook 倉庫 git clone 到新的機器上,就完成了管理全部東西的所有設置流程。
下一步: