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]#