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
}
--------------------------------------------------------------------