Ansible安装
安装依赖及版本信息如下:
===========================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================
Installing:
ansible noarch 2.8.1-1.el7 epel 15 M
Installing for dependencies:
python-babel noarch 0.9.6-8.el7 base 1.4 M
python-httplib2 noarch 0.9.2-0.2.el7 epel 115 k
python-jinja2 noarch 2.7.2-2.el7 base 515 k
python-markupsafe x86_64 0.11-10.el7 base 25 k
python-paramiko noarch 2.1.1-5.el7 base 268 k
python2-jmespath noarch 0.9.0-1.el7 epel 39 k
sshpass x86_64 1.06-1.el7 epel 21 k
Transaction Summary
===========================================================================================================================================================================
Ansible简单方式 二进制安装mariadb
1.配置基于key的ssh远程登录
[root@CentOS7 ~]#ssh-keygen
[root@CentOS7 ~]#ssh-copy-id 192.168.37.30
[root@CentOS7 ~]#ssh-copy-id 192.168.37.102
[root@CentOS7 ~]#ssh-copy-id 192.168.37.103
2.主控端安装ansible
[root@CentOS7 ~]#yum install ansible
3.配置主机清单:
[root@CentOS7 ~]#vim /etc/ansible/hosts
[webservers]
192.168.37.102
192.168.37.103
[appservers]
192.168.37.30
4.测试主机联通性
[root@CentOS7 ~]#ansible all -m ping
5.编写剧本yml文件
[root@CentOS7 data]#vim mariadb.yml
---
#二进制安装mariadb
#mariadb版本10.2.25
#安装步骤
#1.添加mysql用户
#2.创建存放数据库文件目录
#3.修改存放数据库文件目录权限
#4.解压缩二进制包,同时设置解压后的mysql安装目录权限
#5.创建软链接
#6.准备配置文件(配置文件不修改再次执行playbook,需要删除已经生成的数据库文件,否则会报错)
#7.准备数据库文件 (每执行一次playbook,生成数据库文件脚本都会重新执行,重新生成数据库文件)
#8.准备服务启动脚本 (更改数据库配置端口后重新执行playbook,原先已经启用服务占用的端口需手动禁用掉)
#9.设置环境变量
#10.source环境变量,使之生效
#11.启动mariadb服务
- hosts: all
remote_user: root
tasks:
- name: create user mysql
user: name=mysql system=yes home=/data/mysql create_home=no shell=/sbin/nologin
- name: create mysql data directory
file: path=/data/mysql state=directory
- name: chown mysql data directory
file: path=/data/mysql owner=mysql group=mysql
- name: unarchive package to remote hosts
unarchive: src=/data/mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local copy=yes owner=root group=root
tags:
unarchmariadb
- name: create soft link
file: src=/usr/local/mariadb-10.2.25-linux-x86_64 dest=/usr/local/mysql state=link
- name: copy config file
copy: src=/data/my.cnf dest=/etc
- name: prepare data file
shell: chdir=/usr/local/mysql ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
- name: prepare start scripts
shell: cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: set environment path variable
copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: source path variable
shell: source /etc/profile.d/mysql.sh
- name: start mariadb service
shell: /etc/init.d/mysqld start
handlers:
- name: restart mariadb service
service: name=mysqld state=restarted
6.准备安装包和配置文件
[root@CentOS7 data]#vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
[root@CentOS7 data]#cp /etc/my.cnf /data/
[root@CentOS7 ~]#rz #mariadb-10.2.25-linux-x86_64.tar.gz
7.检查语法
#如果yml文件有关键字或模块名称错误,会直接报红色错误
#如果yml模拟执行过程中有错,会在具体执行步骤处报错,前面的通过的步骤会显示
[root@CentOS7 ~]#ansible-playbook -C /data/mariadb.yml
8.执行剧本:
#第一次执行剧本
[root@CentOS7 ~]#ansible-playbook /data/mariadb.yml
#如果是后面改了配置文件,再次执行,由于压缩文件解压缩需要一段时间,可以选择跳过解压阶段
[root@CentOS7 ~]#ansible-playbook /data/mariadb.yml --skip-tags="unarchmariadb"
#更改数据库配置端口后重新执行playbook,原先已经启用服务占用的端口需手动禁用掉
#ss -nltp
#kill -9 pid
配置文件中带有变量的称为模板template
批量引入文件名到main.yml
[root@CentOS7 tasks]#for file in *;do echo "- include: $file" >> main.yml;done
1.role角色名即roles目录下的子目录名(一个文件夹对应一个角色)
2.执行playbook的yml文件要与roles目录在同一级
3.template模板文件名必须是.j2后缀;调用的yml文件与templates文件夹在同级目录
4.tasks的yml文件中指定的包路径不需要指定绝对路径
默认的roles目录路径:/etc/ansible/roles ,可修改 ansible.cfg 配置文件自定义roles目录路径
#:nohl vim中取消高亮
#:set number vim中查看行号
vim /etc/ansible/ansible.cfg
roles_path = /data/playbook/roles
项目方式部署安装
使用项目的目录结构:
将原先的tasks任务分别拆成roles/tasks目录下的单个yml文件,方便局部调整,而不影响整体
项目文件写法与简单写法区别:
[root@CentOS7 ~]#cat /etc/ansible/playbooks/roles/mariadb/tasks/unarchive_install_package.yml
- name: unarchive package to remote hosts
#压缩包的路径放到了files目录中,所以不需要指定压缩包路径,Ansible可以自己找到
unarchive: src=mariadb-10.2.25-linux-x86_64.tar.gz dest=/usr/local copy=yes owner=root group=root
tags:
unarchmariadb
[root@CentOS7 ~]#cat /etc/ansible/playbooks/roles/mariadb/tasks/config_template.yml
- name: copy config file
#配置文件放在了templates目录中,无需指定配置文件路径
template: src=my.cnf.j2 dest=/etc/my.cnf
notify: restart mariadb service
-----------------------------案例1:模板仅需重复1条服务的变量------------------------------
vim for.yml
- hosts: appsrvs
vars:
ports: //变量列表名
- 81 // - listen_port:81 变量列表,可以是字典形式
- 82 // - listen_port:82
- 83 // - listen_port:83 // 键(变量):值:字典形式
tasks:
- name: config
template: src=aa.j2 dest=
vim templates/aa.j2
{% for port in ports %} //port:for循环中定义使用的变量;ports是yml中定义的变量列表
server {
listen {{port}}
//listen {{port.listen_port}} 调用字典变量
}
{%endfor%}
结果形式:
server{
port:81
}
server{
port:82
}
server{
port:83
}
-----------------------------------------------------------------------------------
---------------案例2:模板中需重复多个服务的变量-----------------
vim for.yml
- hosts: appsrvs
vars:
ports:
- web1: //第1个列表元素,以键值对存储
listen_port: 81
name: web1.magedu.com
dir: /data/web1
- web2: //第3个列表元素,以键值对存储
listen_port: 81
name: web2.magedu.com
dir: /data/web2
- web3: //第3个列表元素,以键值对存储
listen_port: 81
name: web3.magedu.com
dir: /data/web3
tasks:
- name: config
template: src=aa.j2 dest=
vim templates/aa.j2
{% for port in ports %} //这里的ports是3个列表
server {
listen {{port.listen_port}}
server_name {{port.name}}
root {{port.dir}}
}
{%endfor%}
效果:
server{
port:81
server_name:web1.magedu.com
root:/data/web1
}
server{
port:82
server_name:web2.magedu.com
root:/data/web2
}
server{
port:83
server_name:web3.magedu.com
root:/data/web3
}
--------------------------------------------------------------------------
----------案例3:条件判断来重复多个服务变量-----------------------
vim for.yml
- hosts: appsrvs
vars:
ports:
- web1: //第1个列表元素,以键值对存储
listen_port: 81
dir: /data/web1
- web2: //第3个列表元素,以键值对存储
listen_port: 81
name: web2.magedu.com
dir: /data/web2
- web3: //第3个列表元素,以键值对存储
listen_port: 81
dir: /data/web3
tasks:
- name: config
template: src=aa.j2 dest=
vim templates/aa.j2
{% for port in ports %} //这里的ports是3个列表
server {
listen {{port.listen_port}}
{%if port.name is defined %} //变量定义则执行,变量没定义则不执行
server_name {{port.name}}
{%endif%}
root {{port.dir}}
}
{%endfor%}
效果:
server{
port:81
root:/data/web1
}
server{
port:82
server_name:web2.magedu.com
root:/data/web2
}
server{
port:83
root:/data/web3
}
--------------------------------------------------------------------