《Ansible权威指南 》一3.4 Ad-Hoc用户与组管理

3.4 Ad-Hoc用户与组管理

用户权限管理是运维日常最重要的管理工作之一,如生产环境禁用开发和测试人员登录变更,但测试环境的用户权限仍需耗费精力维护,这项工作大公司也存在(将测试环境交给测试或开发管理并不是每个公司都能做到的,但未来是趋势)。所以掌握Ad-Hoc用户与组管理很有用,如笔者现在的公司每次大版本更新后都会大量修改所有服务器密码。每次需要修改数十台服务器环境密码,若手动单台登录修改可是一项不小的工作,并且手动方式难免会出错误。本节为大家介绍Ad-Hoc用户与组管理。
Ansible系统用户模块有如下两个:

Linux系统用户管理:user。
Windows系统用户管理:win_user。

3.4.1 Linux用户管理

User模块功能诸多,各功能作用几乎完全覆盖平时工作常规及非常规场景。模块所有属性如表3-2所示。

参 数 必填项 默认值 选 项 注 释

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          (可选)设置用户密码为该项指定的密码(加密后的密码),详细请参考http://docs.ansible.com/ansible/faq.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_f?ile   no  .ssh/id_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,家目录为/home/dba/。
该场景中我们可以掌握如下技能点。
1)groups设定:groups=用户组1,用户组2……
2)增量添加属组:append=yes
3)表明属组状态为新建:state=present
执行命令:

ansibledb -m user -a "name=dba shell=/bin/bash groups=admins,dbagroup append=yes home=/home/dba/ state=present"

返回结果如下:

192.168.37.142 | success >> {
    "changed": true,
    "comment": "",
    "createhome": true,
    "group": 503,
    "groups": "admins,dbagroup",
    "home": "/home/dba/",
    "name": "dba",
    "shell": "/bin/bash",
    "state": "present",
    "system": false,
    "uid": 501
}

返回结果信息非常简洁明了,这里不再一一做解释
场景2:修改用户属组。
需求描述:修改DBA附件组为dbagroups(即删除admins组权限)。
该场景中我们可以掌握如下技能点。
全量变更属组信息:append=no
执行命令:

ansibledb -m user -a "name=dba groups=dbagroup append=no"

返回结果如下:

192.168.37.142 | success >> {
    "append": false,
    "changed": true,
    "comment": "",
    "group": 503,
    "groups": "dbagroup",
    "home": "/home/dba/",
    "move_home": false,
    "name": "dba",
    "shell": "/bin/bash",
    "state": "present",
    "uid": 501
}

删除admins组权限的命令中 append值为no。 另外,细心的朋友会发现,新增用户时,Ansible默认为用户添加用户组(primary group)。
场景3:修改用户属性。
需求描述:设置dba用户的过期时间为2016/6/1 18:00:00 (UNIXTIME: 1464775200)。
该场景中我们可以掌握如下技能点。
1)设置用户登录过期时间:expire=1464775200
2)UNIX时间转换:2016/6/1 18:00:00需转换为UNIXTIME格式(不做介绍,请自行百度)
执行命令:

ansibledb -m user -a "name=dba  expires=1464775200"

这样,我们已经完成了DBA用户的过期时间设置。
场景4:删除用户。
需求描述:删除用户DBA,并删除其家目录和邮件列表。
该场景中我们可以掌握如下技能点:
1)表明属组状态为删除:state=absent
2)设定remove=yes:remove=yes
执行命令:

ansibledb -m user -a "name=dba state=absent remove=yes"

结果检查:到对应主机使用ROOT用户查看/etc/passwd是否存在dba用户,或执行命令id dba确认是否有结果返回。
场景5:变更用户密码。
需求描述:设置系统用户tom的密码为redhat123。
执行命令:

ansibledb -m user -a "name=tom shell=/bin/bash password=to46pW3GOukvA update_password=always"

请注意,password后的字符串to46pW3GOukvA并非真正的密码,而是经过加密后的密码。Ansible变更用户密码方式与直接通过系统命令passwd修改密码有较大差别。Ansible变更密码时所使用的密码是将明文密码加密后的密码(有些拗口)。官网上介绍了两种密码加密方式,笔者建议使用方式2 passlib,因为mkpasswd方式因系统而异,功能差异较大。
方式1:使用命令mkpasswd生成密码。
步骤1:查找安装包名称。
执行命令:yum whatprovides */mkpasswd,结果如下。

epel/filelists_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    : /usr/bin/mkpasswd

步骤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加密算法)。
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
Python 2.X系列版本请使用如下命令(普通加密算法)。
python -c 'import crypt; print (crypt.crypt("redhat123", "dba"))'

生成的密码如图3-7所示。

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,
    "changed": true,
    "description": "",
    "fullname": "stanley",
    "groups": [
        {
            "name": "Administrators",
            "path": "WinNT:// WORKGROUP/LINUXLST/Administrators"
        }
    ],
    "name": "stanley",
    "password_expired": true,
    "password_never_expires": false,
    "path": "WinNT:// WORKGROUP/LINUXLST/stanley",
    "sid": "S-1-5-21-3965499365-1200628009-3594530176-1004",
    "state": "present",
    "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'

返回结果:

192.168.37.142 | success >> {
    "changed": true,
    "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)命令行执行命令如下:

ansible db -m mysql_user -a 'name=stanley password=magedu@bj priv=zabbix.*:ALL state=present'

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

时间: 2025-01-24 14:38:05

《Ansible权威指南 》一3.4 Ad-Hoc用户与组管理的相关文章

Ansible权威指南.

Linux/Unix技术丛书 Ansible权威指南 李松涛 魏 巍 甘 捷 著 图书在版编目(CIP)数据 Ansible权威指南 / 李松涛,魏巍,甘捷著. -北京:机械工业出版社,2016.11 (Linux/Unix技术丛书) ISBN 978-7-111-55329-8 I. A- II. ①李- ②魏- ③甘- III. 程序开发工具-指南 IV. TP311.561-62 中国版本图书馆CIP数据核字(2016)第258615号 Ansible权威指南 出版发行:机械工业出版社(北

《Ansible权威指南 》一 导读

前 言 为什么要写这本书 首次接触Ansible是缘于一次杭州出差.当时接触互联网3年左右,正是技能的储备阶段,看到Ansible这样的新兴自动化工具不免充满好奇.当时腾讯的蓝鲸还没有出来,但abs脚本和ijobs自动化体系已经应用多年,并在整个IEG中心广泛应用.大型企业讲究分工精细化,各司其职,强大的自我研发能力.但伴随业绩和KPI的压力,很多人其实是没有多余精力关注外界技术领域的发展,尤其是游戏行业,行业自身属性对开发人员的技术能力要求非常高,前沿开源技术与业务特殊性需求并不能很好地融合,

《Ansible权威指南》一3.4 Ad-Hoc用户与组管理

3.4 Ad-Hoc用户与组管理 用户权限管理是运维日常最重要的管理工作之一,如生产环境禁用开发和测试人员登录变更,但测试环境的用户权限仍需耗费精力维护,这项工作大公司也存在(将测试环境交给测试或开发管理并不是每个公司都能做到的,但未来是趋势).所以掌握Ad-Hoc用户与组管理很有用,如笔者现在的公司每次大版本更新后都会大量修改所有服务器密码.每次需要修改数十台服务器环境密码,若手动单台登录修改可是一项不小的工作,并且手动方式难免会出错误.本节为大家介绍Ad-Hoc用户与组管理. Ansible

《Ansible权威指南 》一 3.3 Ad-Hoc组管理和特定主机变更

3.3 Ad-Hoc组管理和特定主机变更 3.2节为大家介绍了Ansible模块列表及HELP说明获取方式.日常运维工作中,我们往往会将负责相同场景应用的主机划分为一个组,以方便统一管理.Ansible也提供了简洁但强大的组管理功能.同时,我们也可能遇到只针对这组主机中一台或某些主机做变更的场景,针对这些复杂多变的企业场景,本节我们将深入了解Ad-Hoc组管理和特定主机变更,进一步了解Ansible如何应对复杂多变的企业环境. 3.3.1 Ad-Hoc组定义 Ad-Hoc的组功能定义在Inven

《Ansible权威指南》一3.3 Ad-Hoc组管理和特定主机变更

3.3 Ad-Hoc组管理和特定主机变更 3.2节为大家介绍了Ansible模块列表及HELP说明获取方式.日常运维工作中,我们往往会将负责相同场景应用的主机划分为一个组,以方便统一管理.Ansible也提供了简洁但强大的组管理功能.同时,我们也可能遇到只针对这组主机中一台或某些主机做变更的场景,针对这些复杂多变的企业场景,本节我们将深入了解Ad-Hoc组管理和特定主机变更,进一步了解Ansible如何应对复杂多变的企业环境. 3.3.1 Ad-Hoc组定义 Ad-Hoc的组功能定义在Inven

《Ansible权威指南》一1.1 Ansible是什么

1.1 Ansible是什么 随着移动互联.物联网.互联网+.大数据.云计算等大规模应用的催生推动,以及人们日常生活的互联网化,互联网的蓬勃发展不仅冲击影响着整个经济体,更对人们的生活理念影响深远.在体验到互联网带来的便利和舒适的同时,人们也不再满足于"可以用",而是要"用得爽",在政策.需求.利益.趋势等原因的刺激下,互联网的发展速度可想而知.众所周知,智能的背后意味着复杂,这一现象在互联网的发展中体现得淋漓尽致.在互联网迅猛发展的同时,运维这个工种也从默默无闻的

《Ansible权威指南》一1.5 Ansible通信发展史

1.5 Ansible通信发展史 Ansible主推的卖点是其无需任何Daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的SSH安全连接.同时因为SSH是每台Linux主机系统必装的软件,所以Ansible无需在远程主机端安装任何额外进程,即可实现Agentless(无客户端),进而助力其实现去中心化的思想.尽管稳定.快速.安全的SSH连接是Ansible通信能力的核心,但SSH的连接效率一直被诟病,所以Ansible的通信方式和效率在过去的数年中也在不停地改变和提

《Ansible权威指南》一1.4 Ansible是如何工作的

1.4 Ansible是如何工作的 Ansible没有客户端,因此底层通信依赖于系统软件,Linux系统下基于OpenSSH通信,Windows系统下基于PowerShell,管理端必须是Linux系统,使用者认证通过后在管理节点通过Ansible工具调用各应用模块将指令推送至被管理端执行,并在执行完毕后自动删除产生的临时文件.Ansible具体的工作机制官方有专栏介绍httpswww.ansible.comhow-ansible-works,但整体稍过简略.我们参考从官网视频中的截图来详细了解

《Ansible权威指南》一1.7 Ansible的安装部署

1.7 Ansible的安装部署 了解完Ansible是什么.通信原理及发展史.Ansible发展历程及其应用场景后,接下来为大家介绍Ansible的安装部署. Ansible的安装部署非常简单,其仅依赖于Python和SSH,而系统默认均已安装.除Windows外,RedHat.Debian.CentOS.OSX均可作为管理节点部署Ansible.Ansible被RedHat红帽官方收购后,其安装源被收录在EPEL中,如已安装EPEL可直接YUM或APT安装,通过pip和easy_instal