文章目录
- Ansible
-
- Ansible的核心特性
- Ansible的工作原理
- Ansible的使用场景
- Ansible部署指南
- [Ansible Inventory 主机清单](#Ansible Inventory 主机清单)
Ansible
Ansible 是一个功能强大的自动化工具,它能够帮助系统管理员和开发人员自动化配置、部署和管理服务器。
Ansible的核心特性
- 基于Python开发 :
- Ansible是用Python编写的,这使得它易于扩展和定制。
- 配置管理和应用部署 :
- Ansible不仅可以用于配置管理(如设置系统参数、安装软件包等),还可以用于应用部署(如部署Web应用、数据库等)。
- 融合老牌运维工具的优点 :
- Ansible结合了像Puppet和Saltstack这样的老牌运维工具的功能,提供了一个更强大、更灵活的解决方案。
- 批量操作 :
- Ansible能够批量配置、部署和管理成百上千台主机,大大简化了大规模环境的运维工作。
- 模块化设计 :
- Ansible的工作基于模块,每个模块执行特定的任务,如复制文件、管理服务等。
- Agentless架构 :
- Ansible不需要在远程主机上安装任何代理或额外的服务,它仅通过SSH连接来管理远程主机。
- 幂等性 :
- Ansible的大多数模块都具备幂等性,这意味着无论执行多少次相同的操作,结果都是一致的。
Ansible的工作原理
- 控制节点 :
- Ansible控制节点是运行Ansible命令的机器,它包含Ansible的核心和所有需要的模块。
- 主机清单(Inventory) :
- 主机清单是一个包含要管理的主机信息的文件或数据库,它定义了哪些主机属于Ansible的管理范围。
- Playbooks :
- Playbooks是Ansible的配置文件,它们定义了要执行的任务、使用的模块以及任务之间的依赖关系。
- 任务执行 :
- 当用户在控制节点上运行Ansible命令或Playbook时,Ansible会根据主机清单找到目标主机,并将任务拆解为可执行的命令。
- Ansible通过SSH将临时文件(包含要执行的命令)发送到远程主机,并在远程主机上执行这些命令。
- 执行结果通过SSH返回给控制节点,并在控制节点上显示。
- 执行结束后,临时文件会自动删除。
Ansible的使用场景
- 自动化部署 :
- Ansible可以用于自动化部署应用程序,包括Web应用、数据库、中间件等。
- 配置管理 :
- Ansible可以自动化地管理系统配置,如设置网络参数、安装软件包、配置服务等。
- 环境一致性 :
- Ansible可以帮助确保开发、测试和生产环境的一致性,减少人为错误。
- 持续集成/持续部署(CI/CD) :
- Ansible可以与CI/CD工具集成,实现自动化构建、测试和部署。
- 安全合规性 :
- Ansible可以用于自动化安全审计和合规性检查,确保系统符合安全标准。
- 灾难恢复 :
- Ansible可以用于自动化灾难恢复过程,如备份恢复、服务重启等。
Ansible部署指南
环境配置
类型 | IP地址 |
---|---|
管理端 | 192.168.80.10 (Ansible) |
被管理端1 | 192.168.80.11 |
被管理端2 | 192.168.80.12 |
在管理端安装Ansible
-
安装EPEL源 :
bashyum install -y epel-release
-
安装Ansible :
bashyum install -y ansible
Ansible目录结构
Ansible的主要目录结构如下:
/etc/ansible/
├── ansible.cfg # Ansible的主配置文件
├── hosts # Ansible的主机清单文件,包含要管理的远程主机信息
└── roles/ # 存放Ansible的角色(Role)的目录,用于组织Playbook
配置主机清单
-
导航到Ansible配置目录 :
bashcd /etc/ansible
-
编辑主机清单文件 :
bashvim hosts
-
在文件中添加主机组 :
ini[webservers] 192.168.80.11 [dbservers] 192.168.80.12
配置密钥对验证
-
生成SSH密钥对 :
bashssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
这将生成一个无密码的SSH密钥对,用于无密码登录远程主机。
-
安装sshpass(可选,用于自动化密码输入) :
bashyum install -y sshpass
-
使用sshpass自动复制公钥到远程主机 :
假设远程主机的root密码为abc1234
,则可以使用以下命令将公钥复制到远程主机:bashsshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.80.11 sshpass -p 'abc1234' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.80.12
注意:使用明文密码进行自动化操作存在安全风险,建议尽可能使用SSH密钥对或其他更安全的认证方式。
验证配置
完成上述步骤后,您可以尝试使用SSH无密码登录到远程主机,以验证配置是否成功:
bash
ssh root@192.168.80.11
ssh root@192.168.80.12
如果无需输入密码即可登录,则说明配置成功。
Ansible Inventory 主机清单
Ansible 的 Inventory 文件(通常位于 /etc/ansible/hosts
)是 Ansible 用来管理和组织目标主机的核心文件。
通过 Inventory,可以定义主机、主机组以及它们之间的关系,还可以为每个主机或主机组设置变量。
基本结构
Inventory 文件的基本结构包括主机定义、主机组定义、主机变量、组变量和组嵌套。
-
主机定义 :
- 直接在主机组下列出 IP 地址或主机名。
- 可以为每个主机指定连接端口(默认是 SSH 的 22 端口)。
ini[webservers] 192.168.80.11:2222 192.168.80.1[2:5]
-
主机组定义 :
- 使用方括号
[]
包围组名。 - 组内可以包含多个主机。
- 使用方括号
-
主机变量 :
- 在主机定义后直接添加变量,格式为
变量名=值
。 - 这些变量只对该主机有效。
ini[webservers] 192.168.80.11 ansible_port=22 ansible_user=root ansible_password=abc1234
- 在主机定义后直接添加变量,格式为
-
组变量 :
- 在组定义后使用
:vars
关键字添加变量。 - 这些变量对该组内的所有主机有效。
ini[webservers:vars] ansible_user=root ansible_password=abc1234
- 在组定义后使用
-
全局变量 :
- 使用
all
组为所有主机定义变量。
ini[all:vars] ansible_port=22
- 使用
-
组嵌套 :
- 使用
:children
关键字定义一个父组,该组可以包含多个子组。 - 父组内的主机是所有子组主机的集合。
ini[nginx] 192.168.80.20 192.168.80.21 192.168.80.22 [apache] 192.168.80.3[0:3] [webs:children] nginx apache
- 使用
Inventory 变量
Inventory 变量用于定义 Ansible 连接和管理目标主机时所需的配置信息。
- ansible_host:Ansible 连接节点时的 IP 地址。
- ansible_port:连接对方的端口号,SSH 连接时默认为 22。
- ansible_user :连接对方主机时使用的用户名。如果不指定,将使用执行
ansible
或ansible-playbook
命令的用户。 - ansible_password:连接时的用户的 SSH 密码,仅在未使用密钥对验证的情况下有效。
- ansible_ssh_private_key_file:指定密钥认证 SSH 连接时的私钥文件。
- ansible_ssh_common_args:提供给 SSH、SFTP、SCP 命令的额外参数。
- ansible_become:允许进行权限提升。
- ansible_become_method :指定提升权限的方式,如
sudo
、su
、runas
等。 - ansible_become_user :提升为哪个用户的权限,默认提升为
root
。 - ansible_become_password:提升为指定用户权限时的密码。
示例
-
主机定义:
192.168.80.11:2222
表示使用非标准 SSH 端口(2222)连接该主机。192.168.80.1[2:5]
表示连接 IP 地址从192.168.80.12
到192.168.80.15
的主机。
-
组变量:
[webservers:vars]
下的变量对所有webservers
组内的主机有效。[all:vars]
下的变量对所有主机有效。
-
组嵌套:
[webs:children]
下的nginx
和apache
组构成了webs
父组,webs
父组包含了所有nginx
和apache
组内的主机。