什么是ansible?
Ansible是一种自动化工具,用于配置管理、应用部署和任务自动化。通过使用简单的剧本(Playbooks)和任务(Tasks),Ansible使得管理和部署基础设施变得更加简单和高效。Ansible基于SSH协议进行通信,不需要在被管节点上安装客户端,因此易于部署和扩展。它支持各种操作系统、云服务和网络设备,使得跨多个环境的自动化管理变得更加便捷。Ansible的语法简洁易懂,学习曲线较低,适用于各种规模的项目和组织。通过Ansible,用户可以实现基础设施即代码(Infrastructure as Code)、持续部署(Continuous Deployment)、自动化测试等现代化运维实践,提高团队的效率和可靠性。
ansible的优点
-
简单易用:Ansible使用基于YAML的剧本语言,语法简洁直观,易于学习和使用。
-
无Agent:无需在被管理节点上安装代理,通过SSH协议实现远程执行,部署简单高效。
-
灵活性:支持多种操作系统、云服务和网络设备,适用于各种不同场景和环境。
-
可扩展性:可以轻松扩展功能,编写自定义模块和插件以满足特定需求。
-
自动化能力:支持自动化配置管理、应用部署、任务编排等,提高运维效率和一致性。
-
社区支持:拥有活跃的社区和丰富的文档资源,便于获取帮助和分享经验。
-
可视化工具:提供Ansible Tower等可视化工具,简化任务调度、权限管理等操作。
ansible不足
-
学习繁琐: 对于初学者来说,学习 Ansible 可能需要花费一些时间。需要掌握 YAML 语法、模块的使用方法、Playbook 的编写等内容。
-
Windows 支持: 相比于 Linux 和 Unix 系统,Ansible 在 Windows 平台上的支持相对较弱。虽然 Ansible 支持在 Windows 上执行命令和脚本,但其功能和性能仍然不如在 Linux 平台上的表现。
-
复杂性: 针对大型基础设施和复杂的自动化任务,有时候需要编写复杂的 Playbook 和角色,这可能会增加维护和理解的难度。
-
实时交互的限制: Ansible 主要是面向批量化操作的自动化工具,对于需要实时交互的场景(例如实时监控和调试),其支持并不是特别强大。
-
性能问题: 在某些情况下,特别是在大规模部署和高频率执行任务时,Ansible 的性能可能会成为瓶颈。
-
需求高的网络环境: Ansible 执行任务时需要与被管节点进行频繁的通信,因此对网络的稳定性和延迟要求较高。
ansible组件
-
控制节点(Control Node):
控制节点是 Ansible 的中心管理服务器,通常是一个运行 Ansible 工具的 Linux 主机。在控制节点上执行 Ansible 命令和操作,包括编写和运行 Playbook,管理 Ansible 的配置文件等。 -
被管节点(Managed Nodes):
被管节点是需要被 Ansible 管理和配置的远程主机或服务器。Ansible 通过 SSH 连接到被管节点,并在其上执行任务、命令或配置操作。 -
Inventory(清单):
清单是一个定义被管节点的列表的文件,通常是一个文本文件,其中列出了被管理主机的 IP 地址或主机名。清单文件可以分为静态清单和动态清单,用于指定 Ansible 应该在哪些主机上执行任务。 -
模块(Modules):
模块是 Ansible 执行任务的基本单位,每个模块用于执行特定的操作,比如管理软件包、服务、文件操作等。Ansible 自带了众多模块,同时也支持用户编写自定义模块。 -
Playbook:
Playbook 是一个 YAML 格式的文件,其中包含了一系列任务和配置指令,用于定义 Ansible 在被管节点上执行的操作。通过 Playbook 可以实现复杂的自动化任务和配置管理。 -
Roles(角色):
角色是一种组织 Playbook 的方式,用于将相关的任务、变量和文件组织在一起,以便在不同的 Playbook 中重复使用。 -
变量(Variables):
变量允许在 Ansible 中定义和引用数据,可以用于配置、条件判断和任务执行过程中的动态操作。
ansible的搭建
1.安装ansible(这里使用yum进行安装)
yum -y install ansible*
进入配置文件,查看到以下信息
进入/etc/ansible/ansible.cfg,执行ansible-config init --disabled > ansible.cfg,修改以下配置
nventory=/etc/ansible/hosts 设定清单文件信息
log_path=/var/log/ansible.log 开启ansible目录
host_key_checking=False 不检测服务器的指纹信息!
roles_path=~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles设定角色信息
2.配置主客连接
我们可以做两台之间的ssh免密登录,也可以在主机清单中填写ssh密码(不安全),我推荐两台之间做ssh免密登录较稳妥些。
ssh免密登录
生成密钥 ssh-keygen
一路回车
将密钥传输给远程计算机 ssh-copy-id root@远程主机IP
回答yes
输入远程计算机用户密码
尝试登录远程计算机,格式ssh root@远程计算机ip
如果直接登录成功,则表示已经免密成功
注意:登录后记得退出远程计算机exit
[group4:children] 该组的子组为2 3组
group2
group3
3.测试连接
ansible all -m ping
ansible-doc -s ping 查看指定模块的帮助
Ansible-doc -l 查看所有模块
简单模块,命令介绍
ansible all -m command -a "creates=/iso ls" 可以检测文件是否存在,不会去执行
ansible all -m command -a "touch /root/123" 创建命令,在远程主机上执行指定的命令。
chdir 用来切换目录的
removes 当指定的文件存在的时候,命令会执行将文件删除,如果指定的文件不存在,则不会执行命令
creates 当指定的文件存在的时候,命令不执行(不创建)。如果指定的文件不存在,则执行命令创建文件
user模块
name 指定用户名 如果用户名不存在则可以创建用户
password 给用户添加密码,添加的密码只能是hash加密后的字符
uid 指定用户的uid
group 指定用户的基本组
groups 指定用户的附加组
append=yes 增量添加的附加组 相当于把一个用户添加到多个附加组里面
append=no 增量添加的附加组,相当于只设置一个附加组!
state=absent 删除用户 默认不删除家目录
remove=yes 删除用户的同时删除家目录
后面加参数即可。
ansible all -m user -a "name=chen"
script模块
编写一个脚本(赋予执行权限),可以让管控主机执行
ansible all -m script -a "chdir=/root test.sh"
copy模块
参数:
src: 要复制的文件路径(源文件)
dest: 要将文件复制到目标主机的哪个位置(必须出现的参数)
content:将指定的内容添加到远程主机的文件中
注意,content会覆盖原来的内容
copy当中不加任何参数,当主控端和远程主机的文件名一致,但是内容不一致
的时候会强制覆盖原有内容,等同于加上了force=yes
force=no 当主控端和远程主机文件名一致,但是内容不一致的时候,则放弃拷贝
backup=yes 当主控端和远程主机文件名一致,但是内容不一致的时候,则对目标文件进行备份
owner 指定文件的属主
group 指定文件的属组
mode 指定文件的权限
复制目录的时候不能复制空目录!
例如;在本地创建newfile文件,写入些文字,即可去客户机上/media查看ansible all -m copy -a "src=/root/newfile dest=/media"
ansible all -m copy -a "src=/root/newfile dest=/media"
修改文件内容
ansible all -m copy -a "content='lovely' dest=/media/newfile"
设置属主属组,给予777权限
ansible all -m copy -a "src=/root/newfile dest=/media owner=root mode=777"
yum模块
在远程主机上使用yum安装软件,在远程主机上需要配置好yum。
参数
name 软件名称
state:installed 安装 removed卸载
例如;安装dhcp服务
ansible all -m yum -a "name=dhcp* state=installed"
卸载dhcp服务
ansible all -m yum -a "name=dhcp* state=removed"
service模块
参数:
name 服务名
state:started 开启 restarted 重启 reloaded 重新加载
stopped 停止
enabled=yes 开机自启
例如;重启防火墙服务
ansible all -m service -a "name=firewalld state=restarted"
下节简单介绍如何部署一个服务,角色