ansible的Ad-Hoc
# ansible的Ad-Hoc
Ad-Hoc,简而言之是“临时命令”,英文中作为形容词有“特别的,临时”的含义。
# 1. Ad-Hoc命令集用法
命令使用方式如下:
ansible <host-pattern> [options]
1
可用选项如下:
选项 | 描述 |
---|---|
-v,--verbose | 输出更详细的执行过程信息,-vvv可得到执行过程所有信息。 |
-i PATH,--inventory=PATH | 指定inventory信息,默认/etc/ansible/hosts。 |
-f NUM,--forks=NUM | 并发线程数,默认5个线程。 |
--private-key=PRIVATE_KEY_FILE | 指定密钥文件。 |
-m NAME,--module-name=NAME | 指定执行使用的模块。 |
-M MODULE_PATH, --module-path MODULE_PATH | 指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。 |
-a'ARGUMENTS',--args='ARGUMENTS' | 模块参数。 |
-k,--ask-pass SSH | 认证密码。 |
-K,--ask-sudo-pass sudo | 用户的密码(--sudo时使用)。 |
-o,--one-line | 标准输出至一行。 |
-b, --become | 相当于Linux系统下的sudo命令。 |
-t DIRECTORY,--tree=DIRECTORY | 输出信息至DIRECTORY目录下,结果文件以远程主机名命名。 |
-T SECONDS,--timeout=SECONDS | 指定连接远程主机的最大超时,单位是秒。 |
-B NUM,--background=NUM | 后台执行命令,超NUM秒后中止正在执行的任务。 |
-P NUM,--poll=NUM | 定期返回后台任务进度。 |
-u USERNAME,--user=USERNAME | 指定远程主机以USERNAME运行命令。 |
-U SUDO_USERNAME,--sudo-user=SUDO_USERNAME | 使用sudo,相当于Linux下的sudo命令。 |
-c CONNECTION,--connection=CONNECTION | 指定连接方式,可用选项paramiko(SSH)、ssh、local,local方式常用于crontab和kickstarts。 |
-l SUBSET,--limit=SUBSET | 指定运行主机。 |
-l~REGEX,--limit=~REGEX | 指定运行主机(正则)。 |
--list-hosts | 列出符合条件的主机列表,不执行任何命令。 |
具体示例如下:
# 批量查看apps组所有主机的磁盘容量(使用command模块)
ansible apps -a "df -lh"
# 安装nginx
ansible apps -m yum -a "state=present name=nginx"
# 启动nginx服务,并设置为开机启动
ansible apps -m service -a "name=nginx state=started enabled=yes"
1
2
3
4
5
6
2
3
4
5
6
# 1.1. Ad-Hoc特定主机变更
Ansible有多种方式实现针对特定主机做变更。
- --limit:通过--limit参数限定主机做变更。
- 指定IP:通过指定具体IP限定主机做变更。
- 用“:”作分隔符,指定多台机器做变更。
- 通过“*”泛匹配,更灵活地针对多台主机做变更。
具体示例如下:
# 在App组中启动192.168.37.15的nginx服务
ansible app -m command -a "systemctl start nginx" --limit "192.168.37.158"
# 查看192.168.37.158的nginx服务状态
ansible 192.168.37.158 -m command -a "systemctl status nginx"
# 查看192.168.37.158,192.168.37.161的nginx服务状态
ansible "192.168.37.158:192.168.37.161" -m command -a "systemctl status nginx"
# 启动192.168.37.*所有主机的nginx服务
ansible 192.168.37.* -m command -a "systemctl start nginx"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2. Ad-Hoc用户管理与组管理
用户权限管理是运维日常最重要的管理工作之一,所以掌握Ad-Hoc用户与组管理很有用。
Ansible系统用户模块有如下两个:
- Linux系统用户管理:user
- Windows系统用户管理:win_user
# 2.1. Linux用户管理
参数 | 必填项 | 默认值 | 选项 | 注释 |
---|---|---|---|---|
append | no | no | yes no | yes:用户添加到group中 no:只设置groups指定的group组,并移除其他用户组 |
comment | no | 可选设置用户账户的描述(又名GECOS) | ||
createhome | no | yes | yes no | 默认yes,当创建用户时或家目录不存在时为用户创建HOME目录 |
expires | no | 无 | 用户过期时间,不支持的平台该参数将被忽略,现在支持 Linux 和 FreeBSD | |
force | no | no | yes no | 强制,当和state=absent结合使用时,效果等同于userdel --force |
generate_ssh key | no | no | yes no | 是否生成SSHkey,不会覆盖已有的SSHkey |
group | no | (可选)设置用户属组 | ||
groups | no | 设置用户附加群组,使用逗号分隔多个群组,如果参数为空(即’groups=‘),则删除用户所有附加组(属组不受影响) | ||
home | no | (可选)设置用户家日录 | ||
login_class | no | (可选)设置FreeBSD、OpenBSD、NetBSD系统的用户登录class | ||
move_home | no | no | yes no | 如设置为yes,结合使用home=,临时迁移用户家目录到特定目录 |
non_unique | no | no | yes no | (可选)和结合使用,允许改变用户ID为非唯一值 |
name | yes | 用户名 | ||
password | no | (可选)设置用户密码为该项指定的密码(加密后的密码)详细请参考https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module | ||
remove | no | no | yes no | 结合state=absent使用相当于userdel --remove |
seuser | no | (可选)设置seuser类型启用SELinux | ||
shell | no | (可选)设置用户shell | ||
skeleton | no | 设置用户的skeleton目录,需和create_home参数结合使用 | ||
ssh_key_bits | no | 2048 | (可选)指定生成的 SSH key 加密位数 | |
ssh_key_comment | no | (可选)定义 SSH key 注释 | ||
ssh_key_file | no | .ssh/id_rsa | (可选)指定 SSH key 文件名,如果该文件名是相对路径,则默认路径为用户家目录 | |
ssh_key_passphrase | no | 设置 SSH key 密码,如果没有提供密码,则默认没有加密 | ||
ssh_key_type | no | rsa | (可选)指定 SSH key 类型,具体可用的 SSH key 类型取决于目标主机 | |
state | no | present | absent present | absent:删除用户 present:新建用户 |
system | no | no | yes no | 当创建新账户时,该选项为yes,为用户设置系统账户,该设置对已经存在的用户无效 |
uid | no | (可选)设置用户 UID | ||
update_password | no | always | always on_create | always:总是更改密码 on_create:只为新用户设置密码 |
# 2.1.1. 新增用户
新增用户dba,使用 BASH Shell,附加组为admins,dbagroup,家目录为/home/dba
。
ansible db -m user -a "name=dba shell=/bin/bash groups=admins,dbagroup append=yes home=/home/dba/ state=present"
1
# 2.1.2. 修改用户属组
修改dba附加组为dbagroup(只保留dbagroup,其他所组删除)
ansible db -m user -a "name=dba groups=dbagroup append=no"
1
# 2.1.3. 修改用户属性
设置用户登录过期时间为:2023/12/31 00:00:00
时间采用UNIX时间戳进行设置,具体转换:date -d '2023/12/31 00:00:00' +%s
ansible db -m user -a "name=dba expires=1703952000"
1
# 2.1.4. 删除用户
删除用户DBA,并删除其家目录和邮件列表。
ansible db -m user -a "name=dba state=absent remove=yes"
1
# 2.1.5. 变更用户密码
设置系统用户dba的密码为dba123
参考:How do I generate encrypted passwords for the user module? (opens new window)
# 生成加密密码
ansible all -i localhost, -m debug -a "msg={{ 'dba123' | password_hash('sha512', 'mysecretsalt') }}"
# 修改用户密码,$需要转义成\$,然后就可以正常设置和登录了。
ansible db -m user -a "name=dba shell=/bin/bash password=\$6\$mysecretsalt\$ISUzrEeBTw8zYoGLJaIbATE6hHVkJH1XvIcFEZaqeV/aSITna5eWn3/HKiVLPc1HjXj6aE5WTe/uxLGbD5cbG/ update_password=always"
1
2
3
4
2
3
4
# 2.2. Windows用户管理
暂时跳过。
# 2.3. 应用层用户管理
以MySQL用户管理为例。
新增MySQL用户stanley,设置登录密码为magedu@bj,对zabbix.*表有ALL权限。
# pip需要安装 pymysql
pip3 install pymysql
ansible db -m mysql_user -a 'login_user=root login_password=123456 name=stanley password=magedu@bj priv=zabbix.*:ALL state=present'
1
2
3
2
3
上次更新: 2024/05/11, 03:55:33