
00:00:00
外卖卷:非常划算 扫码领劵 省点小钱钱
Ansible 是目前最受运维欢迎的批量自动化运维工具,基于 Python 开发,集合了众多运维工具 (SaltStack puppet、chef、func、fabric) 的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
Ansible 是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是 Ansible 所运行的模块,Ansible 只是提供一种框架。Ansible 不需要在远程主机上安装 client/agents,因为它们是基于 ssh 来和远程主机通讯的。
/etc/ansible/ansible.cfg;command、copy、shell.ansible/tmp/XXX/XXX.PY 文件;+x 执行权限;sleep 0 退出;早期,运维人员需要维护数量众多的机器,执行大量重复性劳动。例如,为 backup 服务器部署 Rsync 服务,需要在所有其他服务器上分别配置 Rsync 客户端,过程繁琐。
在 2003-2012 年间,SSH 自动化运维逐渐流行。通过在管理机上创建密钥对,将公钥分发至被管理机器,然后开发脚本实现批量管理。然而,这些脚本通常复杂且难以维护。系统管理员面临的主要问题是系统配置管理和远程命令执行,因此诞生了 Fabric、Puppet、Chef、Ansible、SaltStack 等多种开源工具。其中,基于 Python 开发的 SaltStack 和 Ansible 因其学习简单、功能强大而备受青睐。
如今,自动化运维已进入数据化、可视化和智能化阶段。DevOps 和 AIOps 成为行业趋势,AI 机器人等技术也开始辅助运维工作,前景广阔。
自动化运维的好处:
Ad-Hoc 模式用于执行一些临时、快速的命令。
ansible web -m command -a "hostname"
命令 定义主机名 指定模块 模块名字 指定执行动作 执行命令# 使用阿里源更新乌班图源
sudo apt update
sudo apt install -y ansible
sudo apt-get install sshpass# 打开 SSH 配置文件
vim /etc/ssh/sshd_config
# 找到 PermitRootLogin prohibit-password 并修改为 yes
PermitRootLogin yes
# 重启 SSH 服务
sudo service ssh restart
# 设置 root 密码
sudo passwd编辑 /etc/ansible/hosts 文件来定义受管主机。
基础配置:
[web]
172.16.1.7 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123123
172.16.1.8 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123123使用变量简化配置:
[web:vars]
ansible_ssh_port=22
ansible_ssh_user=root
ansible_ssh_pass="1234"
[web]
172.16.1.[7:10]常用参数:
| 参数 | 说明 |
|---|---|
ansible_host | 远程主机 IP |
ansible_port | SSH 连接端口,默认 22 |
ansible_user | SSH 连接用户 |
ansible_password | SSH 连接密码 |
首次连接新主机会有指纹确认提示。
[root@master-61 ~]#ansible 172.16.1.9 -m ping
172.16.1.9 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
}可以手动 ssh 连接一次,或者在 Ansible 配置文件 /etc/ansible/ansible.cfg 中禁用主机密钥检查:
[defaults]
host_key_checking = False# 查看所有模块
ansible-doc -l
# 查看特定模块帮助
ansible-doc -s <module_name>ping 模块 测试与主机的连通性。
ansible all -m pingcommand 模块 在远程节点上执行简单命令。这是 Ansible 的默认模块。
注意: command 模块不支持 shell 变量(如 $HOME)和特殊符号(如 <、>、|、;、&)。
示例:
# 查看主机名 (可省略 -m command)
ansible web -a hostname
# 查看内存
ansible web -a "free -m"
# 创建文件
ansible web -a "touch /opt/test.log"command 模块参数:
| 参数 | 说明 |
|---|---|
chdir | 在执行命令前进入指定目录 |
creates | 如果指定文件不存在,则执行命令 |
removes | 如果指定文件存在,则执行命令 |
shell 模块 在远程节点上执行复杂的命令,支持管道、重定向等 shell 特性。
示例:
# 过滤 ssh 进程信息
ansible all -m shell -a "ps -ef | grep ssh"
# 使用重定向创建文件
ansible web -m shell -a "date > /opt/date.log"copy 模块 将文件从控制节点复制到远程主机。
示例:
# 简单复制文件
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/'
# 复制并修改文件属性
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/ group=www owner=www mode=600'
# 复制前备份远程文件 (仅当内容变化时)
ansible web -m copy -a 'src=/tmp/local.log dest=/opt/ backup=yes'
# 直接写入内容到远程文件
ansible web -m copy -a "content='some content' dest=/opt/newfile.txt"file 模块 管理远程主机上的文件和目录属性,如创建、删除、修改权限等。
file 与 copy 的区别:
copy:src 在控制节点,dest 在远程节点。file:src 和 dest 都在远程节点(用于创建链接)。常用参数:
| 参数 | 说明 |
|---|---|
path | 必须,指定要操作的文件或目录 |
state | directory(目录)、touch(文件)、link(软链接)、hard(硬链接)、absent(删除) |
owner | 指定属主 |
group | 指定属组 |
mode | 指定权限 |
recurse | yes 时递归修改目录属性 |
示例:
# 创建文件
ansible all -m file -a "path=/opt/test.log state=touch"
# 创建目录
ansible all -m file -a "path=/opt/test_dir state=directory"
# 创建文件并设置权限
ansible all -m file -a "path=/opt/hello.log state=touch owner=www group=www mode=0644"script 模块 在远程主机上执行本地脚本。
示例:
# 在所有 web 主机上执行本地的 /tmp/test.sh 脚本
ansible web -m script -a "/tmp/test.sh"group 模块 管理远程主机上的用户组。
常用参数:
| 参数 | 说明 |
|---|---|
name | 必须,指定组名 |
state | present (创建,默认值)、absent (删除) |
gid | 指定组 ID |
示例:
# 创建一个名为 www 的用户组
ansible all -m group -a "name=www state=present"
# 删除 www 用户组
ansible all -m group -a "name=www state=absent"user 模块 管理远程主机上的用户账户。
常用参数:
| 参数 | 说明 |
|---|---|
name | 必须,指定用户名 |
state | present (创建,默认值)、absent (删除) |
uid | 指定用户 ID (UID) |
group | 指定用户所属的主组 |
groups | 指定用户所属的附加组 |
shell | 指定用户的登录 Shell |
home | 指定用户的家目录 |
password | 设置用户密码 (加密后的字符串) |
remove | 当 state=absent 时,yes 表示删除用户的家目录 |
示例:
# 创建一个名为 www 的用户,并将其添加到 www 组
ansible all -m user -a "name=www group=www state=present"
# 删除 www 用户及其家目录
ansible all -m user -a "name=www state=absent remove=yes"
评论