目录结构
host文件夹
用于存放主机清单文件
hosts文件
hosts文件内容如下:(仅供参考)
[proxy]
node2
[web]
node3
node4
[mysql]
node5
playbook-all-roles.yml文件
用于指定执行哪个role的文件(命名可以自定义)
文件内容如下:(仅供参考)
- role: mysql就指定的是mysql这个role
- hosts: web
remote_user: root
gather_facts: no
roles:
#- role: nginx
- role: mysql
roles文件夹
用于存放各种类型的role
mysql文件夹
代表着nginx这个role,里面存放着各种配置文件
主要框架如下:
- default:在每个角色文件夹内,default文件夹用于存放该角色的默认变量。这些变量可以在其他地方被引用,用于配置角色的行为。
- files:用于存放角色部署时可能需要用到的一些文件。这些文件可以通过Ansible的copy模块传输到远程主机上。
- handlers:包含处理任务的配置文件,当某些条件满足时,会触发这些处理器执行相应的操作,如重启服务或应用配置更改等。
- meta:主要编写依赖关系,即一个独立模块引用另一个role
- tasks:包含角色的具体任务定义,这些任务描述了如何在远程主机上执行操作,如安装软件、配置服务等。
- templates:模板文件
- vars:虽然roles目录结构中没有明确提到vars文件夹,但在实际使用中,有时会在角色内部定义一些变量,这些变量可以存放在vars文件夹中,以便在任务中使用。
本次只讲解使用到的文件夹
files文件夹
目录结构
[root@master files]# tree
.
├── mysql-5.7.9-1.el7.x86_64.rpm-bundle.tar
└── update_mysql_passwd.sh
mysql-5.7.9-1.el7.x86_64.rpm-bundle.tar
mysql安装包
update_mysql_passwd.sh
修改mysql临时密码以及设置访问权限脚本
vars文件夹
目录结构
[root@master vars]# tree
.
└── main.yml
注意:只能定义成main.yml文件名
文件内容如下:(仅供参考)
功能:定义一些参数
version_num: "5.7.9-1.el7.x86_64"
src_mysql: "mysql-5.7.9-1.el7.x86_64.rpm-bundle.tar"
mysql_jieyahou_name: "mysql-5.7.9-1.el7.x86_64.rpm-bundle"
install_mysql_dir: "/usr/local/mysql"
new_passwd: '!xxxxxxx'
sh_file_name: "update_mysql_passwd.sh"
tasks文件夹
目录结构
[root@master tasks]# tree
.
├── config_enabled_start.yml
├── create_dir_transfer_mysql.yml
├── init_mysql.yml
├── install_mysql.yml
├── main.yml
├── open_firewall_port.yml
└── remove_db.yml
注意:除了main.yml文件必须要有,其他yml文件按需自定义名
main.yml
控制执行顺序
文件内容如下:
- include: remove_db.yml
- include: create_dir_transfer_mysql.yml
- include: install_mysql.yml
- include: init_mysql.yml
- include: config_enabled_start.yml
- include: open_firewall_port.yml
remove_db.yml
删除已存在的数据库
文件内容如下:
- name: 查看并删除mariadb
shell: count=`rpm -qa|grep mariadb|wc -l` &&
[ ${count} -gt 0 ] && rpm -e mariadb-* --nodeps || break
- name: 删除已有mysql
shell: systemctl stop mysqld &&
count=`rpm -qa|grep mysql|wc -l` &&
[ ${count} -gt 0 ] && rpm -qa|grep mysql|xargs rpm -e || break
- name: 删除mysql文件夹
shell: count=`find / -name mysql|wc -l` &&
[ ${count} -gt 0 ] && find / -name mysql|xargs rm -rf || break
create_dir_transfer_mysql.yml
创建安装目录并传输解压安装包
文件内容如下:
- name: 创建{{install_mysql_dir}}文件夹
shell: cd /usr/local &&
[ ! -d mysql ] && mkdir mysql || break
- name: 传输mysql压缩包
unarchive:
src: "{{ src_mysql}}"
dest: "{{ install_mysql_dir }}"
install_mysql.yml
安装mysql,并启动
文件内容如下:
- name: 依次安装mysql
shell: cd {{ install_mysql_dir }} &&
rpm -ivh {{ item }}
with_items:
- mysql-community-common-{{ version_num }}.rpm --force --nodeps
- mysql-community-libs-{{ version_num }}.rpm --force --nodeps
- mysql-community-client-{{ version_num }}.rpm --force --nodeps
- mysql-community-server-{{ version_num }}.rpm --force --nodeps
- name: 启动mysql
shell: systemctl start mysqld
init_mysql.yml
初始化mysql
文件内容如下:
- name: 获取原始密码
shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'|tail -n 1
register: ori_passwd
- name: 修改mysql密码
script: "{{ sh_file_name }} {{ ori_passwd.stdout_lines[0] }} {{ new_passwd }}"
#5.76之后的版本用这个语句
#- name: 修改mysql初始密码
# shell: mysql -uroot -p"{{ ori_passwd.stdout }}" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY "{{ new_passwd }}";"
#5.76之前用这个语句
#- name: 修改mysql初始密码
# shell: mysql -uroot -p"{{ ori_passwd.stdout }}" --connect-expired-password -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD("{{ new_passwd }}");"
config_enabled_start.yml
配置开机自启
文件内容如下:
- name: 设置开机自启
service:
name: mysqld
state: started
enabled: yes
open_firewall_port.yml
打开端口
文件内容如下:
- name: 开放3306端口
firewalld:
port: 3306/tcp
permanent: yes
immediate: yes
state: enabled
整体校验是否通过
[root@master ansible-playbook-roles-nginx]# ansible-playbook -i host/hosts playbook-all-roles.yml --syntax-check
playbook: playbook-all-roles.yml
到playbook-all-roles.yml同级目录执行,没有报错就没有问题
执行
ansible-playbook -i host/hosts playbook-all-roles.yml
验证是否配置成功
[root@master ansible-playbook-roles]# ansible -i host/hosts mysql -m shell -a "mysql --version"
node5 | CHANGED | rc=0 >>
mysql Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using EditLine wrapper