1. 程式人生 > >ansible 用戶批量創建與管理

ansible 用戶批量創建與管理

forever 加密算法 .get sca -- 修改密碼 update 機器 http

本文主要總結如何用ansible 進行用戶管理, 主要包括兩個方面:

  1. 用戶創建,用戶屬性管理,以及批量創建用戶
  2. 批量解決用戶免密碼登錄遠程被控制機器

以下是實驗使用的 /etc/ansible/hosts 文件

cat   /etc/ansible/hosts 
[test]
192.168.188.109
[apps]
192.168.188.110 
192.168.188.108 
192.168.188.109 
192.168.188.111 

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

總結

現在,已經對在ansible 中如何創建和管理用戶有了解了。特別是 user 模塊和 authorize_key 模塊,都是很好用的模塊。可以幫我們順利應付日常的需求。

ansible 用戶批量創建與管理