【运维】自动化运维工具,使用 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包管理器介绍
- 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
- MacPorts
MacPorts 是另一个流行的包管理器,也用于安装开源软件。它类似于 Homebrew,但有自己的一套包和配置系统。
安装 MacPorts
1、安装 Xcode 和 Xcode 命令行工具。
2、下载并安装 MacPorts,安装包 可在其官网找到。
使用 MacPortssudo port install wget sudo port upgrade outdated sudo port uninstall wget
- Fink
Fink 项目旨在将 Unix 软件移植到 macOS 上,通过dpkg
和APT
(原本用于 Debian 系统)来管理软件包。
1、安装 Xcode 和 Xcode 命令行工具。
2、安装 Fink,安装包 可以在其官网找到。
使用 Finkfink selfupdate fink install wget fink remove wget
Windows包管理器介绍
- 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
- 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
- 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系统的包管理器因具体发行版不同而有所不同。
- Debian 和基于 Debian 的发行版 (如 Ubuntu)
- 包管理器: APT (Advanced Package Tool)
- 主要命令:
apt-get
,apt
,dpkg
sudo apt update # 更新包列表 sudo apt install package-name # 安装包 sudo apt remove package-name # 删除包
- 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:适用于需要高效管理和部署容器化应用的开发和运维团队。
特性 | OpenStack | Kubernetes |
---|---|---|
主要用途 | 虚拟化管理和云基础设施 | 容器化应用的编排和管理 |
核心组件 | Nova、Neutron、Cinder、Swift、Keystone、Horizon | Pod、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