Ansible 技术总结

Ansible 技术总结
Ansible 是一个开源的 IT 自动化工具,由 Michael DeHaan 于 2012 年发布。Ansible 通过简单的配置文件和模块化的方法,实现了配置管理、应用部署、任务自动化和 IT 编排等功能。它以其简洁易用、无代理(agentless)和扩展性强的特点,受到了广泛的关注和应用。以下是对 Ansible 技术的详细总结,包括其历史、特点、核心概念、常用模块、实际应用中的经验和技巧。

一、Ansible 简介

  1. 历史背景
    Ansible 由 Michael DeHaan 于 2012 年发布,并迅速成为 DevOps 工具链中的重要成员。2015 年,Red Hat 收购了 Ansible,并将其纳入其产品组合。Ansible 通过 YAML 格式的配置文件和模块化的设计,实现了简单、可重复的自动化任务。

  2. 设计理念
    Ansible 的设计理念包括:

简洁易用:使用 YAML 格式的配置文件,语法简单易读。
无代理(agentless):通过 SSH 连接到目标主机,不需要在目标主机上安装代理。
模块化:通过模块实现功能扩展,支持多种操作系统和应用程序。
可重复性:通过配置文件定义状态,实现可重复的自动化任务。
扩展性强:支持自定义模块和插件,满足不同的自动化需求。
二、Ansible 的特点

  1. 简洁易用
    Ansible 使用 YAML 格式的配置文件,语法简单易读,便于编写和维护。Ansible 的命令行工具也非常直观,适合快速上手。

  2. 无代理(agentless)
    Ansible 通过 SSH 连接到目标主机,不需要在目标主机上安装代理。这种无代理的设计简化了部署和维护工作,减少了系统资源的消耗。

  3. 模块化
    Ansible 的功能通过模块实现,模块是执行具体任务的基本单元。Ansible 提供了丰富的内置模块,涵盖了系统管理、网络配置、应用部署等多个领域。用户还可以编写自定义模块,扩展 Ansible 的功能。

  4. 可重复性
    Ansible 通过配置文件定义目标状态,而不是逐步执行命令。每次执行时,Ansible 会检查目标主机的状态,并根据配置文件进行必要的更改。这种方式确保了任务的可重复性和一致性。

  5. 扩展性强
    Ansible 支持自定义模块和插件,满足不同的自动化需求。用户可以编写自定义模块、插件、回调插件等,扩展 Ansible 的功能。

三、Ansible 的核心概念

  1. 控制节点和受管节点
    控制节点:运行 Ansible 命令和剧本的主机,通常是管理员的工作站或 CI/CD 服务器。
    受管节点:被 Ansible 管理的目标主机,通过 SSH 与控制节点通信。
  2. 清单文件(Inventory)
    清单文件定义了受管节点的信息,包括主机名、IP 地址、分组等。清单文件可以是静态文件(如 INI 或 YAML 格式)或动态清单脚本。

示例(INI 格式):

Ini

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com
3. 模块(Module)
模块是 Ansible 执行具体任务的基本单元。Ansible 提供了丰富的内置模块,涵盖了系统管理、网络配置、应用部署等多个领域。用户还可以编写自定义模块。

示例(ping 模块):

Yaml

  • name: Ping all hosts
    hosts: all
    tasks:
    • name: Ping the target
      ping:
  1. 剧本(Playbook)
    剧本是 Ansible 的配置文件,使用 YAML 格式定义。剧本包含一个或多个剧本块(Play),每个剧本块定义了受管节点、任务列表等信息。

示例(简单剧本):

Yaml

  • name: Deploy web application
    hosts: webservers
    tasks:
    • name: Install Nginx
      apt:
      name: nginx
      state: present

    • name: Start Nginx service
      service:
      name: nginx
      state: started

  1. 角色(Role)
    角色是组织和重用剧本和相关文件的方法。角色可以包含任务、变量、文件、模板等,便于模块化和复用。

示例(角色目录结构):

roles/
webserver/
tasks/
main.yml
files/
index.html
templates/
nginx.conf.j2
vars/
main.yml
6. 变量和模板
变量:在剧本中定义和使用的动态值,可以在清单文件、剧本、角色等中定义。
模板:使用 Jinja2 模板引擎生成配置文件或其他文本文件,可以在剧本中渲染模板。
示例(使用变量和模板):

Yaml

  • name: Configure web server
    hosts: webservers
    vars:
    server_name: “www.example.com”
    tasks:
    • name: Deploy Nginx configuration
      template:
      src: nginx.conf.j2
      dest: /etc/nginx/nginx.conf
      模板文件(nginx.conf.j2):

Nginx

server {
listen 80;
server_name {{ server_name }};
location / {
root /var/www/html;
index index.html;
}
}
四、Ansible 常用模块

  1. 系统管理模块
    ping:测试与受管节点的连接

Yaml

  • name: Ping all hosts
    hosts: all
    tasks:
    • name: Ping the target
      ping:
      user:管理用户账户

Yaml

  • name: Create a new user
    user:
    name: johndoe
    state: present
    groups: sudo
    group:管理用户组

Yaml

  • name: Create a new group
    group:
    name: developers
    state: present
    service:管理系统服务

Yaml

  • name: Start Nginx service
    service:
    name: nginx
    state: started
    package:管理软件包

Yaml

  • name: Install Nginx
    package:
    name: nginx
    state: present
  1. 文件管理模块
    copy:复制文件到受管节点

Yaml

  • name: Copy index.html to web server
    copy:
    src: files/index.html
    dest: /var/www/html/index.html
    template:使用模板生成文件

Yaml

  • name: Deploy Nginx configuration
    template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    file:管理文件和目录的属性

Yaml

  • name: Set permissions on /var/www/html
    file:
    path: /var/www/html
    owner: www-data
    group: www-data
    mode: ‘0755’
    fetch:从受管节点拉取文件到控制节点

Yaml

  • name: Fetch log file from web server
    fetch:
    src: /var/log/nginx/access.log
    dest: logs/webserver/
    flat: yes
  1. 网络管理模块
    uri:执行 HTTP 请求

Yaml

  • name: Check the status of a web page
    uri:
    url: http://www.example.com
    return_content: yes
    firewalld:管理 Firewalld 服务

Yaml

  • name: Open HTTP port in Firewalld
    firewalld:
    port: 80/tcp
    permanent: yes
    state: enabled
    immediate: yes
    iptables:管理 iptables 规则

Yaml

  • name: Add iptables rule to allow HTTP traffic
    iptables:
    chain: INPUT
    protocol: tcp
    destination_port: 80
    jump: ACCEPT
  1. 数据库管理模块
    mysql_db:管理 MySQL 数据库

Yaml

  • name: Create a new MySQL database
    mysql_db:
    name: mydatabase
    state: present
    mysql_user:管理 MySQL 用户

Yaml

  • name: Create a new MySQL user
    mysql_user:
    name: myuser
    password: mypassword
    priv: ‘mydatabase.*:ALL’
    state: present
    postgresql_db:管理 PostgreSQL 数据库

Yaml

  • name: Create a new PostgreSQL database
    postgresql_db:
    name: mydatabase
    state: present
    postgresql_user:管理 PostgreSQL 用户

Yaml

  • name: Create a new PostgreSQL user
    postgresql_user:
    name: myuser
    password: mypassword
    db: mydatabase
    priv: ‘ALL’
    state: present
    五、实际应用中的经验和技巧
  1. 组织剧本和角色
    使用角色组织任务

将相关任务组织到角色中,便于模块化和复用。
使用清单文件分组受管节点

使用清单文件分组受管节点,根据不同的角色和应用场景定义不同的组。
使用变量和模板

使用变量和模板生成动态配置文件,提高剧本的灵活性。
2. 错误处理和调试
使用 -v 选项增加调试信息

使用 -v、-vv、-vvv 或 -vvvv 选项运行 Ansible 命令,增加调试信息,便于排查问题。
使用 ignore_errors 忽略错误

在任务中使用 ignore_errors: yes 忽略特定错误,避免任务中断。
使用 failed_when 自定义失败条件

在任务中使用 failed_when 自定义失败条件,提高错误处理的灵活性。
3. 性能优化
使用批量执行

使用 -f 选项设置并行执行的批量大小,提高任务执行效率。
使用 SSH 连接复用

在 ansible.cfg 配置文件中启用 SSH 连接复用,减少 SSH 建立连接的开销。
Ini

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s
使用 async 和 poll 异步执行任务

在任务中使用 async 和 poll 参数异步执行任务,提高长时间运行任务的并发性。
Yaml

  • name: Run long-running task
    shell: /path/to/long_running_task.sh
    async: 3600
    poll: 0

  • name: Wait for long-running task to complete
    async_status:
    jid: “{{ ansible_job_id }}”
    register: job_result
    until: job_result.finished
    retries: 60
    delay: 30

  1. 安全和权限管理
    使用 SSH 密钥认证

使用 SSH 密钥对认证,避免在清单文件或剧本中存储明文密码。
使用 become 提升权限

在任务中使用 become 参数提升权限,执行需要管理员权限的操作。
Yaml

  • name: Install Nginx
    package:
    name: nginx
    state: present
    become: yes
    使用 ansible-vault 加密敏感数据

使用 ansible-vault 加密敏感数据,如密码、密钥等,确保数据安全。
Bash

ansible-vault encrypt secrets.yml
ansible-vault decrypt secrets.yml
ansible-vault edit secrets.yml
六、Ansible 常用命令
执行单个模块

Bash

ansible all -m ping -i hosts
运行剧本

Bash

ansible-playbook site.yml -i hosts
加密和解密文件

Bash

ansible-vault encrypt secrets.yml
ansible-vault decrypt secrets.yml
测试剧本语法

Bash

ansible-playbook --syntax-check site.yml
列出受管节点信息

Bash

ansible all -m setup -i hosts
调试剧本

Bash

ansible-playbook site.yml -i hosts -vvv
总结
Ansible 是一个强大、简洁、扩展性强的 IT 自动化工具,通过简单的配置文件和模块化的方法,实现了配置管理、应用部署、任务自动化和 IT 编排等功能。通过掌握 Ansible 的核心概念、常用模块和实际应用中的经验和技巧,开发人员和系统管理员可以高效地编写和维护自动化任务,提高工作效率和系统一致性。希望这些信息能帮助你更好地理解和使用 Ansible。如果你有任何疑问或需要进一步的帮助,请告诉我,我可以提供更多具体的指导和建议。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术学习分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值