通过 ansible 创建 openstack 虚拟机并部署应用(实战篇)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 前文 通过 ansible 创建 openstack 虚拟机并部署应用(配置篇) 接下来我们实战一下。 目录结构 ── ansible.cfg├── group_vars│ ├── all.yml├── openstack.

前文 通过 ansible 创建 openstack 虚拟机并部署应用(配置篇)

接下来我们实战一下。

目录结构

── ansible.cfg
├── group_vars
│ ├── all.yml
├── openstack.py
├── README.md
├── roles
│ ├── newtouch.MySQL
│ ├── newtouch.SystemConfig
│ ├── newtouch.UpdateRootPass
│ └── openstack.CreateServer
├── setup_mysql.yml

group_vars/all.yml 里需要设置

ansible_user: root
ansible_ssh_pass: xxxxxxxxxxx

前提是 openstack 集群里的虚拟机镜像,root 密码相同。

默认值配置文件 roles/openstack.CreateServer/defaults/main.yml

role 的默认值,根据实际情况,填入相关信息。以 vm_ 开头的变量是为了测试用,预设的。

auth:
  auth_url: http://192.168.205.2:5000/v2.0
  username: admin
  password: xxxxxxxxxxxxxxxxxx
  project_name: Haibin_Lee

# image_id
ubuntu_14_disk_50_v2: 5c67bf65-f699-49e8-955a-72152fb690f4
centos7_50_v2: f9391999-373b-4f0d-9c76-07c19e4e86e5

flavor:
  - {name: 1CPU_1G, id: e3aff42c-f260-4dea-ada5-1241b5853652}
  - {name: 2CPU_4G, id: 45b099ac-4ae4-4526-a6e2-f34cc2934e1b}

vm_state: present
vm_name: db1
vm_image: '{{ ubuntu_14_disk_50_v2 }}'
vm_key: lihaibin
vm_flavor: 1CPU_1G
vm_network: public
vm_group: poc

任务代码 roles/openstack.CreateServer/tasks/main.yml

- block:
    - name: Set the new instance's name
      debug:
        msg: "The new instance's name is {{ vm_name }}-{{ ansible_date_time.epoch }}"
    - name: Creating new instance
      os_server:
        state: '{{ vm_state }}'
        auth:
          auth_url: '{{ auth.auth_url }}'
          username: '{{ auth.username }}'
          password: '{{ auth.password }}'
          project_name: '{{ auth.project_name }}'
        name: "{{ vm_name }}-{{ ansible_date_time.epoch }}"
        image: '{{ vm_image }}'
        flavor: '{{ vm_flavor }}'
        network: '{{ vm_network }}'
        meta:
          hostname: "{{ vm_name }}-{{ ansible_date_time.epoch }}"
    - name: Gathering the new instance's facts
      os_server_facts:
        auth:
          auth_url: '{{ auth.auth_url }}'
          username: '{{ auth.username }}'
          password: '{{ auth.password }}'
          project_name: '{{ auth.project_name }}'
        server: "{{ vm_name }}-{{ ansible_date_time.epoch }}"
    - name: Get the new instance's IP address
      block:
        - set_fact:
            vm_ip: "{{ openstack_servers[0]['accessIPv4'] }}"
        - debug:
            msg: "The new instance's IP address is {{ vm_ip }}"
    - name: Waiting for the new instance up and run
      wait_for:
        host: '{{ vm_ip }}'
        port: 22
        search_regex: OpenSSH
        sleep: 10
        timeout: 3000
    - name: Add the new instance into inventory
      add_host:
        name: "{{ vm_name }}-{{ ansible_date_time.epoch }}"
        ansible_host: "{{ vm_ip }}"
  rescue:
    - name: Remove the new instance when failed
      os_server:
        state: absent
        auth:
          auth_url: '{{ auth.auth_url }}'
          username: '{{ auth.username }}'
          password: '{{ auth.password }}'
          project_name: '{{ auth.project_name }}'
        name: "{{ vm_name }}-{{ ansible_date_time.epoch }}"

这里我使用了 {{ vm_name }}-{{ ansible_date_time.epoch }} 作为新机器的名称,这样可以避免名称重复。如果创建过程中遇到任何失败,会执行删除虚拟机的操作,避免产生垃圾资源。

剧本 setup_mysql.yml

这个剧本的重点在于 post_tasks 里

  1. 在新虚拟机创建完成之后,我们还是要通过 openstack-connector 作为跳板机来访问新虚拟机,这样才能保证 {{ vm_name }}-{{ ansible_date_time.epoch }} 这个值是可以被读取到的。
  2. 基于这个模板,在 post_tasks 里,include_role 部分可以随意发挥,把你要执行的 role 加进来。这样你可以做到一键创建虚拟机并部署应用到虚拟机。
  3. 最后我们通过 openstack-connector 里的 sendmail,发出一封邮件,包含机器的相关信息。
- hosts: openstack-connector
  vars:
    new_password: newtouch
    mysql_user: root
    mysql_password: newtouch
    bind_address: 0.0.0.0
    max_connections: 256
    innodb_buffer_pool_size: "{{ (ansible_memtotal_mb * 0.5) | round | int }}M"
    owner_email: "[email protected]"
  roles:
    - openstack.CreateServer
  post_tasks:
    - block:
        - include_role:
            name: newtouch.SystemConfig
        - include_role:
            name: newtouch.MySQL
        - include_role:
            name: newtouch.UpdateRootPass
      delegate_to: "{{ vm_name }}-{{ ansible_date_time.epoch }}"
      delegate_facts: True
    - name: Send mail with instance info
      mail:
        host: localhost
        from: '[email protected]>'
        to: '{{ owner_email }}'
        subject: "Server {{ vm_name | upper }}-{{ ansible_date_time.epoch }} has been successfully created."
        body: |
          The server {{ vm_name | upper }}-{{ ansible_date_time.epoch }} info:

          - IP: {{ vm_ip }}
          - SYSTEM USER: root
          - SYSTEM PASS: {{ new_password }}
          - MYSQL USER:  {{ mysql_user }}
          - MYSQL PASS:  {{ mysql_password }}

          Please keep this email safe.
        charset: utf8

本剧本在 Ansible Tower 里也通过测试

我们通过问卷方式获取需要的变量值,一个简单的数据库虚拟机就可以实现一键创建了。开发人员再也不用等待运维人员的协助。

__2017_09_01_19_24_57

目录
相关文章
|
2月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
172 5
|
7月前
|
人工智能 安全 虚拟化
企业级Win11纯净部署指南|VMware虚拟机安装+GPT分区优化+绕过限制详解(小白必看)
Windows 11 是微软推出的新一代操作系统,以其直观交互和 AI 技术为核心升级亮点。界面采用圆角设计与居中任务栏布局,支持多窗口贴靠分屏、虚拟桌面功能,大幅提升多任务处理效率。系统深度集成了 Copilot 智能助手,提供语音写作、照片编辑等便捷功能,并通过 DirectStorage 和 DirectX 12 Ultimate 技术优化游戏体验。本文详细介绍 Windows 11 的下载、U盘制作及安装步骤,帮助用户快速上手全新系统。
807 37
|
6月前
|
存储 弹性计算 运维
还在死磕虚拟机?应用为中心的IT管理新范式,可能被你忽略了!
在企业信息化的征途中,虚拟机(VM)技术无疑扮演过举足轻重的角色。它曾有效地解决了物理服务器资源利用率低下、环境隔离困难等一系列棘手问题,并迅速成为数据中心和企业IT基础设施的**标配**。然而,时移世易,随着业务迭代节奏的空前加快、应用架构(如微服务、云原生)的日趋复杂,以及企业对降本增效近乎极致的追求,我们发现,单纯依赖虚拟机进行应用管理,渐渐显露出其局限性,甚至成为制约效率的瓶颈。
还在死磕虚拟机?应用为中心的IT管理新范式,可能被你忽略了!
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
9月前
|
监控 安全 网络协议
Hyper V上网实战:多虚拟机网络环境配置
在Hyper-V环境中配置多虚拟机网络以实现上网功能,需完成以下步骤:1. 确认Hyper-V安装与物理网络连接正常;2. 配置虚拟交换机(外部、内部或专用)以支持不同网络需求;3. 设置虚拟机网络适配器并关联对应虚拟交换机;4. 验证虚拟机网络连接状态;5. 根据场景需求优化多虚拟机网络环境。此外,还需注意网络隔离、性能监控及数据备份等事项,确保网络安全稳定运行。
|
10月前
|
安全 Linux 开发工具
【Azure 环境】Azure 虚拟机上部署 DeepSeek R1 模型教程(1.5B参数)【失败】
遇见错误一:operator torchvision::nms does not exist 遇见错误二:RuntimeError: Failed to infer device type
936 22
|
9月前
|
编解码 监控 虚拟化
Hyper分辨率优化技术,怎么使得虚拟机中的图形应用能够以更高的清晰度呈现
Hyper分辨率优化技术通过增强虚拟机的图形处理能力,显著提升图像清晰度和视觉体验,适用于图形设计、视频编辑等场景。该技术依赖于虚拟机的硬件配置、显卡驱动及显示设置,确保高分辨率内容的最佳呈现。使用时需合理设置分辨率,定期更新驱动并监控性能,以实现最佳效果。
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
运维 Devops 应用服务中间件
自动化运维的利剑:Ansible在现代IT架构中的应用
【10月更文挑战第42天】本文旨在揭示自动化运维工具Ansible如何革新现代IT架构,通过简化配置管理和部署流程,提升效率和可靠性。我们将探索Ansible的核心功能、语言特性以及其在DevOps文化中的角色。文章还将展示如何借助Ansible构建模块化和可重用的配置代码,实现快速迭代与部署,并确保系统一致性。通过阅读本文,运维人员将了解如何利用Ansible优化日常任务,加速产品上线速度,同时提高系统的稳健性。
268 5
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
381 4