当前位置: 首页 > article >正文

【运维】自动化运维工具,使用 Ansible 进行开发环境配置管理(本地/远程,brew/scoop/yum,docker/packer/openstack)

【运维】自动化运维工具,使用 Ansible 进行开发环境配置管理(本地/远程,brew/scoop/yum,docker/packer/openstack)

文章目录

    • 1、什么是 Ansible,如何安装
    • 2、使用 ansible 自动配置本地开发环境(个人Dev环境)
    • 3、使用 ansible 自动配置远程开发环境(报错和解决方案)
    • 4、搭配包管理器使用(homebrew/macports/flink, choco/scoop/winget,apt/yum/dnf)
    • 5、搭配构建工具使用(packer, docker,openstack/k8s)

1、什么是 Ansible,如何安装

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务ansible.yaml, 最后等待执行返回的结果。

官方地址:github-62k-star, 2-提问, 3-教程

ansible 是什么?

  • ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  • ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
  • ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。 ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
  • ansible 特点
    部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;默认使用SSH协议对设备进行管理;
    有大量常规运维操作模块,可实现日常绝大部分操作
    配置简单、功能强大、扩展性强;
    支持API及自定义模块,可通过Python轻松扩展;
    通过Playbooks来定制强大的配置、状态管理
    轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
    提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

ansible 架构图

  • 模块介绍
    Ansible:Ansible核心程序。
    HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
    Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
    CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
    CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
    ConnectionPlugins:连接插件,Ansible和Host通信使用
    在这里插入图片描述

  • Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
    ad-hoc模式(点对点模式):使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
    playbook模式(剧本模式):是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等
    可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
    在这里插入图片描述

ansible安装

  • 命令
    pip3 install ansible
    

2、使用 ansible 自动配置本地开发环境(个人Dev环境)

这个板块占坑待填,先大概随便放点,后面折腾完了看情况更新

参考资料:1, 2, 3, 1 , 2, 3

使用 ansible 自动配置本地开发环境
比如在本机安装git, mysql, vim, 之类的工具,配置一些环境变量,创建特定的项目目录对项目进行分类(空文件夹)
ansible-playbook playbook.yml

---
- name: Setup local development environment
  hosts: localhost
  become: true

  tasks:
    - name: Install git
      apt:
        name: git
        state: present
        update_cache: yes

    - name: Install mysql-server
      apt:
        name: mysql-server
        state: present

    - name: Install vim
      apt:
        name: vim
        state: present

    - name: Create project directories
      file:
        path: "{{ item }}"
        state: directory
        mode: '0755'
      loop:
        - ~/projects
        - ~/projects/projectA
        - ~/projects/projectB

    - name: Set environment variables
      lineinfile:
        path: /home/{{ ansible_user }}/.bashrc
        line: 'export {{ item.name }}={{ item.value }}'
        create: yes
      loop:
        - { name: 'MY_VAR1', value: 'value1' }
        - { name: 'MY_VAR2', value: 'value2' }

    - name: Apply changes to bashrc
      shell: source /home/{{ ansible_user }}/.bashrc
      args:
        executable: /bin/bash

3、使用 ansible 自动配置远程开发环境(报错和解决方案)

主要是报错和解决方案

连接windows报错 Ansible “Failed to create temporary directory” Error with Windows using SSH

  • This error happens because Ansible needs a temp directory when connecting with SSH. The default location is “/tmp” which makes Windows a sad panda.
    You’ll need to create c:\temp on the windows host and add a few vars to your inventory file on the ansible server. The default location is /etc/ansible/hosts
  • 参考资料:1, 2

远程安装命令

# 验证连通性, 注意指定inventory文件的目录
ansible windows -m win_ping -u admin -k 
ansible windows -m win_ping -u Administrator --private-key /root/.ssh/id_rsa -i inventory
192.168.31.1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

# 安装命令, -vvv是打印日志
ansible-playbook -i /xxx/inventory /xxx/ansible.yaml -vvv

# 临时指定cfg文件(不用)
ANSIBLE_CONFIG=/xxx/ansible.cfg

解决方案:

# inventory文件
[windows]
192.168.31.xx

[windows:vars]
ansible_user=Administrator
ansible_port=22
ansible_connection=ssh # 指定使用ssh
ansible_ssh_private_key_file=/root/.ssh/id_rsa # 秘钥方式的ssh

remote_tmp = c:\tmp # 提前建好
become_method = runas # 在win上提上权限
ansible_shell_type = cmd # 使用cmd运行,重要
shell_type = cmd

# ansible.yaml
---
- name: Install XXX
  hosts: windows   # inventory文件的主机
  become: yes      # 权限提升
  become_method: runas  # 权限提升
  become_user: Administrator  # 权限提升
  tasks:
    - name: Install Git
      win_chocolatey:
        name: git
        state: present

# ansible.cfg文件(可以不用配)
[defaults]
inventory = /root/inventory
remote_tmp = C:\tmp

4、搭配包管理器使用(homebrew/macports/flink, choco/scoop/winget,apt/yum/dnf)

包管理器介绍

  • Macos: homebrew(最流行)、macports,flink
  • Windows: choco(开源),scoop(开源),winget(官方)
  • Linux: apt(debian, ununtu),yum(RHEL, CentOS, Fedora, Rocky),dnf(增强版yum)
  • Python:pip(官方),conda(数据科学,注意conda软件开源但镜像源有商用版权)
  • JavaScript:npm(官方),yarn(由facebook开源并维护,有更好的安装和离线支持)

macos包管理器介绍

  1. Homebrew
    Homebrew 是 macOS 上最流行的包管理器,广泛用于安装和管理各种命令行工具和软件。
    # 安装
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
    # 使用
    brew install wget
    brew upgrade wget
    brew uninstall wget
    
  2. MacPorts
    MacPorts 是另一个流行的包管理器,也用于安装开源软件。它类似于 Homebrew,但有自己的一套包和配置系统。
    安装 MacPorts
    1、安装 Xcode 和 Xcode 命令行工具。
    2、下载并安装 MacPorts,安装包 可在其官网找到。
    使用 MacPorts
    sudo port install wget
    sudo port upgrade outdated
    sudo port uninstall wget
    
  3. Fink
    Fink 项目旨在将 Unix 软件移植到 macOS 上,通过 dpkgAPT(原本用于 Debian 系统)来管理软件包。
    1、安装 Xcode 和 Xcode 命令行工具。
    2、安装 Fink,安装包 可以在其官网找到。
    使用 Fink
    fink selfupdate
    fink install wget
    fink remove wget
    

Windows包管理器介绍

  1. Chocolatey(10k star)
    Chocolatey 是一个基于 NuGet 技术的开源包管理器,专为 Windows 环境设计, 适合需要管理复杂依赖关系的软件环境
    1, 2, 3, github
    # 安装 Chocolatey
    Set-ExecutionPolicy Bypass -Scope Process -Force; `
    [System.Net.ServicePointManager]::SecurityProtocol = `
    [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
    iex ((New-Object System.Net.WebClient).DownloadString(`
    'https://community.chocolatey.org/install.ps1'))
    
    # 使用 Chocolatey
    choco install git
    choco upgrade git
    choco uninstall git
    
  2. Scoop(30k star)
    Scoop 是一个简洁的命令行包管理器,主要用于开发工具和命令行应用程序, 更适合开发者,提供了一种简洁的安装方式
    1, 2, 3
    # 安装
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    iwr -useb get.scoop.sh | iex
    
    # 使用
    scoop install curl
    scoop update curl
    scoop uninstall curl
    
  3. Winget (Windows Package Manager)
    Winget 是由微软官方提供的包管理器,默认在 Windows 10 和 Windows 11 中可用。由微软官方提供,集成度高,适合普通用户和开发者。
    在命令提示符或 PowerShell 中使用 Winget 安装包(例如 notepad++):
    # 使用
    winget install --id Notepad++.Notepad++
    winget upgrade --id Notepad++.Notepad++
    winget uninstall --id Notepad++.Notepad++
    
    # 搜索
    winget search notepad++
    

Linux系统的包管理器因具体发行版不同而有所不同。

  1. Debian 和基于 Debian 的发行版 (如 Ubuntu)
    • 包管理器: APT (Advanced Package Tool)
    • 主要命令: apt-get, apt, dpkg
    sudo apt update    # 更新包列表
    sudo apt install package-name    # 安装包
    sudo apt remove package-name    # 删除包
    
  2. Red Hat Enterprise Linux (RHEL) 和基于 RHEL 的发行版 (如 CentOS, Fedora, Rocky)
    • 包管理器: YUM (Yellowdog Updater, Modified) 和 DNF (Dandified YUM,主要用于 Fedora 和较新的 RHEL/CentOS)
    • 主要命令: yum, dnf, rpm
    sudo yum update    # 更新包列表 (RHEL 6, CentOS 6 等)
    sudo yum install package-name    # 安装包
    sudo dnf update    # 更新包列表 (Fedora, RHEL 8, CentOS 8 等)
    sudo dnf install package-name    # 安装包
    

5、搭配构建工具使用(packer, docker,openstack/k8s)

  • IaaS(基础设施即服务)
    OpenStack: 提供了一整套管理计算、存储和网络资源的服务,被广泛用于构建和管理私有云、公有云和混合云。提供和管理虚拟机和裸金属服务器,实现自动化部署和管理基础设施资源。
    KVM:一种开源的虚拟化技术,被嵌入在 Linux 内核中,与 QEMU 和 libvirt 等工具一起使用,可以实现虚拟机的高效管理和支持多种操作系统。提供底层虚拟化支持,将物理计算资源虚拟化为多个虚拟机。
  • PaaS(平台即服务)/CaaS(容器即服务)
    Kubernetes (K8s) 一个开源的容器编排平台,自动化容器化应用的部署、扩展和管理,为开发者和运营团队提供了应用的可移植性和简化的管理能力。管理容器、自动伸缩、服务发现、负载均衡、滚动更新和回滚等。
  • DevOps 工具:
    Packer 用于创建一致的、可复用的虚拟机和容器镜像的开源工具,支持各种平台和环境。自动化创建虚拟机镜像(如 AWS AMI、Docker 镜像等),支持多平台构建,有助于实现持续集成和部署(CI/CD)流程。

配合packer使用

  • packer官方有支持ansible的插件
  • 参考资料:1,2,
# 本地安装
packer plugins install github.com/hashicorp/ansible

# packer配置文件引用(xxx.pkr.hcl)
packer {
  required_plugins {
    ansible = {
      version = "~> 1"
      source = "github.com/hashicorp/ansible"
    }
  }
}

# packer配置文件使用
provisioner "ansible" {
    playbook_file   = "ansible.yaml"
    user            = "root"
    use_proxy       = false
    inventory_file  = "/xxx/inventory"
    extra_arguments = [
        "--ssh-extra-args",
        "-o IdentitiesOnly=yes",
        "-e",
        "ansible_ssh_private_key_file=${var.ssh_private_key_file}"
    ]
}

配合docker使用

  • 近年来Linux容器技术越来越受欢迎,通过容器技术,可以保持程序运行环境的一致性,快速启动并高效率运行,涉及到的开销也比较小,此外,在系统层次上完成容器级别的资源隔离非常快速。

  • Ansible为Docker提供了一整套工具,包括相关模块、连接插件(ansible_connection: docker)和inventory脚本,因此Ansible可在许多方面与Docker进行交互。例如Ansible可构建Docker镜像、启动或停止容器、组合多个容器服务、连接到活动容器并与之交互,甚至可以从容器中获取inventory。

  • 参考资料:1

  • 要使用Ansible管理连接Docker,要求安装如下包(注意:Ansible端和docker端都安装,这一点和其它模块不一样,如报错,请自行在两端安装、卸载、升级调试):

    # 两端都安装,如果已经安装了,则在报错的情况下按需更新
    # 此外,根据Ansible使用的python解释器版本,按需决定使用pip还是pip3,
    # 如果需要的是pip,则yum install python-pip
    $ pip3 install docker requests
    
  • 一般都是在已有镜像的基础上通过Dockerfile来定义新的操作,然后构建出自己的Docker镜像。
    所以需要提供两个文件:一个基础镜像和一个Dockerfile文件(基础镜像不存在时会自动下载)。
    如果使用Ansible来构建镜像,那么这个Dockerfile文件需要能够被Ansible读取,比如可以放在Ansible playbook文件的同目录下。

  • 演示以下Ansible构建Docker镜像,此处已经写好了一个非常简单的Dockerfile,该Docker镜像是在CentOS 7镜像的基础上添加nginx,然后让nginx运行起来并提供cowsay页面

    FROM centos:centos7
    LABEL maintainer="junmajinlong.com"
    
    RUN rm -rf /etc/yum.repos.d/*.repo && \
        echo -e ' \
    [base] \n\
    name=os \n\
    baseurl=https://mirrors.huaweicloud.com/centos/$releasever/os/$basearch/ \n\
    enable=1 \n\
    gpgcheck=0 \n\
    [epel] \n\
    name=epel \n\
    baseurl=https://mirrors.huaweicloud.com/epel/7Server/$basearch/ \n\
    enable=1 \n\
    gpgcheck=0 \n\
    ' >/etc/yum.repos.d/base.repo && \
        yum -y install cowsay nginx && \
        rm -rf /usr/share/nginx/html/index.html && \
        cowsay Junmajinlong >/usr/share/nginx/html/index.html && \
        echo 'daemon off;' >>/etc/nginx/nginx.conf && \
        yum clean all
        
    EXPOSE 80
    
    CMD /usr/sbin/nginx
    
  • 然后写一个Ansible任务文件,假设名为build_and_run_image.yaml,内容如下:

    - hosts: docker
    gather_facts: no
    tasks: 
        - name: scp Dockerfile
        copy: 
            src: Dockerfile
            dest: /tmp/Dockerfile
    
        - name: build Docker image centos_nginx:v0.1.1
        docker_image: 
            name: centos_nginx
            source: build
            tag: v0.1.1
            build:
            path: /tmp
            pull: yes
        - name: start centos_nginx
        docker_container: 
            name: cng
            image: centos_nginx:v0.1.1
            ports: 8080:80
            state: started
    
  • Ansible执行完成上述任务后,可直接在Ansible端使用curl来测试页面.
    构建镜像完成后,可使用docker_container模块启动该镜像。
    该模块指令非常非常多,几乎包含了docker container命令的所有选项功能,但是熟悉docker命令,这些指令的用法也通俗易懂。
    在上面的playbook中明确使用了Dockerfile来构建镜像并启动镜像提供服务,但因为Dockerfile自身也是基于基础镜像构建的,所以可以省略这个构建过程,而是直接启动基础镜像并连接到启动的容器进行操作。
    下面实现与上述示例相同的效果,只是不使用Dockerfile构建。

OpenStack/k8s

  • OpenStack可整合一台或多台物理计算机的资源来按需创建、管理、配置、删除虚拟机,对OpenStack提供者来说,提高了硬件资源的利用率;对受益用户来说,可按自己的需求申请带有各种性能、各种资源配置的操作系统,比如公有云的模式,就像去网吧上网一样,想上多久、想体验什么配置的主机都按需付费来享用。

  • OpenStack vs Kubernetes
    (引用1, 2 3)
    OpenStack:适用于需要构建和管理大型云基础设施的企业和服务提供商。
    Kubernetes:适用于需要高效管理和部署容器化应用的开发和运维团队。

特性OpenStackKubernetes
主要用途虚拟化管理和云基础设施容器化应用的编排和管理
核心组件Nova、Neutron、Cinder、Swift、Keystone、HorizonPod、Service、Deployment、StatefulSet
优势高度可扩展、模块化设计、社区支持自动化部署与管理、跨环境支持、丰富生态系统
限制部署和维护复杂、硬件要求较高学习曲线陡峭、集群管理复杂
应用场景私有云、公有云、虚拟机生命周期管理微服务架构、容器化应用部署自动化
  • Ansible + OpenStack
    使用 Ansible 来安装和配置 OpenStack 组件,如 Nova(计算服务)、Neutron(网络服务)、Cinder(存储服务)、Keystone(身份服务)等。
    使用 Ansible 自动化 OpenStack 云基础设施的部署和管理。实现应用在 OpenStack 上的持续集成和持续部署(CI/CD)。

    # Install and configure OpenStack components
    - name: Install OpenStack Nova
    hosts: openstack-controllers
    tasks:
        - name: Install Nova packages
        apt:
            name: nova
            state: present
    
        - name: Configure Nova
        template:
            src: nova.conf.j2
            dest: /etc/nova/nova.conf
    
    # Provision resources in OpenStack
    - name: Provision OpenStack resources
    hosts: localhost
    tasks:
        - name: Create a new network
        os_network:
            cloud: mycloud
            state: present
            name: mynetwork
        
        - name: Launch an instance
        os_server:
            cloud: mycloud
            state: present
            name: myinstance
            flavor: m1.small
            image: Ubuntu-20.04
            network: mynetwork
    
  • Ansible + Kubernetes
    利用 Ansible 自动化 Kubernetes 集群的部署和日常运维管理。
    使用 Ansible 管理 Kubernetes 应用的部署、更新和监控。

    # Install Kubernetes cluster
    - name: Install Kubernetes on master nodes
    hosts: k8s-masters
    tasks:
        - name: Install kubeadm, kubelet, kubectl
        apt:
            name: "{{ item }}"
            state: present
        with_items:
            - kubeadm
            - kubelet
            - kubectl
            - containerd
    
        - name: Initialize Kubernetes master
        shell: kubeadm init --pod-network-cidr=10.244.0.0/16
    
        - name: Configure kubectl for admin user
        shell: |
            mkdir -p $HOME/.kube
            cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
            chown $(id -u):$(id -g) $HOME/.kube/config
    
    # Deploy a Pod network
    - name: Deploy Pod network
    hosts: k8s-masters
    tasks:
        - name: Apply Flannel network
        shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    

http://www.kler.cn/a/304180.html

相关文章:

  • LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)
  • Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
  • 【MySQL】数据库知识突破:数据类型全解析与详解
  • 鸿蒙华为商城APP案例
  • 【论文阅读】利用SEM二维图像表征黏土矿物三维结构
  • 使用Git工具在GitHub的仓库中上传文件夹(超详细)
  • 【Hot100】LeetCode—75. 颜色分类
  • 算法基础-扩展欧几里得算法
  • Python知识点:如何使用Python进行Excel文件操作(OpenPyXL、Pandas)
  • 源码到class字节码的编译流程 字节码到内存的Java类加载流程
  • 【一分钟学C++】std::memory_order
  • Vue3+Django5+REST Framework开发电脑管理系统
  • 【计算机网络 - 基础问题】每日 3 题(一)
  • 程序的结构和控制流与数据流
  • MySQL 表的增删改查
  • 注解(Java程序的一种特殊“注释”,用于工具处理的标注)
  • 每日一问:C++ 中重写和重载的区别
  • vue3 5个常用的API
  • SpringBoot开发——整合Spring Data MongoDB
  • [数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别
  • 凸优化学习(2)——梯度类方法求解(gradient descent)
  • 构建有温度的用户关系:开源 AI 智能名片、链动 2+1 模式与 S2B2C 商城小程序的作用
  • 华为SMU02B1管理模块WEB登录与账户密码信息
  • HTB-Archetype(winPEAS枚举工具,mssql xp_cmdshell)
  • Linux - make/Makefile工具的基础使用
  • Java的发展史与前景