從零開始搭建運維體系 - 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就行了
[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如上。