天天看点

《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'

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