• Ansible自动化部署



    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 '' [options]
    

    可选项

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

    可选项和描述

    选项描述
    -i 指定 Inventory 文件的路径
    -u 指定远程主机的用户名
    –private-key=指定用于 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:存放角色的元数据,如依赖和作者信息。

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

  • 相关阅读:
    瑞吉外卖 —— 12、项目优化:主从复制、读写分离
    flink 处理IOT数据
    Kubernetes在rancher中自定义应用商店
    大数据笔记-NIFI(第一篇)
    智慧食堂这个技术,有点秀
    G1 GC核心原理、执行流程
    《016.SpringBoot+vue校园社团管理系统》【有文档】
    CentOS7.9 搭建内部yum源服务器同步阿里yum源
    Linux:C_单机五子棋
    scratch猫捉老鼠 电子学会图形化编程scratch等级考试一级真题和答案解析2022年9月
  • 原文地址:https://blog.csdn.net/qq_63538243/article/details/140001928