
🐇明明跟你说过:个人主页
🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅
🔖行路有良友,便是天堂🔖
目录
一、引言
1、什么是Ansible
2、Ansible 的主要功能
3、Ansible 使用场景
二、Handlers与事件驱动操作
1、Handlers的定义
2、Handlers 的触发
3、示例:配置服务并重启
三、Variables(变量)的使用
1、变量作用域
2、变量优先级(Precedence)
四、Templates与Jinja2模板语言
1、Templates介绍
2、Jinja2 模板引擎简介
3、使用模板的基本步骤
4、示例:配置Apache服务器
一、引言
1、什么是Ansible
Ansible 是一个开源的自动化工具,用于配置管理、应用程序部署、任务自动化和多节点的 IT 系统管理。它通过简单的声明式语言(YAML)来定义自动化任务,并利用 SSH(Secure Shell)协议与被管理的节点进行通信。Ansible 被广泛应用于云环境、数据中心、以及各种 IT 基础设施的自动化管理。

2、Ansible 的主要功能

3、Ansible 使用场景

二、Handlers与事件驱动操作
在 Ansible 中,Handlers 是一种特殊类型的任务,它们的执行是 事件驱动的。Handlers 通常用于执行特定的操作,如重启服务或重新加载配置文件,只有在前面的任务发生“变化”时才会执行。这种方式可以提高效率,避免不必要的操作,确保操作仅在确有必要时执行。
1、Handlers的定义
Handlers 是在 Playbook 中的 handlers 部分定义的,通常会在 tasks 部分的任务中通过 notify 来触发。
基本结构:
- 任务:每个任务(task)执行一个操作,例如安装软件、修改文件等。
- 触发:当任务的状态发生变化时(例如文件被修改、服务启动等),使用 notify 触发 Handler。
- Handler:Handler 是一个专门的任务,只有在被通知时才会执行。

2、Handlers 的触发
- 变化检测:只有当任务的状态发生变化时,Ansible 才会触发相应的 Handler。例如:
- 当文件被修改时(如通过 copy、template 等任务)。
- 当服务的状态发生变化时(如通过 service、systemd 等模块)。
- 当安装了软件包时(如通过 apt、yum 等模块)。
如果任务没有引发变化(例如目标文件已经是最新的),则对应的 Handler 不会 被触发。
- 通知 Handler:任务通过 notify 指示哪个 Handler 应该在任务发生变化时执行。通知的 Handler 会被排队并在 Playbook 执行完所有任务后执行。
Handler 执行时机:
- Handlers 的执行时间通常是在所有任务都完成之后,Ansible 会检查所有通知的 Handler,并按顺序执行它们。
- 如果同一个 Handler 被多个任务通知,只会执行一次,避免重复操作。
3、示例:配置服务并重启
下面是一个使用 Ansible Handlers 配置服务并在配置发生变化时重启服务的示例。
假设我们需要配置 Nginx 服务,并确保在配置文件发生变化时自动重启 Nginx 服务。
—
– name: Configure and restart Nginx service
hosts: webservers
become: yes # 使用 sudo 提升权限
tasks:
– name: Copy Nginx configuration file
copy:
src: /path/to/local/nginx.conf # 本地文件路径
dest: /etc/nginx/nginx.conf # 目标路径
owner: root
group: root
mode: '0644'
notify: restart nginx # 通知 Handlers 执行重启 Nginx 服务
– name: Ensure Nginx is installed
apt:
name: nginx
state: present
notify: restart nginx # 如果 Nginx 安装或更新了,触发重启
handlers:
– name: restart nginx
service:
name: nginx
state: restarted # 如果配置有变动,重启 Nginx 服务
- hosts: 指定目标主机,通常在 inventory 文件中定义。在本例中是 webservers 组中的所有主机。
- become: 使用 yes 来提升为管理员权限,以便执行需要权限的操作,如复制文件到 /etc/nginx/ 或安装软件包。
- tasks:
- 第一个任务是将本地的 Nginx 配置文件(nginx.conf)复制到远程服务器的 /etc/nginx/nginx.conf,并设置适当的权限。
- 第二个任务确保 Nginx 服务安装在系统中,若未安装或需要更新,Ansible 会安装 Nginx。
- notify: 这个指令会在任务执行后触发指定的 Handler。在这两个任务中,都会通知 restart nginx Handler。
- handlers:
- restart nginx Handler 使用 service 模块来重启 Nginx 服务,确保新的配置文件或服务状态生效。
运行 Playbook: 假设你已经将上述 Playbook 保存为 nginx_config.yml 文件,并且目标服务器配置正确,可以运行如下命令来执行 Playbook:
ansible-playbook nginx_config.yml
三、Variables(变量)的使用
在 Ansible 中,变量是用来存储数据、配置设置以及控制 Playbook 执行流程的关键组成部分。理解变量的 作用域 和 优先级 对于编写高效、可维护的 Playbook 非常重要。Ansible 的变量作用域决定了变量的可见性和生命周期,而变量的优先级决定了在多个地方定义的同名变量时,哪个变量会被最终使用。
1、变量作用域
Ansible 中的变量作用域指的是变量在何处可见或可用。变量可以在不同的地方定义,并且这些定义会影响变量的作用域。
常见的变量作用域:
1. Playbook 变量(Playbook Variables):
- 直接在 Playbook 中定义的变量。
- 可在整个 Play 中使用,除非被其他变量覆盖。
示例:
– name: Install and configure Nginx
hosts: webservers
vars:
nginx_version: 1.18.0
tasks:
– name: Install Nginx
apt:
name: "nginx={{ nginx_version }}"
state: present
2. Inventory 变量(Inventory Variables):
- 可以在 inventory 文件中定义,通常用于为不同的主机或主机组指定特定的变量。
- 定义在 group_vars 或 host_vars 中。
示例:
# inventory.ini
[webservers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[webservers:vars]
nginx_version=1.18.0
3. Facts(自动收集的事实):
- Ansible 自动收集的关于主机的信息,例如主机名、操作系统、IP 地址等。
- 这些信息存储在变量中,并可在 Playbook 中使用。
示例:
– name: Gather facts about the system
hosts: all
tasks:
– debug:
msg: "The system's IP address is {{ ansible_default_ipv4.address }}"
4. 任务中的变量(Task Variables):
- 任务内定义的变量通常是临时的,仅在该任务内可用。
- 可以使用 set_fact 动态定义变量,这些变量在之后的任务中可用。
示例:
– name: Set a custom variable
set_fact:
custom_var: "Hello, Ansible"
5. Role 变量(Role Variables):
- 在角色(Role)中定义的变量,通常在 defaults 或 vars 目录中。变量作用域限制在角色内,除非在 Playbook 中明确覆盖。
示例:
# roles/nginx/defaults/main.yml
nginx_version: 1.18.0
6. Play 变量(Play Variables):
- 通过 vars 关键字在 Play 中定义的变量,作用范围限于当前的 Play。
示例:
– name: Install Apache
hosts: webservers
vars:
apache_version: 2.4
tasks:
– name: Install Apache
apt:
name: "apache2={{ apache_version }}"
state: present
2、变量优先级(Precedence)
当同一个变量在不同作用域中有不同的值时,Ansible 会根据变量的优先级来决定使用哪个值。优先级从低到高排序如下:
1. Role defaults(角色默认变量):
- 这些是角色中在 defaults/main.yml 中定义的变量。它们的优先级最低,通常用于提供默认值。
2. Inventory variables(清单变量):
- 包括 host_vars 和 group_vars 中定义的变量。如果有多个变量定义在同一主机组或者主机上,Ansible 会使用它们。
3. Playbook variables(Playbook 变量):
- 在 Playbook 中定义的变量,使用 vars 关键字时,优先级比清单中的变量高。
4. Host facts(主机事实):
- 由 gather_facts 收集的事实,它们的优先级高于 Playbook 和 Inventory 变量,但低于用户定义的变量。
5. Set facts(动态定义的变量):
- 通过 set_fact 定义的变量,它们的优先级比主机事实高。
6. Task variables(任务变量):
- 任务级别的变量优先级最高。
7. Extra vars(命令行传递的变量):
- 通过 -e 传递给 Ansible Playbook 的变量具有最高优先级。无论变量在 Playbook、Inventory 还是其他地方定义,它们都会被覆盖。
四、Templates与Jinja2模板语言
1、Templates介绍
在 Ansible 中,模板(Templates) 是通过 Jinja2 模板引擎动态生成配置文件、脚本等内容的一种方式。模板能够根据传入的变量或事实(facts)生成自定义内容,使得管理配置变得更加灵活和动态。它广泛应用于生成配置文件、动态构建内容并执行其他任务。
2、Jinja2 模板引擎简介
Jinja2 是一个现代化的模板引擎,允许将 Python 对象(如字典、列表和字符串)嵌入到模板中,然后渲染出最终内容。Ansible 利用 Jinja2 引擎来生成动态内容,它支持条件语句、循环、过滤器等。
在 Ansible 中,我们通常会使用 .j2 扩展名来表示模板文件。
3、使用模板的基本步骤
在 Ansible 中,使用模板通常包含以下几个步骤:
4、示例:配置Apache服务器
下面是一个完整的 Ansible Playbook 示例,展示如何使用模板来配置 Apache 服务器。此示例包括如何使用模板生成 Apache 的配置文件,以及如何安装和启动 Apache 服务。
1. 目录结构 假设我们有以下目录结构:
/my-ansible-playbook ├── apache_config.yml # 主 Playbook 文件 ├── templates │ └── apache.conf.j2 # Apache 配置模板 ├── vars │ └── apache_vars.yml # Apache 配置变量文件
2. 模板文件 templates/apache.conf.j2 这是一个 Jinja2 模板,用于动态生成 Apache 配置文件。在此模板中,{{ variable_name }} 将被传递给模板的变量替换。
<VirtualHost *:80>
ServerAdmin {{ server_admin }}
ServerName {{ domain_name }}
DocumentRoot {{ document_root }}
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "{{ document_root }}">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
3. 变量文件 vars/apache_vars.yml 在此文件中,我们定义了 Playbook 中将要使用的变量。可以根据不同环境来设置这些变量。
—
server_admin: "webmaster@{{ domain_name }}"
domain_name: "example.com"
document_root: "/var/www/html"
4. Playbook 文件 apache_config.yml 这是一个完整的 Ansible Playbook,用于安装 Apache、配置 Apache 和启动服务。
—
– name: Configure Apache Web Server
hosts: webservers
become: true # 使用 sudo 权限
vars_files:
– vars/apache_vars.yml # 引入配置变量文件
tasks:
# 安装 Apache 服务
– name: Install Apache
package:
name: apache2
state: present
notify:
– Restart Apache
# 配置 Apache,生成配置文件
– name: Generate Apache configuration file from template
template:
src: templates/apache.conf.j2 # 源模板文件
dest: /etc/apache2/sites-available/000-default.conf # 目标配置文件
notify:
– Restart Apache
# 启动 Apache 服务
– name: Ensure Apache is running and enabled
service:
name: apache2
state: started
enabled: yes
handlers:
# Apache 重启 Handler
– name: Restart Apache
service:
name: apache2
state: restarted
5. 解释安装 Apache
– name: Install Apache
package:
name: apache2
state: present
- package 模块用于安装 Apache 包,确保 Apache 已安装。
配置 Apache
– name: Generate Apache configuration file from template
template:
src: templates/apache.conf.j2
dest: /etc/apache2/sites-available/000-default.conf
- template 模块将 templates/apache.conf.j2 文件中的变量(如 domain_name 和 document_root)替换为实际值,并生成配置文件 /etc/apache2/sites-available/000-default.conf。
- 配置文件的生成会根据变量动态变化,因此不同的环境可以传递不同的变量文件(apache_vars.yml)。
启动和启用 Apache 服务
– name: Ensure Apache is running and enabled
service:
name: apache2
state: started
enabled: yes
- service 模块确保 Apache 服务已经启动并设置为开机自启。
Handlers
handlers:
– name: Restart Apache
service:
name: apache2
state: restarted
- handlers 用于在某些任务发生变化时自动触发。在此示例中,任何关于 Apache 配置的更改都会触发 Apache 重启。
6. 运行 Playbook 在终端中运行以下命令来执行 Playbook:
ansible-playbook apache_config.yml -i inventory.ini
其中,inventory.ini 文件中包含你想要配置 Apache 服务器的主机。
7. inventory.ini 示例
[webservers]
web1 ansible_host=192.168.1.100
web2 ansible_host=192.168.1.101
8. 最终效果 执行完上述 Playbook 后,您将在目标主机上完成以下操作:
- 安装 Apache 服务器。
- 根据传递的变量动态生成 /etc/apache2/sites-available/000-default.conf 配置文件。
- 启动 Apache 服务并确保它在系统启动时自启动。
💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Linux的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!





