基本配置好了局域網內的機器後,第一個遇到的問題就是如何批量操做這麼多臺機器,ansible就是這麼一個自動化運維工具。html
ansible是一個基於ssh的批量遠程操做命令工具。它有分管理端和被管理端,管理端安裝ansible,被管理端什麼都不須要安裝。這個是很是方便的。只要能遠程登錄上就能夠。shell
ansible有兩種模式,ansible-hoc和ansible-playbook。簡單來講,ansible-hoc就是能夠在console上一次執行多個命令。ansible-playbook就是預先編寫一個執行步驟,而後在不一樣機器上執行這個執行步驟。數組
我選擇使用root帳號直接操做ssh的用戶,這樣我能夠站在上帝視角作任何操做,固然這個也是一個雙刃劍,也附帶必定的危險性。bash
去每一個機器上配置root密碼:服務器
passwd root 輸入-123456
ansible的安裝比較簡單。我選用的是yum安裝app
安裝完成以後,全部的配置文件都在運維
/etc/ansible/
下面。ssh
修改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" }
咱們但願建立一個公司用戶,之後業務應用都用這個用戶進行運行,而不是使用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, 根據它的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用戶先建立公鑰,切換到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如上。