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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 前文 通过 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: "haibin.li@newtouch.cn"
  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: 'ansible@newtouch.com>'
        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

目录
相关文章
|
8月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
390 5
|
人工智能 安全 虚拟化
企业级Win11纯净部署指南|VMware虚拟机安装+GPT分区优化+绕过限制详解(小白必看)
Windows 11 是微软推出的新一代操作系统,以其直观交互和 AI 技术为核心升级亮点。界面采用圆角设计与居中任务栏布局,支持多窗口贴靠分屏、虚拟桌面功能,大幅提升多任务处理效率。系统深度集成了 Copilot 智能助手,提供语音写作、照片编辑等便捷功能,并通过 DirectStorage 和 DirectX 12 Ultimate 技术优化游戏体验。本文详细介绍 Windows 11 的下载、U盘制作及安装步骤,帮助用户快速上手全新系统。
3280 37
|
安全 Linux 开发工具
【Azure 环境】Azure 虚拟机上部署 DeepSeek R1 模型教程(1.5B参数)【失败】
遇见错误一:operator torchvision::nms does not exist 遇见错误二:RuntimeError: Failed to infer device type
1331 22
|
存储 Linux 开发者
虚拟机centos7.9一键部署docker
本文介绍了如何在 CentOS 7.9 虚拟机上安装 Docker 社区版 (Docker-ce-20.10.20)。通过使用阿里云镜像源,利用 `wget` 下载并配置 Docker-ce 的 YUM 仓库文件,然后通过 `yum` 命令完成安装。安装后,通过 `systemctl` 设置 Docker 开机自启并启动 Docker 服务。最后,使用 `docker version` 验证安装成功,并展示了客户端与服务器的版本信息。文中还提供了列出所有可用 Docker-ce 版本的命令。
3412 0
虚拟机centos7.9一键部署docker
|
存储 数据安全/隐私保护 Docker
Kolla-ansible部署openStack
Kolla-ansible部署openStack
3174 11
|
消息中间件 缓存 Shell
跟我一起来学OpenStack部署
跟我一起来学OpenStack部署
1291 0
|
运维 安全 测试技术
自动化运维的利剑:Ansible在企业级部署中的应用与挑战
本文深入探讨了Ansible,这一领先的IT自动化工具,如何在企业级部署中扮演关键角色。我们将通过实际案例分析,揭示Ansible在简化配置管理、加速应用部署和提高运维效率方面的优势。同时,文章也将不回避Ansible实施过程中可能遇到的技术挑战与限制,并提供针对性的解决策略。阅读本文后,您将获得一个全面的视角,理解Ansible在现代企业运维中不可或缺的地位,以及如何克服其面临的主要问题。
502 3
|
监控 应用服务中间件 nginx
详细解释容器以及虚拟机centos7.9容器化部署基础服务(容器化部署nginx)
容器是一种轻量级、可移植的软件打包和隔离技术,将应用程序及其依赖项打包,确保在任何环境中一致运行。容器共享主机操作系统内核,相比虚拟机更高效、轻量,具有快速启动和高资源利用率的特点。容器的关键技术包括命名空间(如 PID、NET 等)、控制组(cgroups)和联合文件系统(UnionFS)。使用容器可以提高开发和部署效率,简化管理,确保环境一致性。例如,在 CentOS 7.9 上部署 Nginx 时,可以通过 Docker 下载和运行 `nginx:1.20` 镜像,并通过端口映射使外部请求访问 Nginx 服务。此外,还可以将测试页面复制到容器中,进一步验证容器的功能。
550 0
部署09--虚拟机快照,我们无法避免损坏Linux操作系统 ,如果重新装一下就太过麻烦,推荐在关机下制作快照,关机制作效率好,机房要靠近地址,动不动崩溃
部署09--虚拟机快照,我们无法避免损坏Linux操作系统 ,如果重新装一下就太过麻烦,推荐在关机下制作快照,关机制作效率好,机房要靠近地址,动不动崩溃
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。