Ansible自动化部署

发布于:2024-06-28 ⋅ 阅读:(138) ⋅ 点赞:(0)

AUTHOR:闫小雨
TIME:2024-06-26



一、Ansible简述

Ansible 是一个开源的自动化工具,用于配置管理、应用部署、任务自动化和 IT 编排。它通过无代理(agentless)的方式工作,使用 SSH 连接到目标主机执行命令,并通过简单的 YAML 格式的剧本(playbooks)来定义任务。

1、使用者的四种交互方式

交互方式 作用 特点
CMDB 存储和管理企业架构的配置信息 通过CMDB组合Ansible,下发指令调用Ansible工具
publie/private 通过API接口与Ansible交互 使用编程语言调用Ansible API(如python,php)
Ad_Hoc命令集 即时执行单次任务 通过命令行直接调用Ansible工具集,适用快速执行任务
playbooks 执行预先编排好的任务集 使用YAML格式编写playbooks,按序完成复杂任务

2、Ansible工具集

工具 描述
Ansible CLI 命令行工具
Ansible Playbooks 用YAML编写的自动化任务剧本
Ansible Modules 执行特定任务的功能模块
Ansible Galaxy 角色共享和发现平台
Ansible Tower(AWX) 企业级管理和可视化工具

3、作用对象

作用对象 描述
服务器 Linux和Windows服务器
云实例 AWS、Azure、阿里云、 Google Cloud
容器 Docker 和 Kubernetes
网络设备 路由器、交换机、防火墙
存储设备 NAS 和 SAN 系统
应用程序 Web 服务器、数据库、消息队列等
安全和合规性 安全策略和合规性检查

二、Ansible安装

1、使用yum安装,并安装EPEL仓库
# 安装 EPEL 仓库
sudo yum install epel-release -y

# 安装 Ansible
sudo yum install ansible -y

#验证安装 
ansible --version

2、使用pip源代码安装
#安装python pip
yum install python3 pythom3-pip -y

#下载安装源代码  码云gitee
git clone https://gitee.com/ansible/ansible.git
#或  github
#git clone https://github.com/ansible/ansible.git
#或  gitLub
#git clone https://gitlab.com/ansible/ansible.git

#安装依赖
cd ansible
pip install -r requirements.txt

#使用devel分支 进行版本选择
#切换到稳定的发布分支,这里以 3.5 版本为例
git checkout stable-3.5  

#安装 Ansible
pip install --user .

#验证安装
ansible --version

如果以上方法都不可行,可以尝试从一个已知的备份或镜像站点下载 Ansible 的压缩包
假设从清华大学镜像站下载:wget https://mirrors.tuna.tsinghua.edu.cn/ansible/stable-3.5/ansible-3.5.1.tar.gztar -zxvf ansible-3.5.1.tar.gz

3、使用pip直接安装
#安装python pip
yum install pythom3-pip -y

#安装 Ansible
pip install --user ansible

#验证安装
ansible --version

4、 创建ssh免交互登录

1、生成ssh密钥对

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

以下两个选项可以不用跟;
-b 4096:指定生成 RSA 密钥的位数为 4096 位,比默认的 2048 位更安全
-C "your_email@example.com":通过 -C 选项添加注释,一般标识这个密钥对的用途或所有者的电子邮件地址。

2、复制公钥到远程主机

ssh-copy-id user@hostname

将生成的公钥复制到远程主机的 ~/.ssh/authorized_keys文件中 , 需要输入远程主机的密码进行确认;
如果 ssh-copy-id 命令不可用,可以手动将公钥内容复制粘贴到远程主机的 ~/.ssh/authorized_keys 文件中 ;

3、验证免密登录

ssh user@hostname

三、Ansible配置

Inventory 文件

  • 作用:用于管理和描述要管理的主机和主机组。
  • 格式:文本文件,例如:
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com
db2.example.com

此处 [webservers] [databases] 是组名,下面列出的是具体的主机名或 IP 地址。可以根据需要组织和分组主机 ;

  • 分组:可以根据需要对主机进行组织和分组。

ansible.cfg 文件

  • 作用:Ansible 的配置文件,包含全局配置选项。
  • 示例
[defaults]
inventory = /path/to/your/inventory/file
remote_user = your_remote_user
private_key_file = /path/to/your/private/key.pem
host_key_checking = False

ansible.cfg 是 Ansible 的配置文件,可以包含全局配置选项,如默认的 Inventory 路径、SSH 连接设置、日志级别等

主要配置项

配置项 描述
inventory 指定 Inventory 文件的路径
remote_user 指定远程主机的用户名
private_key_file 指定用于 SSH 连接的私钥文件路径
host_key_checking 设置为 False 可以禁用 SSH 主机密钥检查,方便自动化环境下的连接

其他配置方式

1、环境变量
可以使用 ANSIBLE_CONFIG 环境变量指定 ansible.cfg 文件的路径。
2、命令行参数
使用 -i 参数指定特定的 Inventory 文件,使用 -u 参数指定远程用户等。
例如:

#使用 Ansible 运行一个 ping 模块(用于测试主机是否可达)来测试名为 web 的主机组中所有主机的连通性;
ansible -i /etc/ansible/hosts web -m ping

#如果使用默认的Inventory文件(/etc/ansible/hosts),也可以不指定Inventory文件
ansible web -m ping

四、Ansible命令

1、ansible

说明 ansible 命令是 Ansible 的主要命令行工具,用于执行 Ad-Hoc 命令和管理远程主机
描述 通过 SSH 连接到远程主机,并执行指定的命令或模块

使用模板

ansible <pattern> -i <inventory> -m <module> -a '<module_arguments>' [options]

可选项

选项 描述
-i 指定 Inventory 文件的路径
-m 指定要执行的 Ansible 模块
-a ‘<module_arguments>’ 模块的参数,使用单引号包裹参数
-u <remote_user> 指定远程主机的用户名
-b 在执行命令时提升为超级用户(sudo)
–private-key=<private_key_file> 指定用于 SSH 连接的私钥文件
-e ‘key=value’ 定义额外的变量,传递给 Ansible playbook

示例

ansible webservers -i /etc/ansible/hosts -m shell -a 'uptime'

解释:上面的命令将连接到名为 webservers 的主机组中的所有主机,执行 shell 模块并运行 uptime 命令,显示每台主机的运行时间。

2、Ansible-doc

说明 ansible-doc 命令用于查看 Ansible 模块的文档
描述 提供对 Ansible 模块、插件以及其他 Ansible 组件的文档查看功能

使用模板

ansible-doc <module_name>

可选项: 无。
示例

ansible-doc shell

解释:上述命令将显示 shell 模块的文档,包括该模块的用法、参数说明和示例。

3、Ansible-palybook

说明 ansible-playbook 命令用于运行 Ansible playbook
描述 执行预定义的任务集合,通常用于自动化部署和配置管理

使用模板

ansible-playbook -i <inventory> <playbook.yml> [options]

可选项

** 选项 ** ** 描述 **
** -i ** 指定 Inventory 文件的路径
** <playbook.yml> ** 指定要执行的 Ansible playbook 文件
** -u <remote_user> ** 指定远程主机的用户名
** -e ‘key=value’ ** 定义额外的变量,传递给 Ansible playbook
** --private-key=<private_key_file> ** 指定用于 SSH 连接的私钥文件

示例

ansible-playbook -i /etc/ansible/hosts site.yml

解释:上述命令将执行名为 site.yml 的 Ansible playbook,根据 hosts 文件中的配置管理远程主机。

4、Ansible-console

说明 ansible-console 命令启动 Ansible 控制台,提供交互式环境进行 Ansible 命令执行和调试
描述 在控制台中执行 Ad-Hoc 命令、查看主机状态和调试任务

使用模板

ansible-console -i <inventory> [options]

可选项和描述

选项 描述
-i 指定 Inventory 文件的路径
-u <remote_user> 指定远程主机的用户名
–private-key=<private_key_file> 指定用于 SSH 连接的私钥文件
-e ‘key=value’ 定义额外的变量,传递给 Ansible playbook

示例

ansible-console -i /etc/ansible/hosts

解释:上述命令将启动 Ansible 控制台,允许用户在交互式环境中执行 Ansible Ad-Hoc 命令和查看主机状态。

五、Ansible模块

1、command模块

描述: 在目标主机上执行特定的命令。
示例:

- name: Execute a command
  command: ls /path/to/directory    # 执行 ls 命令查看目录内容
可选项 描述
chdir 在执行命令前切换到的目录。
creates 如果文件已存在,则不执行命令。
warn 如果命令返回错误,是否警告而不是报错。

2、shell模块

描述: 在目标主机上以 shell 的方式执行命令。
示例:

- name: Execute a shell command
  shell: echo "Hello, World!"    # 执行 echo 命令输出文本
可选项 描述
executable 指定要使用的 shell 解释器。
creates 如果文件已存在,则不执行命令。
warn 如果命令返回错误,是否警告而不是报错。

3、copy模块

描述: 将本地文件或目录复制到目标主机。
示例:

- name: Copy a file
  copy:
    src: /path/to/local/file     # 本地文件路径
    dest: /path/on/remote/host   # 目标主机路径
可选项 描述
backup 是否备份目标文件。
force 是否强制覆盖目标文件。
owner 设置目标文件的所有者。

4、hostname模块

描述: 设置主机的主机名。
示例:

- name: Set hostname
  hostname:
    name: myserver.example.com    # 设置主机名为 myserver.example.com
可选项 描述
name 要设置的主机名。
use 指定要用于设置主机名的工具(仅限于 Linux)。

5、yum模块

描述: 在 CentOS/RHEL 等基于 yum 的系统上安装、删除和更新软件包。
示例:

- name: Install a package
  yum:
    name: httpd                  # 要安装的软件包名称
    state: present               # 确保软件包处于安装状态
可选项 描述
name 要操作的软件包名称。
state 软件包应该处于的状态(present、absent、latest 等)。
update_cache 是否更新缓存。

6、service模块

描述: 控制系统服务的状态(启动、停止、重启)。
示例:

- name: Restart a service
  service:
    name: httpd                  # 服务名称
    state: restarted             # 重启服务
可选项 描述
name 要操作的服务名称。
state 服务应该处于的状态(started、stopped、restarted 等)。

7、user模块

描述: 管理系统用户(创建、删除、修改)。
示例:

- name: Create a user
  user:
    name: johndoe                # 用户名
    state: present               # 确保用户存在
    groups: wheel                # 将用户添加到 wheel 组
可选项 描述
name 要操作的用户名。
state 用户应该处于的状态(present、absent 等)。
groups 将用户添加到的组。

六、Playbook配置文件

1、执行配置文件

说明

Ansible Playbook 是用 YAML 格式编写的自动化任务剧本,用于定义一系列任务和配置步骤,以实现系统配置、部署和管理。

描述

Playbook 文件通过定义任务(tasks)、变量(variables)、条件控制和处理机制来描述应用程序的自动化过程。

示例
---
- name: Install and configure Apache
  hosts: webservers
  become: yes
  tasks:
    - name: Install Apache
      yum:
        name: httpd
        state: present
      notify: 
        - start apache
    - name: Start Apache
      service:
        name: httpd
        state: started

  handlers:
    - name: start apache
      service:
        name: httpd
        state: started

解释

name:

  • Install and configure Apache:Playbook 的名称,用于描述该 Playbook 的主要任务。

hosts:

  • webservers:指定了在哪些主机上执行任务。在 Ansible 的 Inventory 文件中,通常会定义不同的主机组,这里的 webservers 可以是一个主机组的名称。

become:

  • yes:指定在执行任务时提升权限(类似于 sudo),以便安装软件和启动服务等需要特权的操作。

tasks:

  • 这部分定义了要执行的具体任务列表:
    • Install Apache:使用 yum 模块安装 httpd(Apache HTTP Server)。
      • name: httpd:指定要安装的软件包名称。
      • state: present:指定软件包应该处于的状态,这里是确保安装并存在。
      • notify:当安装成功后,会触发名为 start apache 的处理程序(handler)。
    • Start Apache:使用 service 模块启动 httpd 服务。
      • name: httpd:指定要操作的服务名称。
      • state: started:指定服务应该处于的状态,这里是启动状态。

handlers:

  • 这部分定义了处理程序(handlers),即在任务执行后触发的操作:
    • start apache:这是一个处理程序的名称。
      • service 模块用于启动 httpd 服务。
      • state: started:指定服务应该处于的状态,这里是启动状态。

运行playbooks
ansible-playbook -i /path/to/your/inventory apache.yml

2、触发器

说明

在 Ansible 中,触发器(handlers)用于在任务执行后根据需要触发额外的操作,例如重启服务或执行其他必要的配置更改。

描述

Handlers 被定义在 Playbook 文件的 handlers 部分,并通过 notify 关键字从任务中调用。

示例
---
- name: Install and configure Apache
  hosts: webservers
  become: yes
  tasks:
    - name: Install Apache
      yum:
        name: httpd
        state: present
      notify:
        - Restart Apache

  handlers:
    - name: Restart Apache
      service:
        name: httpd
        state: restarted

在上述示例中,Restart Apache 处理程序被定义为一个触发器。当 Install Apache 任务成功完成并且需要重启 Apache 服务时,Ansible 将调用 Restart Apache 处理程序来执行重启操作。

解释

回调函数

  • notify:当安装成功后,会触发名为 Restart Apache 的处理程序(handler)。

handlers:

  • 这部分定义了处理程序(handlers),即在任务执行后触发的操作:
    • Restart Apache:这是一个处理程序的名称。
      • service 模块用于管理系统服务。
      • name: httpd:指定要操作的服务名称。
      • state: restarted:指定服务应该处于的状态,这里是重启状态。

3、角色

说明

角色(Roles)是一种组织和复用 Ansible Playbook 的方法,可以将相关任务和文件结构化为可重复使用的单元。

描述

角色包含了一个或多个相关任务、变量、模板和文件,可以作为独立模块在不同的 Playbook 中引用和调用。

示例

角色的目录结构示例:

myrole/
├── tasks/
│   └── main.yml
├── handlers/
│   └── main.yml
├── templates/
├── files/
├── vars/
│   └── main.yml
├── defaults/
│   └── main.yml
├── meta/
│   └── main.yml
└── README.md

解释

tasks/main.yml:定义角色执行的主要任务。

  • handlers/main.yml:定义角色的处理程序。
  • templates/ 和 files/:存放模板和文件。
  • vars/ 和 defaults/:存放变量定义。
  • meta/main.yml:存放角色的元数据,如依赖和作者信息。

角色使得代码重用和管理变得更加简单和可维护,特别适用于复杂的自动化任务和部署流程。