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

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

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

ansible是一個基於ssh的批量遠程操做命令工具。它有分管理端和被管理端,管理端安裝ansible,被管理端什麼都不須要安裝。這個是很是方便的。只要能遠程登錄上就能夠。shell

ansible有兩種模式,ansible-hoc和ansible-playbook。簡單來講,ansible-hoc就是能夠在console上一次執行多個命令。ansible-playbook就是預先編寫一個執行步驟,而後在不一樣機器上執行這個執行步驟。數組

配置好ssh的用戶名密碼

我選擇使用root帳號直接操做ssh的用戶,這樣我能夠站在上帝視角作任何操做,固然這個也是一個雙刃劍,也附帶必定的危險性。bash

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

passwd root
輸入-123456

安裝ansible的管理機

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

安裝完成以後,全部的配置文件都在運維

/etc/ansible/

下面。ssh

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就好了

[root@localhost 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表明若是這個用戶不存在就建立,若是這個用戶存在就不建立。因此這個命令是冪等的。

而後我就能夠對全部機器執行這個操做了。

[root@localhost 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上嘗試一下:

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

好,執行這個playbook:

[root@localhost ~]# 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模塊看,成功了

[root@localhost ~]# 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如上。

相關文章
相關標籤/搜索