Ansible-playbook
Ansible-playbook
概述
Ansible-playbook是ansible的核心组件,通过yaml文件格式来定义各个task,每个task会调用python的不同模块,多个task的集合就是playbook。
作用:ad-hot方式的没有持久化方案,在实践中效率不高。为了提高效率和重用性,需要一套可以持久化脚本的方案,也就是playbook。
YAML
相比于json的{}的滥用,xml的标签对繁琐。凭借着优雅的缩进,可读性高等特点,YAML语言用来写配置文件变的流行起来。docker compose、kubernetes、ansible等主流开源软件都采用了yaml作为配置文件。
语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- #表示注释
数据类型
-
对象:键值对
-
数组:以 - 开头的行表示构成一个数组
-
存量:整数、浮点数、字符串、布尔值、时间、日期、Null
实例:
# 订单
---
date: 2021-03-16
customer:
- name: zbk
orderlist:
- no: 000001
- item: milk
引用
& 锚点和 ***** 别名,可以用来引用
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
相当于:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
& 用来建立锚点(defaults),<< 表示合并到当前数据,***** 用来引用锚点。
下面是另一个例子:
- &showell Steve
- Clark
- Brian
- Oren
- *showell
转为 JavaScript 代码如下:
[ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
Playbook
核心元素
-
Hosts 执行的远程主机列表
-
Tasks 任务集
-
Varniables 内置变量或自定义变量在playbook中调用
-
Templates 模板,即使用模板语法(参考附录jinja2语法)的文件,比如配置文件等
-
Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
-
tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
实例1:安装httpd
编写httpd.yaml文件
---
# install httpd
- hosts: web
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
- name: start httpd service
service: name=httpd state=started enabled=yes
检查语法,运行playbook
# 检查语法(后面不再赘述)
ansible-playbook -C httpd.yaml
# 运行
ansible-playbook httpd.yaml
实例2:安装mysql5.7
准备工作
# MySQL配置文件
[root@ansible ~]#cat my.cnf
[mysqld]
socket=/tmp/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
log-bin
pid-file=/data/mysql/mysqld.pid
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
# MySQL初始化
[root@ansible ~]#cat secure_mysql.sh
#!/bin/bash
/usr/local/mysql/bin/mysql_secure_installation <<EOF
y
y
y
y
y
EOF
# 官方下载源码包,略
-rw-r--r-- 1 root root 661214270 4月 5 21:57 mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
编写mysql.yaml文件
- hosts: all
remote_user: root
gather_facts: no
tasks:
- name: install packages
yum: name=libaio,perl-Data-Dumper,perl-Getopt-Long
- name: create mysql group
group: name=mysql gid=306
- name: create mysql user
user: name=mysql uid=306 group=mysql shell=/sbin/nologin system=yes create_home=no home=/data/mysql
- name: create path
file: name=/data/mysql state=directory owner=root group=root
- name: copy tar to remote host and file mode
unarchive: src=mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz dest=/usr/local/ owner=root group=root
- name: create linkfile /usr/local/mysql
file: src=mysql-5.7.32-linux-glibc2.12-x86_64 dest=/usr/local/mysql state=link
- name: data dir
shell: chdir=/usr/local/mysql/bin ./mysqld --initialize-insecure --user=mysql --datadir=/data/mysql > /root/mysql.txt
tags: data
- name: config my.cnf
copy: src=my.cnf dest=/etc/my.cnf
- name: service script
shell: /bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- name: enable service
shell: /etc/init.d/mysqld start;chkconfig --add mysqld;chkconfig mysqld on
tags: service
- name: PATH variable
copy: content='PATH=/usr/local/mysql/bin:$PATH' dest=/etc/profile.d/mysql.sh
- name: secure script
script: secure_mysql.sh
tags: script
运行playbook
# 目录结构
[root@ansible ~]# tree
├── anaconda-ks.cfg
├── install_mysql.yaml
├── my.cnf
├── mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz
└── secure_mysql.sh
# 执行playbook
ansible-playbook mysql.yaml
参考:
ansible:http://www.yunweipai.com/34658.html
yaml语法:https://www.runoob.com/w3cnote/yaml-intro.html
jinja2语法:http://www.yunweipai.com/34663.html