天天看點

《Ansible權威指南》一3.4 Ad-Hoc使用者與組管理

本節書摘來自華章出版社《ansible權威指南》一書中的第3章,第3.4節,作者 李松濤 魏 巍 甘 捷 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

3.4 ad-hoc使用者與組管理

使用者權限管理是運維日常最重要的管理工作之一,如生産環境禁用開發和測試人員登入變更,但測試環境的使用者權限仍需耗費精力維護,這項工作大公司也存在(将測試環境交給測試或開發管理并不是每個公司都能做到的,但未來是趨勢)。是以掌握ad-hoc使用者與組管理很有用,如筆者現在的公司每次大版本更新後都會大量修改所有伺服器密碼。每次需要修改數十台伺服器環境密碼,若手動單台登入修改可是一項不小的工作,并且手動方式難免會出錯誤。本節為大家介紹ad-hoc使用者與組管理。

ansible系統使用者子產品有如下兩個:

linux系統使用者管理:user。

windows系統使用者管理:win_user。

3.4.1 linux使用者管理

user子產品功能諸多,各功能作用幾乎完全覆寫平時工作正常及非正常場景。子產品所有屬性如表3-2所示。

表3-2 user子產品屬性

參 數  必填項  預設值  選 項  注 釋

append no  no  yes

no  yes:增量添加group

no:全量變更group,隻設定groups指定的group組

comment    no             可選設定使用者賬戶的描述(又名gecos)

createhome no  yes yes

no  預設yes,當建立使用者期時或家目錄不存在時為使用者建立home目錄

expires(1.9版本增加) no  無        1.9版本的新增功能,使用者過期時間,不支援的平台該參數将被忽略,現在支援linux和freebsd

force    no  no  yes

no  強制,當和state=absent結合使用時,效果等同于userdel --force

generate_ssh_key    no  no  yes

no  是否生成ssh key,不會覆寫已有的ssh key

group   no             (可選)設定使用者屬組

groups  no             設定使用者附加群組,使用逗号分隔多個群組,如果參數為空(即'groups='),則删除使用者所有附加組(屬組不受影響)

home    no             (可選)設定使用者家目錄

login_class   no             (可選)設定freebsd、openbsd、netbsd系統的使用者登入class

move_home      no  no  yes

no  如設定為yes,結合使用home=,臨時遷移使用者家目錄到特定目錄

name    yes            使用者名

non_unique  no  no  yes

no  (可選)和-u結合使用,允許改變使用者id為非唯一值

password    no             (可選)設定使用者密碼為該項指定的密碼(加密後的密碼),詳細請參考httpdocs.ansible.comansiblefaq.html#

how-do-i-generate-crypted-passwords-for-the-user-module

需要注意的是,在darwin系統,該選項必須是明文,請注意安全問題

remove no  no  yes

no  結合state=absent使用相當于userdel --remove

seuser   no             (可選)設定seuser類型啟用selinux

(2.1版本增加)                     

shell     no             (可選)設定使用者shell

skeleton      no             (可選)設定使用者的skel目錄,需和createhome參數結合使用

ssh_key_bits     no  2048          (可選)指定生成的ssh key加密位數

ssh_key_comment   no  ansible-generated

on $hostname          (可選)定義ssh key注釋

ssh_key_file no  .sshid_rsa         (可選)指定ssh key檔案名,如果該檔案名是相對路徑,則預設路徑為使用者家目錄

ssh_key_passphrase no             設定ssh key密碼,如果沒有提供密碼,則預設沒有加密

ssh_key_type    no  rsa       (可選)指定ssh key類型,具體可用的ssh key類型取決于目标主機

state     no  present present

absent  present:建立(使存在)使用者

absent:删除使用者

system  no  no  yes

no  當建立新賬戶時,該選項為yes,為使用者設定系統賬戶,該設定對已經存在的使用者無效

uid  no             (可選)設定使用者uid

update_password(1.3版本增加)    no  always  always

on_create    always:隻有當密碼不相同時才會更新密碼

on_create:隻為新使用者設定密碼

日常工作所需功能幾乎均囊括在内,接下來為大家介紹使用者相關的五大場景應用,以供參考。

場景1:新增使用者。

需求描述:新增使用者dba,使用bash shell,附加組為admins, dbagroup,家目錄為homedba。

該場景中我們可以掌握如下技能點。

1)groups設定:groups=使用者組1,使用者組2……

2)增量添加屬組:append=yes

3)表明屬組狀态為建立:state=present

執行指令:

ansibledb -m

user -a name=dba shell=binbash groups=admins,dbagroup append=yes home=homedba

state=present

傳回結果如下:

192.168.37.142  success 

{

    changed true,

    comment ,

    createhome true,

    group 503,

    groups admins,dbagroup,

    home homedba,

    name dba,

    shell binbash,

    state present,

    system false,

    uid 501

}

傳回結果資訊非常簡潔明了,這裡不再一一做解釋

場景2:修改使用者屬組。

需求描述:修改dba附件組為dbagroups(即删除admins組權限)。

全量變更屬組資訊:append=no

user -a name=dba groups=dbagroup append=no

    append false,

    groups dbagroup,

    move_home false,

删除admins組權限的指令中 append值為no。 另外,細心的朋友會發現,新增使用者時,ansible預設為使用者添加使用者組(primary group)。

場景3:修改使用者屬性。

需求描述:設定dba使用者的過期時間為201661

180000 (unixtime 1464775200)。

1)設定使用者登入過期時間:expire=1464775200

2)unix時間轉換:201661 180000需轉換為unixtime格式(不做介紹,請自行百度)

user -a name=dba  expires=1464775200

這樣,我們已經完成了dba使用者的過期時間設定。

場景4:删除使用者。

需求描述:删除使用者dba,并删除其家目錄和郵件清單。

該場景中我們可以掌握如下技能點:

1)表明屬組狀态為删除:state=absent

2)設定remove=yes:remove=yes

user -a name=dba state=absent remove=yes

結果檢查:到對應主機使用root使用者檢視etcpasswd是否存在dba使用者,或執行指令id dba确認是否有結果傳回。

場景5:變更使用者密碼。

需求描述:設定系統使用者tom的密碼為redhat123。

user -a name=tom shell=binbash password=to46pw3goukva update_password=always

請注意,password後的字元串to46pw3goukva并非真正的密碼,而是經過加密後的密碼。ansible變更使用者密碼方式與直接通過系統指令passwd修改密碼有較大差别。ansible變更密碼時所使用的密碼是将明文密碼加密後的密碼(有些拗口)。官網上介紹了兩種密碼加密方式,筆者建議使用方式2 passlib,因為mkpasswd方式因系統而異,功能差異較大。

方式1:使用指令mkpasswd生成密碼。

步驟1:查找安裝包名稱。

執行指令:yum whatprovides mkpasswd,結果如下。

epelfilelists_db                                          8.0

mb

expect-5.44.1.15-5.el6_4.x86_64  a program-script interaction and testing

utility

repo         base

matched from

filename     usrbinmkpasswd

步驟2:安裝軟體包。

centos 6.5執行指令:yum install expect

debian6 ubuntu

12.04執行指令:sudo apt-get

install whois

步驟3:使用mkpasswd生成密碼。

執行指令:mkpasswd --method=sha-512

筆者也對安裝的軟體包(centos安裝expect, debian&ubuntu安裝whois)感覺詫異,一番google查詢也沒有結果。因為這與本書内容關系不大是以沒有深究,感興趣的朋友自行研究後可告知筆者,以便後續補充給使用者。

方式2:使用python的passlib、getpass庫生成密碼。

步驟1:安裝passlib(python版本建議2.7以上)。

pip install

passlib

步驟2:生成密碼。

python 3.x系列版本請使用如下指令(sha512加密算法)。

python -c from

passlib.hash import sha512_crypt; import getpass; print

(sha512_crypt.encrypt(getpass.getpass()))

python 3.x系列版本請使用如下指令(普通加密算法)。

python -c

'import crypt; print (crypt.crypt(redhat123, dba))'

python 2.x系列版本請使用如下指令(sha512加密算法)。

sha512_crypt.encrypt(getpass.getpass())

python 2.x系列版本請使用如下指令(普通加密算法)。

生成的密碼如圖3-7所示。

《Ansible權威指南》一3.4 Ad-Hoc使用者與組管理

1)同樣密碼多次加密結果不一樣屬正常情況,想深入了解的朋友可自行研究加密算法及原理。

2)ad-hoc方式建議使用普通算法加密,sha512加密後的密碼包括諸多特殊元字元,傳輸至遠端伺服器會有密碼被轉義截斷的問題。sha512加密算法建議在playbook中使用。

linux系統下的使用者與組管理涉及的各類場景本節均有介紹,作為運維日常最重要的工作之一,希望本節内容對相關人員會有幫助。

3.4.2 windows使用者管理

如第1章所介紹,作為關注度最高的集中化管理工具,ansible同樣支援windows系統。但考慮windows不開源的特殊性及伺服器市場的占有率,使得ansible與windows的結合使用時總是會出問題,但其實類似問題其他工具也同樣存在,這是windows特性使然。本章我們隻做簡單示範,第10章我們還介紹windows相關内容。

場景:新增使用者stanley,密碼為magedu@123,屬組為administrators。

ansible windows

-m win_user -a name=stanley passwd=magedu@123 group=administrators

傳回結果:

192.168.37.146  success 

    account_disabled false,

    account_locked false,

    description ,

    fullname stanley,

    groups [

        {

            name administrators,

            path winnt

workgrouplinuxlstadministrators

        }

    ],

    name stanley,

    password_expired true,

    password_never_expires false,

    path winnt workgrouplinuxlststanley,

    sid

s-1-5-21-3965499365-1200628009-3594530176-1004,

    user_cannot_change_password false

部分傳回結果诠釋:

account_disabled——禁用使用者登入;

account_locked——解鎖使用者;

groups——使用者所屬組;

name——使用者名;

password_expired——下次登入修改密碼;

user_cannot_change_password——使用者是否可修改密碼。

僅從操作上即可看出,ansible對windows的使用者管理也是基于linux管理方式的沿用,旨在簡單易用。

3.4.3 應用層使用者管理

前面兩小節為大家介紹了ansible基于linux和windows的系統管理。事實上,除開源系統類unix系統和大家耳熟能詳的windows系統以外,ansible也支援商業系統或産品類應用,系統如aws的iam,mac的osx;軟體如apache

cloudstack、jabberd、openstack、mongodb、mysql、postgresql、rabbitmq、vertica。本節我們以mysql使用者管理為例介紹。

情景:新增mysql使用者stanley,設定登入密碼為magedu@bj,對zabbix.表有all權限。

ansible db -m

mysql_user -a 'login_host=localhost login_password=magedu login_user=root

name=stanley password=magedu@bj priv=zabbix.all state=present'

    user stanley

登入驗證步驟如下。

1)在db伺服器上測試登入。

mysql -ustanley

-pmagedu@bj

2)執行指令:show grants for 'stanley'@'localhost';驗證權限是否正确。

其實如上指令存在很大的安全隐患,因為mysql的登入資訊完全暴露在指令台。ansible建議的使用方式如下。

1)在遠端主機的~.my.cnf檔案中配置root的登入資訊,配置資訊如下:

    [client]

user=root

password=magedu

2)指令行執行指令如下:

mysql_user -a 'name=stanley password=magedu@bj priv=zabbix.all state=present'

此方式密碼将不再暴露在控制台,在一定程度上提高了服務安全性。