1. 程式人生 > >從零開始搭建運維體系 - ansible

從零開始搭建運維體系 - ansible

從零開始搭建運維體系 - ansible

基本配置好了區域網內的機器後,第一個遇到的問題就是如何批量操作這麼多臺機器,ansible就是這麼一個自動化運維工具。

ansible是一個基於ssh的批量遠端操作命令工具。它有分管理端和被管理端,管理端安裝ansible,被管理端什麼都不需要安裝。這個是非常方便的。只要能遠端登陸上就可以。

ansible有兩種模式,ansible-hoc和ansible-playbook。簡單來說,ansible-hoc就是可以在console上一次執行多個命令。ansible-playbook就是預先編寫一個執行步驟,然後在不同機器上執行這個執行步驟。

配置好ssh的使用者名稱密碼

我選擇使用root賬號直接操作ssh的使用者,這樣我可以站在上帝視角做任何操作,當然這個也是一個雙刃劍,也附帶一定的危險性。

去每個機器上配置root密碼:

passwd root
輸入-123456

安裝ansible的管理機

ansible的安裝比較簡單。我選用的是yum安裝

安裝完成之後,所有的配置檔案都在

/etc/ansible/

下面。

ansible配置

修改ansible的預設host配置,在這個配置裡面就可以配置上使用者名稱和密碼

[local]
localhost ansible_connection=local

[test]
192.168.34.3    ansible_connection=ssh          ansible_user=root       ansible_ssh_pass=123456

[all]
localhost       ansible_connection=local
192.168.34.3    ansible_connection=ssh          ansible_user=root       ansible_ssh_pass=123456
192.168.34.4    ansible_connection=ssh          ansible_user=root       ansible_ssh_pass=123456
"/etc/ansible/hosts" 50L, 1261C

我配置了三個組,其中一個組叫local,它只有ansible的管理機local,直接使用ansible_connection=local就表示是操作的本機。
另外一個組叫做all,這個all包含了三臺機器,34.2~4(local)這個機器是本地機器的IP。
還有一個組叫做test,就代表我釋出之前先執行這臺程式,算是灰度釋出。

測試執行第一條命令

第一條命令長這樣:

ansible all -m ping

這個就是ansible-hoc模式,其中all 表示ansible操作在all這個組,-m表示呼叫的是什麼模組,ansible有很多模組,這個ping是最常用的模組之一。其他的常用模組使用可以參考

ansible常用模組介紹

你有可能返回這個錯誤

192.168.34.3 | FAILED | rc=-1 >>
Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.

這個就是說需要你把遠端伺服器加入到known_hosts中,當然你可以不需要加入,修改ansible配置檔案/etc/ansible/ansible.cfg

修改這個配置

host_key_checking = False

就可以不需要known_hosts就行了

[[email protected] var]# ansible all -m ping
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.34.3 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
192.168.34.4 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

使用ansible建立公司使用者

我們希望建立一個公司使用者,以後業務應用都用這個使用者進行執行,而不是使用root。那麼用ansible如何操作?

我們可以使用user模組,使用模組的好處是很容易寫出冪等的命令。可以多次執行。如果你不知道user模組有哪些可以配置,就使用命令ansible-doc -s user 來檢視,或者去官網檢視

ansible test -m user -a 'name=company shell=/bin/bash home=/home/company state=present password=$6$mysecretsalt$RGyLyUuTb8ssDdlZDeLV0gn3khYBQkdIAuyRwAVr9WcH5FpUH6V7qBd4ZI59DXaAuL9Zmift0CTv8mCsQG3Ws.'

這裡的password是怎麼生成的呢?

可以使用這個命令:

ansible all -i localhost, -m debug -a "msg={{ 'company123' | password_hash('sha512', 'mysecretsalt') }}"

將輸出的密碼複製到使用者裡面

192.168.34.3 | CHANGED => {
    "append": false,
    "changed": true,
    "comment": "",
    "group": 1001,
    "home": "/home/company",
    "move_home": false,
    "name": "company",
    "password": "NOT_LOGGING_PASSWORD",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 1001
}

建立成功了。這裡的state=present代表如果這個使用者不存在就建立,如果這個使用者存在就不建立。所以這個命令是冪等的。

然後我就可以對所有機器執行這個操作了。

[[email protected] var]# ansible all -m user -a 'name=company shell=/bin/bash home=/home/company state=present password=$6$mysecretsalt$RGyLyUuTb8ssDdlZDeLV0gn3khYBQkdIAuyRwAVr9WcH5FpUH6V7qBd4ZI59DXaAuL9Zmift0CTv8mCsQG3Ws.'

批量修改hostname

我希望修改每個機器的hostname, 根據它的ip(ansible定義給它的host)修改為xx-xx-xx-xx,把ip中的點換成-

這個時候就需要用到playbook了。其實playbook本質就是yml。你可以在yml中定義你這個指令碼需要執行在哪個機器,執行哪些命令。

比如修改hostname的playbook如下:

- hosts: test
  tasks:
  - hostname : name={{ ansible_host.split('.') | join('-') }}

操作在test機器組,執行hostname的命令,其中的ansible_host是我ansible呼叫的host,先用.切割成陣列,再用-拼接起來。

如果你還對這些變數和命令比較不熟悉,建議先使用debug模組在ansible-hoc上嘗試一下:

[[email protected] ~]# ansible test  -m debug -a "msg={{ansible_host.split('.') | join('-')}}"
192.168.34.3 | SUCCESS => {
    "msg": "192-168-34-3"
}

好,執行這個playbook:

[[email protected] ~]# ansible-playbook /etc/ansible/playbooks/change_hostname.yml

PLAY [test] ******************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************
ok: [192.168.34.3]

TASK [hostname] **************************************************************************************************************************************
changed: [192.168.34.3]

PLAY RECAP *******************************************************************************************************************************************
192.168.34.3               : ok=2    changed=1    unreachable=0    failed=0

登陸到機器上,或者直接使用shell模組看,成功了

[[email protected] ~]# ansible test -m shell -a 'hostname'
192.168.34.3 | CHANGED | rc=0 >>
192-168-34-3

對所有機器執行這個操作,修改/etc/ansible/playbooks/change_hostname.yml裡面的hosts為all。

需要把這個company使用者加入到sudoer列表中, 並且把我管理機上的company使用者設定為授信使用者

首先我管理機上company使用者先建立公鑰,切換到company使用者上,命令ssh-keygen生成公鑰和私鑰,公鑰在/home/company/.ssh/id_rsa.pub

授信就是把公鑰放到需要授權的機器上的authroized_key中。

增加使用者到sudoers呢就是在/etc/sudoers中增加一行使用者資訊,並且設定NO PASSWORD。

ansible中最爽的就是有模組的概念,這兩個操作都有模組提供,一個是linefile模組,一個是authorized_key模組

- hosts: test
  tasks:
  - name: 確保存在company這個group
    group: name=company state=present
  - name: 允許company組的人可以無密碼切換sudo
    linefile:
      dest: /etc/sudoers
      state: present
      regexp: '^%company'
      line: '%company ALL=(ALL) NOPASSWD: ALL'
      validate: 'visudo -cf %s'
  - name: 為company使用者設定authorized_key
    authorized_key: user=company key="{{item}}"
    with_file:
      - /home/company/.ssh/id_rsa.pub

完整playbook如上。