Ansible :一個配置管理和IT自動化工具(2/3)

設置 SSH 公鑰認證

因而咱們有了一份配置,以及一些基礎的其餘東西。如今讓咱們來作一些實用的事情。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 到新的機器上,就完成了管理全部東西的所有設置流程。

下一步:

相關文章
相關標籤/搜索