文章目录
批量管理工具选型
| 工具 | 说明 | 缺点 |
|---|---|---|
| xshell | 不适应机器过多场景,需要连接后才能用 | |
| for+ssh/scp+密钥认证 | 密钥认证,免密码登录 scp传输文件/脚本 ssh远程执行命令或脚本 | 串行 |
| saltstack | 需要安装客户端 | |
| ansible | 无客户端(密钥认证) 批量部署环境 | python版本不要太旧 红帽的 |
| Terraform | 关注基础设施(云环境),一键创建100台云服务器,一键创建负载均衡,数据库产品 |
Ansbile特性
-
模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
-
Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
-
基于Python语言实现
-
部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)安全,基于OpenSSH
-
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
-
支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
-
较强大的多层解决方案 role
Ansible架构
- 先配置好密钥认证
- 主机清单:通过主机清单(inventory)连接管理被控端
- ansible-hoc:就是命令执行模块
- playbook:使用playbook剧本(核心)

| 环境准备 | 主机名 | ip |
|---|---|---|
| Ansible管理端 | m01(核心数根据被控端的多少来定) | 10.0.0.111/172.16.1.111 |
| 被管理端:其他所有机器 | web01、web02、db01、nfs01、backup | - |
安装
python安装(pip)
shell
#0.安装 Python3 版本的pip工具
yum install -y python3-pip
#1.将已安装的pip升级到最新版本
python3 -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip
#2.配置 pip 源(永久加速)
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
#3.安装ansible
pip3 install ansible
ansible --version
#4.配置ansible(pip安装默认不会创建主配置文件,需要自己设置)
mkdir -p /etc/ansible/
cat >/etc/ansible/ansible.cfg<<'EOF'
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
EOF
yum安装
shell
#红帽系列安装
yum install -y epel-release
yum install -y ansible
测试是否能连接远程
连接Linux
分发密钥可以写成脚本
shell
#1.分发密钥
ssh-copy-id root@远程ip
#2.配置主机清单
cat > /etc/ansible/hosts <<EOF
[test]
10.0.0.103
EOF
#3.测试是否能连到远程主机,(回复pong即表示能连接)
ansible all -m ping
连接Windows
windows模块官方文档:windows模块官方文档
shell
#1.管理机安装winrm模块
yum install python-winrm #如果ansible是python3安装 python3-winrm
#或者
pip install pywinrm #如果ansible是python3安装 pip3 install pywinrm
#2.windows需要在cmd中输入
Enable-PSRemoting -Force
#3.配置主机清单
cat > /etc/ansible/hosts <<EOF
[win_servers]
IP ansible_user=账号 ansible_password=windows密码
[win_servers:vars]
ansible_connection="winrm"
ansible_port=5985
#5985 http
#5986 https
ansible_winrm_transport="ntlm"
ansible_winrm_server_cert_validation=ignore
EOF
#4.测试是否能连到远程主机,(回复pong即表示能连接)
ansible win_servers -m win_ping
命令行工具
ansible
| 选项 | 说明 |
|---|---|
| -m | 指定模块 |
| -a | 指定模块的参数 |
| -i | 指定清单主机路径或逗号分隔的主机列表。 |
| -k | 询问连接密码 |
| -f | 指定要使用的并行进程数(默认值=5) |
| -C,--check | 不要进行任何更改,测试命令 |
ansible-doc
ansible-doc命令用于查看Ansible模块的文档,可以了解模块的参数、用法和示例等信息。
| 选项 | 说明 |
|---|---|
| -l | 列出可用的模块 |
| -s | 模块可以使用的参数 |
ansible-config
ansible-config命令用于查看和修改Ansible的配置文件,即ansible.cfg。它提供了一种检查和修改Ansible配置选项的方便方式
| 选项 | 说明 |
|---|---|
| list | 列出并输出可用配置 |
| view | 显示当前配置文件 |
| init | 创建初始配置 |
| dump | 显示当前设置,如果指定,合并 ansible.cfg |
ansible-galaxy
ansible-galaxy命令是Ansible的一个用于管理和分享Ansible角色的工具。它提供了一组命令,用于搜索、安装、创建、删除和发布Ansible角色。
| 集合操作 | 说明 |
|---|---|
| collection install | 安装一个或多个集合 |
| collection list | 列出已安装的集合或角色 |
| collection verify | 将校验和与服务器上找到的集合和已安装的副本进行比较 |
| collection publish | 将集合发布到 Ansible Galaxy,需要发布集合 tarball 的路径 |
| collection build | 构建一个 Ansible Galaxy 集合项目,该项目可以存储在 Ansible Galaxy 等中央存储库中 |
| collection init | 创建符合 Galaxy 元数据格式的角色或集合的骨架框架。需要角色或集合名称。 |
| collection download | 将集合及其依赖项下载为离线安装的压缩包 |
| 角色(role)操作 | 说明 |
|---|---|
| role init | 创建符合 Galaxy 元数据格式的角色或集合的骨架框架 |
| role remove | 从本地系统中删除作为参数传递的角色列表 |
| role delete | 从 Ansible Galaxy 中删除角色 |
| role list | 列出已安装的集合或角色 |
| role search | 在 Ansible Galaxy 服务器上搜索角色 |
| role import | 用于将角色导入 Ansible Galaxy |
| role setup | 从 Github 或 Travis 为 Ansible Galaxy 角色设置集成 |
| role info | 打印有关已安装角色的详细信息以及 Galaxy API 中可用的信息 |
| role install | 安装一个或多个角色 |
ansible-console
REPL 控制台,用于执行 Ansible 任务
| 交互命令 | 说明 |
|---|---|
| cd [pattern] | 更改主机/组 |
| list | 列出当前路径中的可用主机 |
| list groups | 当前路径中包含的列表组 |
| help | 显示命令或模块的文档 |
| exit | 退出ansible-console |
| ! | 强制 shell 模块而不是 ansible 模块 (!yum update -y) |
| forks | 并发数,同时执行多少台 |
| become_user | 提权后执行任务的用户 |
| remote_user | SSH 初始登录用户 |
ansible-pull
从 VCS 存储库中提取 playbook 并为本地主机执行它们
| 选项 | 说明 |
|---|---|
| --check | 不要进行任何更改 |
| --full | 做一个完整的克隆,而不是一个浅层的克隆 |
ansible-vault
Ansible 数据文件的加密/解密实用程序
| 选项操作 | 通俗说明 |
|---|---|
| create | 新建文件,在编辑器里写完后,自动用密钥加密保存 |
| decrypt | 用密钥解密已加密的文件(解密后得到原明文文件) |
| edit | 编辑已加密的文件(自动先解密打开,编辑完保存时自动重新加密) |
| view | 查看已加密的文件内容(临时解密显示,不修改原文件,看完后仍保持加密状态) |
| encrypt | 用密钥加密指定的明文文件(加密后生成加密文件,原明文文件可保留或删除) |
| encrypt_string | 用密钥加密一段字符串(直接输入字符串,返回加密后的结果,方便在配置中引用) |
| rekey | 给已加密的文件换密钥(需要先用原密钥解密,再用新密钥重新加密) |
shell
#1.加密/etc/ansible/hosts文件
ansible-vault encrypt /etc/ansible/hosts
##此时打开此文件是非人类可读状态
#2.解密/etc/ansible/hosts文件
ansible-vault decrypt /etc/ansible/hosts
ansible-inventory
显示 Ansible 清单信息,默认情况下它使用清单脚本 JSON 格式
| 选项 | 说明 |
|---|---|
| --list | 输出所有主机信息 |
| --graph | 以树形结构可视化展示 inventory 中主机、组及组之间的层级关系 |
| -i | 指定清单主机路径或逗号分隔的主机列表 |
ansible-playbook
运行 Ansible playbook,在目标主机上执行定义的任务
| 选项 | 说明 |
|---|---|
| --become-user <BECOME_USER> | 以此用户身份运行作(默认=root) |
| --list-hosts | 输出匹配主机的列表;不执行任何其他作 |
| --list-tasks | 列出将要执行的所有任务和TAGS |
| --step | 一步一步:在运行前确认每个任务 |
| --syntax-check | 对 playbook 执行语法检查,但不执行它 |
| -C | 不要进行任何更改 |
| -f | 指定要使用的并行进程数(默认值 = 5) |
| -k | 询问连接密码 |
| -u | 以此用户身份连接(默认=无) |
| -v -vv -vvv | 显示过程 |
| --start-at-task START_AT_TASK | 从指定task开始执行,而非从头开始,START_AT_TASK为任务的 |
| -t | 仅运行使用这些值标记的播放和任务 |
| --skip-tags | 仅运行标记与这些值不匹配的播放和任务 |
Ansible相关文件
Ansible主配置文件
Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
shell
ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件
Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
shell
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command #默认模块,可以修改为shell模块
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
gathering=explicit
retry_files_enabled = True
retry_files_save_path = /ansible_retry/
#开启facts并设置redis缓存
#gathering = implicit
#fact_caching = redis
#fact_caching_connection = 172.16.1.51:6379,密码
[inventory]
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
范例:当前目录下的ansible配置文件优先生效
shell
[root@m01 ~]# ansible --version
ansible [core 2.11.12]
config file = /etc/ansible/ansible.cfg #注意该路径
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/local/bin/ansible
python version = 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC 7.3.0]
jinja version = 3.1.6
libyaml = True
主机清单
主机清单官方文档:主机清单官方文档
Ansible 主机清单(Inventory)是指 Ansible 用于管理和执行任务的主机列表。主机清单可以是一个文本文件,也可以是一个脚本或程序。在主机清单中,每个主机都有一个唯一的名称和一个或多个变量,用于指定主机的连接参数、主机组、主机状态等信息。
Inventory的配置文件,想要修改的话要自动生成ansible.cfg配置文件才能修改,根据ansible.cfg优先级读取配置文件
shell
/etc/ansible/hosts
在配置文件中修改 Inventory 文件的位置,如果你要修改到 /opt/ansible/hosts的话
shell
inventory = /opt/ansible/hosts
利用参数-i传递主机清单配置文件
shell
ansible-playbook -i /opt/ansible/hosts xxx.yaml
主机清单参数说明
shell
ansible_host 指定主机的 IP 地址或主机名
ansible_port 指定 SSH 连接的端口号
ansible_user 指定 SSH 连接时使用的用户名
ansible_connection 指定连接方法,常见的有 ssh
ansible_ssh_pass 指定 SSH 连接时使用的密码
ansible_password 用于向主机进行身份验证的密码
远程主机分组
给远程主机分组,以便于在Playbook中使用
下面的文件中,展示了主机清单文件中最简单的分组方法,[ ]内是组名
shell
cat > /etc/ansible/hosts <<EOF
[nfs01]
10.0.0.102
[by01]
10.0.0.110
[web01]
10.0.0.103
[web02]
10.0.0.104
[web03]
10.0.0.108
[web04]
10.0.0.109
EOF
分组也可以支持嵌套
shell
[nfs01]
10.0.0.102
[by01]
10.0.0.110
[web]
10.0.0.10[3:4]
10.0.0.10[8:9]
设置连接参数
ansible可以在Inventory文件中指定主机的连接参数,包括连接方法、用户等。在Inventory中设置连接的参数如下,用空格分隔多个参数
例如:100台机器,100个密码不同如何搞?
shell
[web]
10.0.0.103 ansible_user=root ansible_port=22 ansible_password=Abc@1234
常用模块(在命令行使用)
debug
Ansible的debug模块用在命令中输出调试信息。它可以打印任何文本消息或变量的值
| 选项参数 | 选项解释 |
|---|---|
| msg | 参数用于输出文本消息。 |
| var | 参数用于输出变量的值。 |
shell
#打印hello ansible
ansible all -m debug -a "msg=hello,ansible"
#打印变量
ansible all -m debug -a "var=name" -e "name=csq"
文件目录相关
file
用途:管理远程节点的文件 / 目录(创建、删除、权限、软链接等)
| 选项参数 | 选项解释 |
|---|---|
| path | 指定要操作的文件路径,可以是绝对路径或相对路径。 |
| state | 控制文件的状态,可选值包括[file、directory、hard、link、absent、touch],其中 file:(如果文件不存在不创建)确保路径指向一个普通文件,文件元数据和内容都可以设置。 directory:确保路径指向一个目录,权限和所有权都可以设置。 hard:确保硬链接的存在,可以指定原始文件和目标目录 link:确保符号链接存在,可以指定链接到的目标。 absent:确保路径不存在,被删除或无实际变化的文件不会报错。 touch:确保文件存在,如果不存在则创建之,如果存在则仅更改文件的时间戳。 |
| owner | 指定文件所有者的用户名或用户ID。 |
| group | 指定文件所属组的组名或组ID。 |
| mode | 指定文件或目录的权限,可以使用数字形式或符号形式表示。 |
| src | 用于创建符号链接或硬链接时指定原始文件的路径。 |
| recurse | 递归地设置目录内容上指定的文件属性。 默认为false |
shell
#创建目录/app/ansible
ansible all -m file -a "path=/app state=directory"
#创建文件/app/ansible/csq.txt
ansible all -m file -a "path=/app state=touch"
#删除/app/amsible(及其危险)
ansible all -m file -a "path=/app/ansible state=absent"
#创建文件或目录时同时修改权限,所有者,用户组等内容
ansible all -m file -a "path=/csq/upload/ mode=0700 owner=nobody group=nobody state=directory"
#创建软链接源文件/etc/hosts,目标/app/hosts
ansible all -m file -a "src=/etc/hosts path=/app/hosts state=link"
#递归修改权限
ansible all -m file -a "path=/app owner=nobody group=nobody recurse=true state=directory"
lineinfile
Ansible 中用于 处理文件中单行内容 的核心模块,主要用于在指定文件中查找、修改、添加或删除特定行,尤其适合修改配置文件中的单行配置项
| 选项 | 说明 |
|---|---|
| path | 指定目标文件的路径 |
| regexp | 用于匹配目标行的正则表达式 若匹配到行,会用 line 参数替换;若未匹配到,默认会追加添加 line |
| line | 要写入文件的内容(替换匹配到的行,或在未匹配时添加的行)。 |
| state | 控制行的状态:present(默认,确保行存在)、absent(删除匹配 regexp 的行)。 |
| backrefs | regexp 匹配到行时才用 line 替换;若未匹配,不做任何操作(避免误添加) 默认为false |
| insertafter | 当 regexp 未匹配到行时,指定将 line 添加到哪个行之后 EOF(默认,文件末尾)、BOF(文件开头) 或某行的正则(如 insertafter: '^server {' 表示添加到 server { 行之后) |
| insertbefore | 与 insertafter 类似,指定将 line 添加到哪个行之前 |
| backup | 修改文件前会创建备份,默认为false |
| validate | 修改文件后执行的验证命令(如校验配置文件语法),若命令失败则撤销修改 validate: 'nginx -t %s'(%s会自动替换目标文件路径) |
| create | 如果指定,则如果文件不存在,则会创建该文件 |
| mode | 生成的 filesystem 对象应具有的权限 |
copy
模块将文件或目录结构从本地或远程计算机复制到远程计算机上的位置。
| 选项参数 | 选项解释 |
|---|---|
| src | 源文件路径(本地文件路径) |
| dest | 目标文件路径 |
| group | 指定目标文件的属组 |
| owner | 指定目标文件的属主 |
| mode | 指定目标文件的权限(可以是数字也可以是字符) |
| backup | 是否备份目标文件,默认为false |
| content | 要写入目标文件的内容,可以是字符串或者文件内容 |
| remote_src | 告诉 Ansible "源文件在远程主机上",默认为false |
shell
#将本地主机/root/test1.sh 复制到/tmp/test2.sh,并设置属主为root属组为nobody,设置源文件备份
ansible web01 -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=root group=nobody backup=true"
#将远程主机的/root/test1.sh 复制到/tmp/test2.sh,并设置属主为root属组为root,设置源文件备份
ansible web01 -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=root group=nobody backup=true remote_src=true"
#将/tmp/test2.sh内容改为hostname(此操作是覆盖文件内容)
ansible web01 -m copy -a "dest=/tmp/test2.sh content=hostname"
unarchive
用于将压缩包(如 .tar、.tar.gz、.zip 等)解压到远程主机的指定目录,支持从本地控制机或远程主机获取源文件传到远程主机指定目录
| 选项 | 说明 |
|---|---|
| src | 归档文件的路径。 |
| dest | 解压到的远程主机目标目录(必须已存在,否则需先用 file 模块创建) |
| remote_src | 定义 src 是否为远程主机的路径。默认为本地路径 |
| mode | 解压后文件 / 目录的权限(如 0644、0755) |
| owner | 解压后文件 / 目录的所有者(用户名或 UID) |
| group | 解压后文件 / 目录的所属组(组名或 GID) |
| validate_checksum | 是否校验源文件的校验和(确保文件未被篡改) |
| extra_opts | 传递给解压工具(如 tar、unzip)的额外参数(字符串或列表) |
| creates | 若远程主机上存在该路径,则跳过解压操作 |
| list_files | 仅列出归档文件中的内容,不实际解压(返回 files 列表)。 |
| exclude | 解压时排除的文件 / 目录(仅对 tar 有效,需配合 extra_opts 使用)。 |
shell
#将本地路径的指定压缩包解压到远程主机某个目录下
ansible web -m unarchive -a "src=bird.tar.gz dest=/app/" -i /etc/ansible/hosts
get_url
从指定的 URL,下载文件,保存到被控节点的目标路径,并可配置权限、校验文件完整性、处理认证等
| 选项 | 说明 |
|---|---|
| url | 要下载的文件的 URL |
| dest | 文件在被控节点的保存路径 若为目录,需以 / 结尾,文件会保持原文件名; 若为文件路径,会直接保存为指定文件名)。 |
| mode | 下载后文件的权限(如 0644、0755),仅对文件有效 |
| checksum | 校验文件完整性,格式为 算法:校验值(如 sha256:abc123...)。 下载后会验证文件哈希,不匹配则失败。 |
| force | 是否强制重新下载,默认为false |
shell
#从远程主机上下载tomcat包,下载到/opt目录下
ansible web -m get_url -a "url=https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.112/bin/apache-tomcat-9.0.112.tar.gz dest=/opt/tomcat9.tar.gz"
命令相关
command
用途:在远程节点执行命令
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
注意:此模块不具有幂等性
shell
#查看远程主机组的主机名
[root@m01 ~]# ansible all -m command -a "hostname"
10.0.0.110 | CHANGED | rc=0 >>
by01
10.0.0.102 | CHANGED | rc=0 >>
nfs01
10.0.0.103 | CHANGED | rc=0 >>
web01
10.0.0.104 | CHANGED | rc=0 >>
web02
10.0.0.108 | CHANGED | rc=0 >>
web03
10.0.0.109 | CHANGED | rc=0 >>
web04
#在tmp下面创建test.txt(如果不指定模块默认就是command模块)
ansible all -a "touch /tmp/test.txt"
shell
用途:在远程节点通过 shell
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
shell
#统计nginx日志行数(使用管道)
ansible web -m shell -a "cat /var/log/nginx/access.log | wc -l"
#在/tmp下批量创建文件
ansible all -m shell -a "touch /tmp/{1..10}.txt"
脚本相关
script
用途:将本地脚本传输到远程节点并执行(远程节点需有脚本解释器,如 bash、python)
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
shell
#在远程主机执行test.sh脚本
ansible all -m script -a "/data/test.sh"
安装软件包相关
yum
用途:管理 RPM 系系统(CentOS、RHEL、Fedora 等)的软件包
| 选项参数 | 选项解释 |
|---|---|
| name | 要操作的RPM包的名称,可以是单个包的名称或者一个包的列表。 |
| state | 要执行的操作类型,可以是present(安装或更新)、absent(卸载)或latest(安装最新版本)。 |
| enablerepo | 要启用的仓库的名称或ID |
| disablerepo | 要禁用的仓库的名称或ID |
shell
#远程主机安装nginx
ansible all -m yum -a "name=nginx state=present"
yum_repository
| 选项 | 说明 |
|---|---|
| name | 仓库的唯一标识(ID),对应配置文件中的 [name] 小节名 |
| baseurl | 仓库的基础 URL 地址(支持 HTTP/HTTPS/FTP/file 协议),多个 URL 用空格分隔 |
| enabled | 是否启用该仓库 |
| gpgcheck | 是否检查包的 GPG 签名 |
| gpgkey | GPG 公钥的 URL 或本地路径 |
| file | 仓库配置文件的名称(保存路径为 /etc/yum.repos.d/<file>.repo |
| state | 仓库的状态(present 创建 / 更新仓库,absent 删除仓库) |
apt
为 Debian/Ubuntu 系列操作系统 (使用 apt 包管理器)设计的软件包管理模块,用于实现软件包的安装、卸载、更新、升级等操作,支持幂等性(重复执行无副作用)
| 选项 | 说明 |
|---|---|
| name | |
| state | 软件包的目标状态: present(默认):确保包安装(不升级已安装的包) absent:确保包卸载 latest:确保包安装且升级到最新版本 fixed:修复依赖问题(类似 apt --fix-broken) |
| update_cache | 是否更新软件包缓存(等效于 apt update)默认是不更新缓存 |
apt_key
| 选项 | 说明 |
|---|---|
| url | 从中检索密钥的 URL(默认将密钥保存在/etc/apt/trusted.gpg.d/) |
| keyring | 密钥文件的存储路径,默认是在 |
| state | 确保密钥存在(已添加)或不存在(已吊销),默认present |
apt_repository
| 选项 | 说明 |
|---|---|
| filename | 设置 sources.list.d 中源列表文件的名称。默认为基于仓库源 URL 的文件名。 比如:/etc/apt/sources.list.d/nginx.list 写filename: nginx即可 |
| repo | 仓库的源字符串,需用引号引起来 |
| update_cache | 更改后运行缓存更新 |
| state | 源字符串状态"absent" "present" |
用户相关
user
用途:管理远程节点的系统用户(创建、删除、修改属性等)
| 选项参数 | 选项解释 |
|---|---|
| append | 如果是yes,将用户添加到指定组中 |
| name | 指定用户名,必需参数。 |
| comment | 用户的注释。 |
| uid | 用户ID。 |
| group | 用户所属组。 |
| groups | 用户所属的附加组。 |
| home | 用户的主目录路径。 |
| shell | 用户的默认shell程序路径。 |
| password | 用户的密码(加密后的) |
| generate_ssh_key | 如果设置为true,Ansible会为用户生成SSH密钥。 |
| ssh_key_bits | 生成SSH密钥时,指定密钥位数。 |
| remove | 如果设置为yes,则删除用户 |
| force | 是否强制删除用户,默认为false |
| move_home | 是否移动用户的主目录 |
| state | 用户的状态,可以是present(创建)、absent(删除)或locked(锁定)。 |
| system | 创建账号时,将其设置为true会将用户设置为系统帐户 |
shell
#创建csq用户,uid 9999 gid 9999 创建家目录 添加用户注释为usertest 设置用户的命令解释器为/bin/bash
#设置用户的密码为Abc@1234csq
#先创建指定用户组
ansible web01 -m group -a "name=csq gid=9999"
#再创建用户
ansible web01 -m user -a "name=csq group=csq uid=9999 home=/home/csq shell=/bin/bash password={{ 'Abc@1234csq' | password_hash('sha512','ashjkdjkb') }} state=present"
group
用途:管理远程节点的用户组(创建、删除、修改 GID 等)
| 参数 | 说明 |
|---|---|
| name | 组名(必填,唯一标识)。 |
| state | 状态:present(创建 / 保留组,默认)、absent(删除组)。 |
| gid | 组 GID(需唯一,如 2001)。 |
| system | 是否为系统组(yes/no,系统组 GID 通常小于 1000)。 |
shell
#创建指定gid的用户组
ansible web01 -m group -a "name=csq gid=9999"
hostname
用于 管理远程主机的主机名 的专用模块
| 选项 | 说明 |
|---|---|
| name | 主机名 |
| use | 使用哪种策略来更新主机名 对于 RHEL/EL/CentOS 7+,应指定"systemd"。较旧的发行版应使用"redhat" |
服务相关
systemd
用途:管理 systemd 服务(启动、停止、设置开机自启等,仅支持 systemd 系统)
| 参数 | 说明 |
|---|---|
| name | 服务名(必填,如 nginx、sshd,需与 systemd unit 文件名一致)。 |
| state | 服务状态:- started:启动服务;- stopped:停止服务;- restarted:重启服务;- reloaded:重载配置(不中断服务)。 |
| enabled | 是否开机自启:yes(启用)、no(禁用)。 |
| daemon_reload | 若服务 unit 文件更新(如新增 / 修改配置),需重载 systemd 守护进程(yes/no,默认 no)。 |
| masked | 是否屏蔽服务(禁止启动,比禁用更严格,yes/no,masked=yes后无法启动,需 masked=no 解除)。 |
shell
#设置远程主机nginx服务开机自启并开启
ansible all -m systemd -a "name=nginx state=started enabled=true"
定时任务
cron
| 选项 | 说明 |
|---|---|
| name | 任务的唯一标识(必填),用于区分不同 cron 任务,修改 / 删除时依赖此名称 |
| state | 任务状态:present(创建 / 更新,默认)、absent(删除)。 |
| user | 指定 cron 任务所属的用户(默认当前执行用户) |
| job | 要执行的命令或脚本(创建任务时必填)。 |
| minute | 分钟(0-59,*表示所有,*/n 表示每隔 n 分钟)。 |
| hour | 小时(0-23)。 |
| day | 日(1-31) |
| month | 月(1-12 ) |
| weekday | 周(0-6 ,0 为周日) |
| special_time | 特殊时间(覆盖分时日月周参数), 可选值:reboot(重启时)、 yearly(每年)、 <br />monthly(每月)、 weekly(每周)、 daily(每天)、 hourly(每小时) |
| disabled | 是否禁用任务(yes/no,默认no),禁用后任务前会加#注释。 |
mysql相关
mysql创建库
| 参数 | 说明 |
|---|---|
| login_user | 用于登录 MySQL 的用户名(需具备操作数据库的权限,如 root 或其他管理员用户)。 |
| login_password | 登录用户对应的密码,用于 MySQL 身份认证(若用户无密码可省略)。 |
| login_host | MySQL 服务器的主机地址(默认值为localhost,远程连接时需指定 IP 或域名)。 |
| login_port | MySQL 服务监听的端口号(默认值为3306,若修改过默认端口需手动指定)。 |
| charset | 数据库的字符集(如utf8mb4),用于指定数据库存储数据时的字符编码规则。 |
| state | 数据库的目标状态:present(确保存在,不存在则创建)、absent(确保不存在,存在则删除)import(导入数据库操作) |
| name | 要操作的数据库名称(唯一标识,如app_db,是创建 / 删除数据库的核心参数)。 |
| target | 远程主机上的SQL脚本路径 |
mysql创建用户
| 参数 | 说明 |
|---|---|
| login_user | 用于登录 MySQL 的管理员用户名(需具备用户管理权限,如 root),用于执行创建 / 修改 / 删除用户的操作。 |
| login_password | 登录 MySQL 的管理员对应的密码,用于身份认证(若管理员无密码可省略)。 |
| login_host | MySQL 服务器的主机地址(默认localhost,远程连接时需指定 IP 或域名)。 |
| login_port | MySQL 服务监听的端口号(默认3306,若修改过默认端口需手动指定)。 |
| state | 目标用户的状态:present(确保用户存在,不存在则创建;存在则更新密码 / 权限)、absent(确保用户不存在,存在则删除)。 |
| name | 要操作的目标用户名(如xzs),是创建 / 修改 / 删除用户的核心标识。 |
| password | 目标用户(name指定的用户)的登录密码,用于设置或更新该用户的认证密码。 |
| priv | 授予目标用户的权限,格式为 "数据库.表: 权限 1, 权限 2,..."(如app_db.*:SELECT,INSERT表示对app_db库所有表有查询和插入权限;*.*:ALL表示所有库表的全部权限)。 |
Ansible批量管理案例400台机器项目
核心约束
- 机器类型混合:300 台 Linux、100 台 Windows;
- 所有机器密码不同,无法通过统一认证方式管理。
关键规划与步骤
- 生成主机清单(核心)
- 基于包含 "IP、用户名、密码、系统类型(linux/win)" 的源文件(如 all_pass.txt),通过 Shell 脚本批量生成主机清单:
- 按系统类型分组:Linux 机器归入 [linux_servers] 组,Windows 归入 [win_servers] 组;
- 每个主机条目明确指定认证信息:
ansible_user(用户名)、ansible_password(密码)、ansible_port(端口,如 22); - 最终合并为 all_hosts 总清单。
- 基于包含 "IP、用户名、密码、系统类型(linux/win)" 的源文件(如 all_pass.txt),通过 Shell 脚本批量生成主机清单:
- 主机名规划(可选)
- 按 IP 范围对主机名分类(如 3-6 号 IP 为 lb,7-10 号为 web 等),需根据 IP 判断实现。
- 执行流程
- 测试连通性:通过
ansible -i all_hosts 组名 -m ping验证主机可达; - 执行部署剧本:针对 Linux 和 Windows 分别编写 Playbook,完成 Zabbix Agent 的安装、配置、启动。
- 测试连通性:通过