從零開始搭建運維體系 - 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的安裝比較簡單。我選用的是ofollow,noindex" target="_blank">yum安裝
安裝完成之後,所有的配置檔案都在
/etc/ansible/
下面。
ansible配置
修改ansible的預設host配置,在這個配置裡面就可以配置上使用者名稱和密碼
[local] localhost ansible_connection=local [test] 192.168.34.3ansible_connection=sshansible_user=rootansible_ssh_pass=123456 [all] localhostansible_connection=local 192.168.34.3ansible_connection=sshansible_user=rootansible_ssh_pass=123456 192.168.34.4ansible_connection=sshansible_user=rootansible_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=2changed=1unreachable=0failed=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如上。