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
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"
2、复制公钥到远程主机
ssh-copy-id user@hostname
3、验证免密登录
ssh user@hostname
三、Ansible配置
Inventory 文件
- 作用:用于管理和描述要管理的主机和主机组。
- 格式:文本文件,例如:
[webservers]
web1.example.com
web2.example.com
[databases]
db1.example.com
db2.example.com
- 分组:可以根据需要对主机进行组织和分组。
 
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
主要配置项:
| 配置项 | 描述 | 
|---|---|
| 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
解释
运行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
解释
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
解释
角色使得代码重用和管理变得更加简单和可维护,特别适用于复杂的自动化任务和部署流程。










