ansible 自动安装软件,实现列表选择软件的方法

ansible 自动安装软件,实现列表选择软件的方法

事例:

标准Role目录结构roles/nginx/

复制代码
├── defaults/
│   └── main.yml          # 默认变量
├── files/
│   └── nginx.repo        # 静态文件
├── handlers/
│   └── main.yml          # 处理器
├── meta/
│   └── main.yml          # 角色依赖
├── tasks/
│   ├── main.yml          # 主任务入口
│   ├── install.yml       # 安装任务
│   ├── configure.yml     # 配置任务
│   └── service.yml       # 服务管理
├── templates/
│   ├── nginx.conf.j2     # 配置模板
│   └── site.conf.j2      # 站点配置模板
├── vars/
│   └── main.yml          # 角色变量
└── README.md             # 角色说明文档

#查看mysql目录结构

复制代码
[root@manager mysql-5.7.17]# tree
.
├── default
├── files
│   └── mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz
├── handlers
├── meta
├── tasks
│   ├── main.yml
│   └── main.yml.bak
├── templates
│   ├── my.cnf
│   ├── mysql.service
│   └── readme.txt
└── vars
    └── main.yml

静态文件

复制代码
[root@manager mysql-5.7.17]# ll files/
total 641392
-rw-r--r-- 1 root root 656782376 Feb 15  2023 mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

这个静态文件目录是安装好的mysql文件,上传到目标服务器上解压启动即可(条件:以centos7 为例,最小安装化)初始化安装mysql,将安装好的mysql整体打包,这样不用在目标服务器上执行安装的操作,避免因网络,安装依赖包等问题

#查看role 主任务入口文件main.yml

复制代码
[root@manager mysql-5.7.17]# ll tasks/
total 8
-rw-r--r-- 1 root root 1457 Apr  9  2025 main.yml
-rw-r--r-- 1 root root 1092 Mar 20  2024 main.yml.bak
[root@manager mysql-5.7.17]# cat tasks/main.yml
- name: Add group
  group: name=mysql
- name: Add user
  user: name=mysql group=mysql home=/home/mysql
- name: Create /apps files
  file: path=/apps state=directory mode=755 owner=root group=root
- name: copy mysql_tar_gz to client
  unarchive: src=mysql-{{ mysql_version }}-linux-glibc2.5-x86_64.tar.gz dest=/apps/ owner=mysql group=mysql
- name: Copy my.cnf to client
  template: src=my.cnf dest=/etc/my.cnf owner=mysql group=mysql
- name: copy mysql.service to client
  template: src=mysql.service dest=/usr/lib/systemd/system/mysql.service
- name: rename mysql_filename mysql
  shell: chdir=/apps mv mysql-{{ mysql_version }}-linux-glibc2.5-x86_64 mysql
#- name: Configure mysql env
#  shell: export MYSQL_HOME=/apps/mysql && export PATH=$PATH:$MYSQL_HOME/bin:$MYSQL_HOME/sbin:$MYSQL_HOME/bin
#- name: Configure mysql env
#  shell: /bin/echo {{ item }} >> /etc/profile && source /etc/profile
#  with_items:
#   - ##mysql_env
#   - export MYSQL_HOME=/apps/mysql
#   - export PATH=$PATH:$MYSQL_HOME/bin:$MYSQL_HOME/sbin:$MYSQL_HOME/bin
- name: Configure mysql env
  shell: |
    printf '%s\n' \
      '##mysql_env' \
      'export MYSQL_HOME=/apps/mysql' \
      'export PATH=$PATH:$MYSQL_HOME/bin:$MYSQL_HOME/sbin' >> /etc/profile
    source /etc/profile
- name: reload mysql.service
  shell: systemctl daemon-reload
- name: start mysqld service
  shell: systemctl start mysql.service
- name: enable mysql.service
  shell: systemctl enable mysql.service
[root@manager mysql-5.7.17]# 

配置模板

复制代码
[root@manager mysql-5.7.17]# cd templates/
[root@manager templates]# ll
total 12
-rw-r--r-- 1 root root 1909 Feb 15  2023 my.cnf
-rw-r--r-- 1 root root  387 Feb 15  2023 mysql.service
-rw-r--r-- 1 root root   45 Feb 15  2023 readme.txt

角色变量

复制代码
[root@manager mysql-5.7.17]# cd vars/
[root@manager vars]# ll
total 4
-rw-r--r-- 1 root root 22 Feb 15  2023 main.yml
[root@manager vars]# cat main.yml 
mysql_version: 5.7.17
[root@manager vars]# 

二、操作步骤:

1,设置软件列表

复制代码
[root@manager ansible]# cd playbooks/
[root@manager playbooks]# ll
total 12
drwxr-xr-x 2 root root  201 May 20 09:54 bak
-rw-r--r-- 1 root root 1628 Aug 22 15:50 install30.yml
[root@manager playbooks]# cat install30.yml 
- hosts: lab
  remote_user: root

  tasks:
    - name: 设置可用角色列表
      set_fact:
        available_roles: [
          "placeholder",
          "activemq-5.9.0",
          "jdk1.8.0_65",
          "jdk1.8.0_131",
          "jdk1.8.0_191",
          "jdk-17.0.2",
          "jdk-21.0.2",
          "tomcat.8.0.28",
          "tomcat.8.0.50",
          "tomcat.8.5.37",
          "nginx-1.12.1",
          "nginx-1.14.1",
          "nginx-1.18.0",
          "PHP-7.2.1",
          "PHP-7.0.9",
          "mysql-5.6.36",
          "mysql-5.6.38",
          "mysql-5.7.17",
          "mysql-8.0.11",
          "percona-mysql-5.7.39-42",
          "redis-3.2.3",
          "redis-4.0.6",
          "redis-5.0.9",
          "redis-7.0.4",
          "mongodb-3.4.6",
          "postgresql-9.4.5",
          "postgresql-17.4.0",
          "RabbitMQ-3.6.15",
          "RocketMQ-5.0.0",
          "zookeeper-3.4.6",
          "dm8-20220525",
          "dm8-20230418",
          "dm8",
          "GBase8s-v8.7"
        ]

    - name: 列出可用角色及编号
      debug:
        msg: "{{ 'skipping: [{}] => ({:<2}, {})'.format(ansible_host, item.0 + 1, item.1) }}"
      with_indexed_items: "{{ available_roles }}"
      when: user_input is defined

    - name: 用户选择
      pause:
        prompt: "请选择要安装的角色编号(用逗号分隔,例如,1,2,3):"
      register: user_input

    - name: 包含选定的角色
      include_role:
        name: "{{ available_roles[item | int] }}"
      loop: "{{ user_input.user_input.split(',') | map('int') | list }}"
      when: user_input is defined


[root@manager playbooks]# 

2,执行安装的脚本

复制代码
[root@manager ansible]# pwd
/etc/ansible
[root@manager ansible]# cat install.sh 
#!/bin/bash

# 提示用户输入目标主机的信息
read -p "请输入目标主机的IP地址: " target_ip
read -p "请输入SSH端口: " ssh_port
read -p "请输入SSH用户名: " ssh_user
read -s -p "请输入SSH密码: " ssh_pass
echo ""

# 使用 sed 命令替换目标主机的信息
sed -i "/^\[lab\]$/,/^\[lab:vars\]$/ s/^[0-9.]\+/${target_ip}/" /etc/ansible/hosts
sed -i "/^\[lab:vars\]$/,/^\[/ s/ansible_ssh_port=[0-9]\+/ansible_ssh_port=${ssh_port}/" /etc/ansible/hosts
sed -i "/^\[lab:vars\]$/,/^\[/ s/ansible_ssh_user=[^ ]\+/ansible_ssh_user=${ssh_user}/" /etc/ansible/hosts
sed -i "/^\[lab:vars\]$/,/^\[/ s/ansible_ssh_pass=[^ ]\+/ansible_ssh_pass=${ssh_pass}/" /etc/ansible/hosts

echo "已成功更新目标主机的信息。"


echo "执行安装"
/usr/bin/ansible-playbook /etc/ansible/playbooks/install30.yml
[root@manager ansible]# 

3,执行安装操作

复制代码
[root@manager ansible]# sh install.sh 
请输入目标主机的IP地址: 192.168.3.123
请输入SSH端口: 1026
请输入SSH用户名: root
请输入SSH密码: 
已成功更新目标主机的信息。
执行安装
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details

PLAY [lab] *********************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************
ok: [192.168.3.123]

TASK [设置可用角色列表] ****************************************************************************************************************************************************
ok: [192.168.3.123]

TASK [列出可用角色及编号] ***************************************************************************************************************************************************
skipping: [192.168.3.123] => (item=[0, u'placeholder']) 
skipping: [192.168.3.123] => (item=[1, u'activemq-5.9.0']) 
skipping: [192.168.3.123] => (item=[2, u'jdk1.8.0_65']) 
skipping: [192.168.3.123] => (item=[3, u'jdk1.8.0_131']) 
skipping: [192.168.3.123] => (item=[4, u'jdk1.8.0_191']) 
skipping: [192.168.3.123] => (item=[5, u'jdk-17.0.2']) 
skipping: [192.168.3.123] => (item=[6, u'jdk-21.0.2']) 
skipping: [192.168.3.123] => (item=[7, u'tomcat.8.0.28']) 
skipping: [192.168.3.123] => (item=[8, u'tomcat.8.0.50']) 
skipping: [192.168.3.123] => (item=[9, u'tomcat.8.5.37']) 
skipping: [192.168.3.123] => (item=[10, u'nginx-1.12.1']) 
skipping: [192.168.3.123] => (item=[11, u'nginx-1.14.1']) 
skipping: [192.168.3.123] => (item=[12, u'nginx-1.18.0']) 
skipping: [192.168.3.123] => (item=[13, u'PHP-7.2.1']) 
skipping: [192.168.3.123] => (item=[14, u'PHP-7.0.9']) 
skipping: [192.168.3.123] => (item=[15, u'mysql-5.6.36']) 
skipping: [192.168.3.123] => (item=[16, u'mysql-5.6.38']) 
skipping: [192.168.3.123] => (item=[17, u'mysql-5.7.17']) 
skipping: [192.168.3.123] => (item=[18, u'mysql-8.0.11']) 
skipping: [192.168.3.123] => (item=[19, u'percona-mysql-5.7.39-42']) 
skipping: [192.168.3.123] => (item=[20, u'redis-3.2.3']) 
skipping: [192.168.3.123] => (item=[21, u'redis-4.0.6']) 
skipping: [192.168.3.123] => (item=[22, u'redis-5.0.9']) 
skipping: [192.168.3.123] => (item=[23, u'redis-7.0.4']) 
skipping: [192.168.3.123] => (item=[24, u'mongodb-3.4.6']) 
skipping: [192.168.3.123] => (item=[25, u'postgresql-9.4.5']) 
skipping: [192.168.3.123] => (item=[26, u'postgresql-17.4.0']) 
skipping: [192.168.3.123] => (item=[27, u'RabbitMQ-3.6.15']) 
skipping: [192.168.3.123] => (item=[28, u'RocketMQ-5.0.0']) 
skipping: [192.168.3.123] => (item=[29, u'zookeeper-3.4.6']) 
skipping: [192.168.3.123] => (item=[30, u'dm8-20220525']) 
skipping: [192.168.3.123] => (item=[31, u'dm8-20230418']) 
skipping: [192.168.3.123] => (item=[32, u'dm8']) 
skipping: [192.168.3.123] => (item=[33, u'GBase8s-v8.7']) 
skipping: [192.168.3.123]

TASK [用户选择] ********************************************************************************************************************************************************
[用户选择]
请选择要安装的角色编号(用逗号分隔,例如,1,2,3)::
17^Mok: [192.168.3.123]
$<3>
TASK [包含选定的角色] *****************************************************************************************************************************************************

TASK [mysql-5.7.17 : Add group] ************************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : Add user] *************************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : Create /apps files] ***************************************************************************************************************************
ok: [192.168.3.123]

TASK [mysql-5.7.17 : copy mysql_tar_gz to client] ******************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : Copy my.cnf to client] ************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : copy mysql.service to client] *****************************************************************************************************************
ok: [192.168.3.123]

TASK [mysql-5.7.17 : rename mysql_filename mysql] ******************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : Configure mysql env] **************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : reload mysql.service] *************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : start mysqld service] *************************************************************************************************************************
changed: [192.168.3.123]

TASK [mysql-5.7.17 : enable mysql.service] *************************************************************************************************************************
fatal: [192.168.3.123]: FAILED! => {"changed": true, "cmd": "systemctl enable mysql.service", "delta": "0:00:00.079469", "end": "2025-10-15 15:06:54.639688", "msg": "non-zero return code", "rc": 1, "start": "2025-10-15 15:06:54.560219", "stderr": "Failed to execute operation: File exists", "stderr_lines": ["Failed to execute operation: File exists"], "stdout": "", "stdout_lines": []}

PLAY RECAP *********************************************************************************************************************************************************
192.168.3.123              : ok=13   changed=8    unreachable=0    failed=1    skipped=1    rescued=0    ignored=0   

[root@manager ansible]# 

安装完成

4,查看目标服务器mysql的状态

复制代码
[root@test-3-123 apps]# ps -ef | gep mysql
-bash: gep: command not found
[root@test-3-123 apps]# ps -ef | grep mysql
mysql     46429      1  0 15:06 ?        00:00:00 /apps/mysql/bin/mysqld --defaults-file=/etc/my.cnf
root      46738  45450  0 15:11 pts/0    00:00:00 grep --color=auto mysql
[root@test-3-123 apps]# systemctl status mysql.service
● mysql.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2025-10-15 15:06:53 CST; 4min 29s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 46429 (mysqld)
    Tasks: 30
   Memory: 626.9M
   CGroup: /system.slice/mysql.service
           └─46429 /apps/mysql/bin/mysqld --defaults-file=/etc/my.cnf

Oct 15 15:06:53 ops-tools-2-252 systemd[1]: Started MySQL Server.
[root@test-3-123 apps]# 
相关推荐
文静小土豆5 小时前
Ansible 自动化部署K8S1.34.1
kubernetes·自动化·ansible
K_i1342 天前
Helm 与 Ansible 深度对比解析文档
自动化·ansible
zmjjdank1ng3 天前
什么是Ansible 清单
服务器·自动化·ansible
Yyyy4823 天前
ansible role配apt源
ansible
K_i1349 天前
Ansible实战:VMware下K8s自动化部署指南
kubernetes·自动化·ansible
许泽宇的技术分享9 天前
Ansible核心架构深度剖析:从源码看IT自动化的“简单“哲学
python·ansible·自动化运维·devops·it基础设施
荣光波比9 天前
Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南
运维·自动化·云计算·ansible
tt666qq10 天前
运维自动化之 Ansible 核心知识点总结
运维·自动化·ansible
C-200215 天前
初探 ansible 部署 devops 持续集成持续交付
ci/cd·ansible·devops