本文主要總結如何用ansible 進行用戶管理, 主要包括兩個方面:
- 用戶創建,用戶屬性管理,以及批量創建用戶
- 批量解決用戶免密碼登錄遠程被控制機器
以下是實驗使用的 /etc/ansible/hosts 文件
cat /etc/ansible/hosts
[test]
192.168.188.109
[apps] # 這些都是 CentOS 的系統主機
192.168.188.110
192.168.188.108
192.168.188.109
192.168.188.111
[ubuntu]
192.168.188.112 ansible_ssh_user=hell
說明: ubuntu系統一般都不用root 用戶登錄的,所以,先給它設置一個用來登錄的用戶
ansible 用戶創建
當然,在 ansible 裏可以用很多方法創建用戶,例如:
ansible test -m shell -a 'useradd apple'
說明: 這個相當在遠程主機中用 shell 命令創建用戶,一般不推薦
其實,ansilbe 提供了一個 user 模塊,用於創建和管理用戶。
ansible 官方的user 模塊的說明文檔。
例如,創建一個有登錄shell 的用戶,用戶名是 apple:
ansible test -m user -a 'name=apple shell=/bin/bash home=/home/apple state=present'
說明:
name 指定創建的用戶名
shell 指定用戶登錄時獲得的shell
home 爲用戶創建 HOME 目錄
state 指定是創建還是刪除用戶,當 state=absent 時,爲刪除用戶
如果需要在多臺遠程主機中創建用戶
如果需要在多臺遠程主機中創建用戶,只需將所有主機添加到一個主機組,再執行一遍上面的命令就可以了
ansible apps -m user -a 'name=apple shell=/bin/bash home=/home/apple/ state=present'
將所有要操作的遠程主機添加到主機組 apps 中。
如何設置用戶密碼
用 ansible 設置用戶的密碼時,由於需要對傳輸的密碼進行加密,所以要在主機安裝python 的passlib 庫。
安裝方法與生成密碼的方法:
1. 安裝 passlib 要求系統 python 版本在2.7以上。
2. 利用 pip 安裝:
pip install passlib
3. 生成的經過加密的密碼:
例如,我們想給 apple 設置的密碼是 123456 ,那麼我們在 ansible 命令中,不能直接使用 123456 這樣的明
文傳輸,要對 123456 這個字符串進行加密再在 ansible 命令中使用。
那麼,如何對密碼 123456 進行加密呢?
4. 安裝完 passlib 後,生成加密的密碼:
4.1 python 3.x 版本(sha512 加密算法):
[root@centos_7 ~] python -c 'from passlib.hash import sha512_crypt; import getpass; print (sha512_crypt.encrypt(getpass.getpass()))'
Password:
$6$rounds=656000$3pLHgWNbPxYGlyvP$VsVlECg4v2Gr35XMzWCtLZyPO.l7Fg240/cGZbTI8qDea8fwY3ERSxAompHqQ4bjIlxeLPgWAUj64FMxunOCt.
說明: 在 Password 後輸入我們的密碼"123456",然後再按enter 鍵,就會生成經過加密的密碼了,$6$round....... 這一串字符
4.2 python 3.x 版本(普通加密算法):
其實就是生成的加密密碼短一點:
[root@centos_7 ~] python -c 'import crypt; print (crypt.crypt("123456","apple"))'
apnK4rIpkaoHo
說明: "pnK4rIpkaoHo" 就是生成的經過加密的密碼
4.3 python 2.x 版本(sha512 加密算法):
[root@centos_7 ~] python -c 'from passlib.hash import sha512_crypt; import getpass; print (sha512_crypt.encrypt(getpass.getpass()))'
4.4 python 2.x 版本(普通加密算法):
[root@centos_7 ~] python -c 'import crypt; print (crypt.crypt("123456","apple"))'
小結: 看到上面列出的4種加密方式,發現,其實python3.x 和 python2.x 版本的區別不大,只是加密算法是用 sha512 還是用普通算法的區別而已。
5. 用ansible 設置用戶密碼,下面的命令用於修改已經存在的用戶的密碼也是可以的:
ansilbe apps -m user -a 'name=apple shell=/bin/bash password=pnK4rIpkaoHo
update_password=always '
這樣,就可以修改密碼了。使用了普通加密的密文密碼。
小結:以上爲止,就是批量創建用戶的方法。並且對用戶的密碼設置方法做了重點說明,其他關於用戶的屬性操作,直接參考ansible 官方的user 模塊的說明文檔,更全面。
如何批量解決免密碼登錄遠程主機的問題
在文章的前半部分,已經在多臺遠程主機上創建了相同的賬號了,那麼怎麼解決登錄這些遠程主機時,需要用戶密碼的問題呢?
一般的辦法就是使用公鑰密鑰對驗證的方法。
一般的原理就是在本地主機創建密鑰對(包含公鑰和私鑰),然後將公鑰放到遠程主機,私鑰留着本地。當本地用戶要登錄遠程主機時,使用私鑰登錄,如何私鑰驗證通過了,登錄就成功。
例如,我們前面創建了 apple 用戶,怎麼樣將使得在本地用 apple 用戶登錄遠程的所有主機都不需要輸入密碼驗證呢?解決辦法:
1. 在本地也創建一個 apple 用戶,並創建 /home/apple/.ssh/ 目錄
useradd apple -s /bin/bash -d /home/apple/
創建 .ssh 目錄
mkdir /home/apple/.ssh
修改 .ssh 目錄的權限
chmod 700 /home/apple/.ssh
創建 /home/apple/.ssh/known_hosts 文件
2. 收集所有遠程主機的公鑰,保存在上 /home/apple/.ssh/known_hosts 文件。這一步的作用,是爲了在後面第一次ssh 連接時,不需要再輸密碼。
收集所有遠程主機的 公鑰,主要是利用 ssh-keyscan 命令:
ssh-keyscan -f ip.txt >> /home/apple/.ssh/known_hosts # 說明: ip.txt 文件存放所有的遠程主機 ip 地址,一行代表一臺主機。
3.創建公鑰私鑰對:
一般在對應用戶的 /home/apple/.ssh/ 目錄下創建。這也不是強制的,因爲在ssh 發起連接時,可以指定使用的私鑰文件。
ssk-keygen -t rsa 一直按回車鍵就可以了。但要注意生成的 id_rsa 和 id_rsa.pub 存放的路徑。
4. 將公鑰推送到所有的遠程主機
我們編寫playbook 文件,利用authorized_key 模塊就可以快速完成:
[root@centos_7 roles] cat ssh-addkey.yml
---
- hosts: apps # 對apps 組裏的所有遠程主機
gather_facts: False
tasks:
- name: install sshkey
authorized_key:
user: apple
key: "{{ lookup('file', '/home/apple/.ssh/id_rsa.pub') }}"
state: present
說明: 在前面1,2,3步中,我們已經準備好了公私鑰對了。推送到遠程主機,可以手動推送,或者使用scp 複製到遠程主機。但是利用scp 複製之後,還需要修改遠程主機上的 /home/apple/.ssh/authorize_keys 文件的權限等等。
ansible 的 authorized_key 模塊就自動幫我們做了這些工作。
執行, ansible-playbook ssh-addkye.yml
5. 結果
現在,就已經順利地在所有遠程主機上配置了用戶apple 的免密碼登錄了。
測試:
[root@centos_7 roles] ssh -i /home/apple/.ssh/id_rsa [email protected] # 用 -i 指定私鑰文件
Last login: Mon Jan 22 14:34:45 2018 from 192.168.188.107
查看 ip 地址:
[apple@centos_7_02 ~]$ ip addr
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2c:a5:a0 brd ff:ff:ff:ff:ff:ff
inet 192.168.188.110/24 brd 192.168.188.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2c:a5a0/64 scope link
valid_lft forever preferred_lft forever
補充 Debian 類系統的遠程主機如何批量設置
其實配置文件和配置方式都差不多。假設,在ubuntu 主機上,有一個 hell 用戶;在控制主機上不創建hell 用戶也不會有什麼影響。
簡單修改一下 playbook 文件:
[root@centos_7 roles] cat ssh-addkey-ubuntu.yml
---
- hosts: ubuntu
gather_facts: False
tasks:
- name: install sshkey
authorized_key:
user: hell
key: "{{ lookup('file', '/etc/ansible/roles/id_rsa.pub') }}"
state: present
說明: 由於沒有在 ansilble 控制主機創建hell 用戶,所以 key 字段裏的,公鑰文件位置就要修改一下了。
公鑰和私鑰,用的都是上面配置的公私鑰。
在執行 playbook 時,需要手動輸入一次遠程主機用戶 hell 的登錄密碼:
結果:
[root@centos_7 roles] ansible-playbook ssh-addkey-ubuntu.yml -k # 使用 -k 參數,即詢問密碼
SSH password:
PLAY [ubuntu] *******************************************************************************************
TASK [install sshkey] **********************************************************************************
changed: [192.168.188.112]
PLAY RECAP ***************************************************************************************
192.168.188.112 : ok=1 changed=1 unreachable=0 failed=0
結束之後,ansible 遠程操作 ubuntu 時,就可以用 hell 用戶免密碼連接操作了。
測試:
[root@centos_7 roles]# ansible ubuntu -m setup -a "filter=ansible_os_family"
192.168.188.112 | SUCCESS => {
"ansible_facts": {
"ansible_os_family": "Debian"
},
"changed": false
}
總結
現在,已經對在ansible 中如何創建和管理用戶有了解了。特別是 user 模塊和 authorize_key 模塊,都是很好用的模塊。可以幫我們順利應付日常的需求。