從零開始搭建運維體系 - 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是最常用的模組之一。其他的常用模組使用可以參考
你有可能返回這個錯誤
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如上。