文章目录
- 前言
- [Ansible 入门到精通](#Ansible 入门到精通)
-
- 入门篇
- 进阶篇
- 精通篇
- 入门篇
-
- [1. Ansible 简介](#1. Ansible 简介)
- [2. 安装 Ansible](#2. 安装 Ansible)
-
- [1. 通过包管理器安装:](#1. 通过包管理器安装:)
- [2. 通过源码安装:](#2. 通过源码安装:)
- [3. Ansible 的基本概念和核心组件](#3. Ansible 的基本概念和核心组件)
- [4. 编写和运行第一个 Ansible Playbook](#4. 编写和运行第一个 Ansible Playbook)
- [5. 主机清单和组织结构](#5. 主机清单和组织结构)
- [6. Ansible 常用模块和任务](#6. Ansible 常用模块和任务)
- [7. Ansible 变量和模板](#7. Ansible 变量和模板)
- [8. Ansible 条件和循环](#8. Ansible 条件和循环)
- 参考文档
前言
ansible 学习大纲
Ansible 是一个开源的自动化工具,用于配置管理、应用部署和任务执行。它以简单、可读性强的 YAML 格式的 Playbooks 为基础,使得自动化任务变得简单、可维护和可扩展。
-
简单易用:Ansible 的设计目标之一是简单易用。它使用 YAML 语法定义任务和配置,无需编写复杂的脚本或编程代码。初学者可以快速上手,同时也适用于复杂的自动化需求。
-
无代理:Ansible 使用 SSH 协议进行远程连接和执行任务,无需在远程主机上安装任何代理程序。这使得部署和管理变得简单,同时减少了对目标主机的依赖和配置要求。
-
基于模块化:Ansible 基于模块化的架构,提供了丰富的模块来管理各种不同类型的系统、服务和应用。这些模块可以执行各种任务,如安装软件包、配置文件、启动服务等。
-
声明式语法:Ansible Playbooks 使用声明式语法描述所需的状态和配置,而不是编写特定的步骤和命令。这使得配置管理和自动化任务的维护更加直观和可读性强。
-
可扩展性:Ansible 可以轻松扩展以适应不同规模和复杂度的环境。它支持分组管理、变量管理、角色和插件等功能,可以构建复杂的自动化流程和组织结构。
-
强大的生态系统:Ansible 拥有庞大的社区和活跃的贡献者,提供了大量的模块、角色和插件。Ansible Galaxy 是一个社区驱动的集市,提供了现成的角色和模块,可用于加速和共享自动化任务的开发。
Ansible 的应用场景广泛,可以用于服务器配置管理、应用部署、云基础设施管理、网络设备配置、持续集成/持续部署 (CI/CD) 等。它的简单性、可读性和可扩展性使得 Ansible 成为许多组织和开发团队的首选自动化工具。
Ansible 入门到精通
入门篇
- Ansible 简介
- 安装 Ansible
- Ansible 的基本概念和核心组件
- 编写和运行第一个 Ansible Playbook
- 主机清单和组织结构
- Ansible 常用模块和任务
- Ansible 变量和模板
- Ansible 条件和循环
进阶篇
- Ansible 的高级主题(例如:角色、动态清单、变量管理等)
- 使用 Ansible Vault 进行加密和解密
- Ansible 远程执行和连接方式
- 高级 Ansible Playbook 技巧
- 使用 Ansible 进行系统配置和部署
- Ansible 的容器和云集成
- Ansible 自动化测试和检查
- Ansible 运维和故障排除
精通篇
- Ansible 在企业级环境中的应用和扩展
- Ansible 与其他自动化工具的集成
- Ansible 最佳实践和实际案例分析
- Ansible 性能优化和容错机制
- Ansible 社区和资源
入门篇
1. Ansible 简介
2. 安装 Ansible
安装 Ansible 主要有两种方式:通过包管理器和源码安装。
1. 通过包管理器安装:
对于基于 Debian 的系统(如 Ubuntu),可以使用 apt-get 命令来安装 Ansible:
shell
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt-get install ansible
对于基于 Red Hat 的系统(如 CentOS),可以使用 yum 命令来安装 Ansible:
shell
sudo yum install epel-release
sudo yum install ansible
2. 通过源码安装:
如果你需要使用 Ansible 的最新版本,或者你的系统没有预包装的 Ansible,你可以选择通过源码安装。首先,你需要安装一些必要的依赖,然后从 GitHub 上克隆 Ansible 的源码,并安装:
shell
sudo apt-get install git python3-pip
git clone https://github.com/ansible/ansible.git
cd ansible
sudo pip3 install .
安装完成后,你可以使用 ansible --version
命令来检查 Ansible 是否已经成功安装,以及其版本信息。
3. Ansible 的基本概念和核心组件
Ansible的一些基本概念和核心组件:
-
主机清单(Inventory):主机清单是一个定义可管理主机的文件或文件集合。它指定了Ansible应该在哪些主机上执行任务。主机清单可以是静态的(静态清单文件)或动态的(通过外部脚本或插件生成)。
-
Playbook:Playbook是一个YAML格式的文件,用于定义Ansible的配置、部署和管理任务。它由一个或多个Play(任务集合)组成,每个Play定义了一组在一组主机上执行的任务。
-
模块(Modules):模块是Ansible的基本执行单元,用于执行具体的任务。Ansible提供了丰富的模块库,用于管理文件、安装软件包、配置服务等各种操作。
-
任务(Tasks):任务是在Playbook中定义的单个操作步骤。每个任务通常使用一个模块来执行特定的操作,例如安装软件包、复制文件、启动服务等。
-
角色(Roles):角色是一种组织和复用Playbook的机制。它将相关的任务、变量和文件组织到单个目录结构中,使得管理和维护复杂的配置变得更加容易。
-
变量(Variables):变量用于存储和传递数据,以在Playbook中进行配置和任务执行。变量可以在不同的层次(全局、主机组、主机、角色等)进行定义和使用。
-
模板(Templates):模板是一种允许在文件复制过程中进行动态渲染的机制。它使用Jinja2模板引擎,可以根据变量和条件生成最终的配置文件。
-
插件(Plugins):插件是可扩展Ansible功能的组件。它们可以修改或扩展Ansible的核心行为,包括主机清单解析、任务执行、变量处理等。
-
控制节点(Control Node):控制节点是运行Ansible的主机或服务器。它是执行Ansible命令和Playbook的机器,与目标主机通过SSH建立连接并进行管理操作。
这些是Ansible的一些基本概念和核心组件。通过理解这些概念,您可以开始编写和执行Ansible Playbook,实现自动化的系统配置和管理
4. 编写和运行第一个 Ansible Playbook
要编写一个部署包含 Spring Boot 项目、Redis、MySQL 和 Nginx 的 Ansible Playbook, 可以按照以下步骤进行操作:
- 主机清单(Host Inventory)
指定你要在其中部署和管理应用程序的主机列表。它是一个文本文件,其中包含主机的名称或 IP 地址,并按组织和分类进行分组。主机清单告诉 Ansible 在哪些主机上执行特定的任务或角色。
主机清单文件通常具有.ini
或.yaml
扩展名
我们有两个组[web_servers]
和[database_servers]
,每个组中列出了相应主机的名称和 IP 地址。你需要根据你的实际部署环境和需求来创建和维护主机清单文件。
ini
[web_servers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[database_servers]
db1 ansible_host=192.168.1.20
db2 ansible_host=192.168.1.21
- 创建一个名为
deploy.yml
的 Ansible Playbook 文件。
在这个 Playbook 中,我们首先定义了一些变量,例如项目名称、项目版本和 MySQL 的 root 密码。你可以根据实际情况修改这些变量的值。
接下来,我们列出了一系列任务:
- 更新 apt 缓存
- 安装 Java Development Kit (JDK)
- 安装 Redis
- 安装 MySQL
- 对 MySQL 进行安全设置
- 安装 Nginx
- 配置 Nginx
- 部署 Spring Boot 项目
- 启动 Spring Boot 项目
yaml
---
- name: Deploy Spring Boot Project
hosts: 172.16.57.56 # 替换为你的目标主机清单
vars:
project_name: icepip-first-project # 项目名称
project_version: 1.0.0 # 项目版本
mysql_root_password: your_mysql_root_password # MySQL root 密码
tasks:
- name: Update apt cache # 更新 apt 缓存
become: yes
apt:
update_cache: yes
- name: Install Java Development Kit (JDK) # 安装 Java Development Kit (JDK)
become: yes
apt:
name: openjdk-11-jdk
state: present
- name: Install Redis # 安装 Redis
become: yes
apt:
name: redis-server
state: present
- name: Install MySQL # 安装 MySQL
become: yes
apt:
name: mysql-server
state: present
- name: Secure MySQL installation # 安全设置 MySQL 安装
become: yes
mysql_user:
name: root
password: "{{ mysql_root_password }}"
login_unix_socket: /var/run/mysqld/mysqld.sock
host: localhost
check_implicit_admin: yes
login_user: root
login_password: ""
priv: "*.*:ALL,GRANT"
state: present
- name: Install Nginx # 安装 Nginx
become: yes
apt:
name: nginx
state: present
- name: Configure Nginx # 配置 Nginx
become: yes
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
validate: /usr/sbin/nginx -t
notify:
- Restart Nginx
- name: Deploy Spring Boot project # 部署 Spring Boot 项目
become: yes
copy:
src: target/{{ project_name }}-{{ project_version }}.jar
dest: /opt/{{ project_name }}.jar
- name: Start Spring Boot project # 启动 Spring Boot 项目
become: yes
shell: |
nohup java -jar /opt/{{ project_name }}.jar > /dev/null 2>&1 &
handlers:
- name: Restart Nginx # 重启 Nginx
become: yes
service:
name: nginx
state: restarted
在 Configure Nginx
任务中,使用了一个名为 nginx.conf.j2
的模板文件来配置 Nginx。你需要创建这个模板文件并定义适合你的项目的 Nginx 配置。定义了一个名为 Restart Nginx
的处理程序,在配置更改时重新启动 Nginx 服务。
- 创建一个名为
nginx.conf.j2
的模板文件
Nginx 配置了一个监听端口为 80 的服务器块,将请求代理到运行在本地的 Spring Boot 项目的 8080 端口。
shell
worker_processes auto;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name your_domain;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
-
保存并关闭
deploy.yml
和nginx.conf.j2
文件。 -
运行 Ansible Playbook:
bash
ansible-playbook deploy.yml
Ansible 将连接到目标主机并按照 Playbook中定义的任务顺序执行操作。它会安装和配置 Redis、MySQL 和 Nginx,然后部署和启动 Spring Boot 项目。
5. 主机清单和组织结构
主机清单(Host Inventory)和组织结构在 Ansible 中起着关键的作用。它们用于定义和组织要管理的主机以及如何对它们进行分类和分组。
主机清单
-
主机清单文件:主机清单文件是一个文本文件,其中列出了要在 Ansible 中管理的主机的信息。它可以包含主机名、IP 地址、连接信息和其他变量。主机清单文件可以使用
.ini
或.yaml
格式编写。 -
主机组:主机组是一种将主机按逻辑或功能进行分组的方式。你可以基于不同的标准(如角色、地理位置、环境等)将主机分成不同的组。这样,你可以根据需要在组级别或单个主机级别上执行任务。
-
组变量:组变量是应用于特定主机组的变量。它们以组的名称作为键,可以在主机清单文件中定义。通过组变量,你可以在一次性中为一组主机设置共享的属性和配置。
-
主机变量:主机变量是应用于单个主机的变量。它们以主机的名称作为键,可以在主机清单文件中定义。主机变量允许你为特定主机设置独立的属性和配置。
-
动态主机清单:动态主机清单是一种动态生成主机清单的机制。它可以从外部源(如云提供商、配置管理数据库等)获取主机信息,并在运行时构建主机清单。这对于动态环境中的自动化和弹性部署非常有用。
通过合理组织和使用主机清单和组织结构,你可以更好地管理和扩展 Ansible 部署。你可以根据你的项目需求和部署架构,灵活地定义主机组、变量和组织结构,以便有效地执行任务和角色。
在Ansible中,主机清单是一个配置文件,它包含了被Ansible管理的所有主机的列表。主机清单通常用于制定哪些主机应该接受哪些特定的命令和配置。
主机清单的基本结构是这样的:
在这个例子中,web_servers
和database_servers
就是组(组名),
bash
[web_servers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[database_servers]
db1 ansible_host=192.168.1.20
db2 ansible_host=192.168.1.21
组织结构
Ansible的组织结构是通过主机清单来管理的,可以构建高级别的抽象结构,这意味着可以有子组、父组,甚至可以有嵌套的子组。 atlanta
和raleigh
是子组;southeast
是父组,它包含了两个子组(atlanta, raleigh
);usa
是一个更大的父组,包含了更多的子组。同时,在[southeast:vars]
下定义的变量(some_server,halon_system_timeout,self_destruct_countdown,escape_pods) 将对southeast
组以及其下的所有子组和主机生效。
bash
[atlanta]
host1
host2
[raleigh]
host3
host4
[southeast:children]
atlanta
raleigh
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2
[usa:children]
southeast
northeast
southwest
northwest
这种组织结构的设计使得Ansible能够非常轻松地管理大型的网络结构。你可以简单地通过改变组或父组的配置来改变一大组机器的行为。
6. Ansible 常用模块和任务
Ansible 提供了丰富的模块来执行各种任务。下面是一些常用的 Ansible 模块和任务的示例:
apt
模块:用于管理基于 APT(Debian、Ubuntu)的软件包。可以安装、升级、移除软件包,并更新本地的软件包缓存。
yaml
- name: Install nginx
apt:
name: nginx
state: present
yum
模块:用于管理基于 YUM(Red Hat、CentOS)的软件包。可以安装、升级、移除软件包,以及管理软件包仓库。
yaml
- name: Install httpd
yum:
name: httpd
state: present
copy
模块:用于将文件从控制节点复制到远程主机。可以指定源文件路径和目标路径,并设置文件权限和所有权。
yaml
- name: Copy configuration file
copy:
src: /path/to/source/file.conf
dest: /etc/destination/file.conf
owner: root
group: root
mode: 0644
template
模块:用于使用模板引擎生成文件,并将其复制到远程主机。可以使用变量和条件逻辑来自定义生成的文件。
yaml
- name: Generate configuration file from template
template:
src: /path/to/template.conf.j2
dest: /etc/destination/file.conf
owner: root
group: root
mode: 0644
service
模块:用于管理系统服务的状态。可以启动、停止、重新启动服务,并设置服务的启动状态。
yaml
- name: Start nginx service
service:
name: nginx
state: started
command
模块:用于在远程主机上执行命令并获取输出结果。
yaml
- name: Execute a command
command: ls -l /path/to/directory
register: result
- name: Print command output
debug:
var: result.stdout
这只是一小部分常用的 Ansible 模块和任务示例。Ansible 还提供了许多其他模块,涵盖了各种任务,包括文件操作、用户管理、数据库操作、云资源管理等。你可以根据具体需求选择适当的模块和任务,构建自己的 Ansible Playbooks。
7. Ansible 变量和模板
在 Ansible 中,变量和模板的定义可以在不同的位置和方式进行。以下是几种常见的定义方式:
1. 主机清单文件中定义变量: 可以在主机清单文件中为每个主机或主机组定义变量。这些变量将应用于特定的主机或主机组,可以在 Playbooks 和模板中使用。主机变量使用 host_vars
和 group_vars
目录来组织,文件名与主机名或组名相对应。
示例(位于 host_vars
目录下的文件):
yaml
# host_vars/web1.yml
http_port: 8080
示例(位于 group_vars
目录下的文件):
yaml
# group_vars/web_servers.yml
http_port: 8080
2. Playbook 文件中定义变量: 可以在 Playbook 文件中定义变量,这些变量将应用于整个 Playbook 中的任务。可以使用 vars
关键字定义变量。
示例:
yaml
- name: Configure web server
hosts: web_servers
vars:
http_port: 8080
tasks:
- name: Install and configure web server
...
3. 命令行中定义变量: 可以在运行 Ansible 命令时通过命令行参数定义变量。可以使用 -e
或 --extra-vars
参数来传递变量。
示例:
bash
ansible-playbook playbook.yml -e "http_port=8080"
4. 注册变量: 在任务执行期间,可以使用 register
关键字将命令执行的结果保存到变量中。注册变量可以在后续任务中使用。
示例:
yaml
- name: Execute a command
command: ls -l /path/to/directory
register: result
- name: Print command output
debug:
var: result.stdout
5. 模板文件中定义变量: 可以在模板文件中使用变量占位符,并在 Playbook 中通过 template
模块将变量值传递给模板。
示例模板文件 template.conf.j2
:
ini
# Configuration file
server_ip = {{ ansible_host }}
http_port = {{ http_port }}
在 Playbook 中使用 template
模块:
yaml
- name: Generate configuration file from template
template:
src: template.conf.j2
dest: /etc/destination/file.conf
owner: root
group: root
mode: 0644
8. Ansible 条件和循环
在 Ansible 中,条件和循环用于控制任务的执行流程和处理复杂的配置情况。以下是 Ansible 中条件和循环的用法和示例:
条件:
使用条件语句可以根据不同的条件来执行或跳过任务。
when
关键字:when
关键字允许你在任务级别使用条件判断。任务只有在条件为真时才会执行。
yaml
- name: Install package if OS is CentOS 7
yum:
name: package_name
state: present
when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7'
failed_when
关键字:failed_when
关键字允许你在任务执行失败时自定义失败的条件。
yaml
- name: Execute a command and ignore non-zero return code
command: some_command
failed_when: false
changed_when
关键字:changed_when
关键字允许你自定义任务是否被标记为已更改的条件。
yaml
- name: Execute a command and always report as changed
command: some_command
changed_when: true
循环:
使用循环结构可以对列表、字典等数据进行迭代,执行重复的任务。
with_items
关键字:with_items
关键字用于循环遍历列表。
yaml
- name: Create multiple users
user:
name: "{{ item }}"
state: present
with_items:
- user1
- user2
- user3
loop
关键字:loop
关键字用于循环遍历任意可迭代对象,包括列表、字典等。
yaml
- name: Create multiple users
user:
name: "{{ item }}"
state: present
loop:
- user1
- user2
- user3
with_dict
关键字:with_dict
关键字用于循环遍历字典。
yaml
- name: Set multiple facts
set_fact:
"{{ item.key }}": "{{ item.value }}"
with_dict:
key1: value1
key2: value2
key3: value3
with_fileglob
关键字:with_fileglob
关键字用于循环遍历匹配指定文件模式的文件列表。
yaml
- name: Copy files
copy:
src: "{{ item }}"
dest: /path/to/destination/
with_fileglob:
- /path/to/files/*.txt
- /path/to/files/*.conf
参考文档
-
Ansible 官方文档 ↗: Ansible 官方文档是学习 Ansible 的最全面和权威的资源。它包含了 Ansible 的所有功能、模块和概念的详细说明,并提供示例和最佳实践指南。
-
Ansible 官方示例 ↗: Ansible 官方示例库包含了一系列使用 Ansible 的示例 Playbooks,涵盖了各种常见的用例和场景。这些示例可以帮助你学习和理解如何使用 Ansible 进行自动化配置和部署。