playbook是一个由yml语法编写的文本文件,它由play和task两部分组成。
play: 主要定义要操作主机或者主机组
task: 主要定义对主机或主机组具体执行的任务,可以是一个任务,也可以是多个任务
playbook简单理解就是把ad-hoc多个模块都统一写到一个文件里面,然后根据自己的需求来自定义编排要使用哪些功能,第一步使用哪些功能,第二步使用哪些功能……
Playbook通过yaml语法识别描述的状态文件,扩展名是yaml。
yamI三板斧
缩进: yaml使用一个固定的缩进风格表示层级结构,每个缩进由两个空格组成,不能使用tab键
冒号: 以冒号结尾的除外,其他所有冒号后面所有必须有空格。
短横线: 表示列表项,使用一个短横线加一个空格作为一个列表项,多个项使用同样的缩进级别作为同一列表。
#比如我们写了一个yaml文件
vim apache_install.yaml
#文件内容如下:
#这是一个ansible的playbook
#第一步: 找到谁,hosts: 定义主机清单,ansible的hosts文件里定义的主机清单模块名
#第二步: 大概做的任务: 安装,配置,启动
#第三步: 具体怎么做
#name: 描述信息,task里有3个同级别的列表步骤
#yum: 远端安装服务,yum模块安装服务(installed)
#copy: 远端拷贝文件,copy模块传送文件到远端
#service: 远端启动服务(started)
#remote user: root 是指定远程主机上使用的用户
#gather facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率- hosts: test #第一行,定义主机清单test
remote user: root #第二行写入就需要空两个空格,表示本行内容属于上面第一行
gather facts: no #注意冒号后面都需空格,以冒号为变量定义相关内容
tasks:
- name: install apache fuwu #一个横杆+一个空格代表一个任务
yum: name=apache,apache-tools state=installed #调用yum模块
- name: configure apache fuwu #第二个任务
copy: src=/root/apache.conf dest=/etc/apache/conf/apache.conf #调用copy模块notify: Restart apache fuwu #重启定义的apache服务
- name: create share data directory #创建一个共享目录,file模块创建目录赋予权限
file: path=/data state=directory recurse=yes owner=root group=root mode=755
- name: qidong apache fuwu #第三个任务
service: name=apache state=started enabled=yes #调用service模块handlers:
- name: Restart apache fuwu #名字定义为重启Apache服务
service: name=apache state=restarted #调用service服务,名字是apache,任务是重启
ansible-playbook常用命令
#执行yaml文件,格式:ansible-playbook "yaml文件"
ansible-playbook apache_install.yaml
#检查语法是否错误,格式:ansible-playbook --syntax-check "yaml文件"
ansible-playbook --syntax-check apache_install.yaml
#模拟执行,不是真的直接执行,格式:ansible-playbook -C "yaml文件"
ansible-playbook -C apache_install.yaml
案例:批量安装源码nginx服务
#编写一个yaml文件
vim nginx.yaml
#输入以下内容
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的
#service: service模块,远程管理服务的
#remote_user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率#使用前先将相关软件包: nginx压缩包和jdk压缩包上传到/root/ansible-playbook-nginx/目录中
- hosts: test
remote user: root
gather_facts: no
vars: #定义变量,为变量赋值,方便后期修改升级,后期只需修改此处
src_nginx: /root/ansible-playbook-nginx/nginx-1.23.3.tar.gz #安装包在哪里
nginx_jieya_dir: /usr/local #解压后的路径在哪里,解压到远端local下
nginx_install_dir: /usr/local/nginx #安装在哪里
nginx_jieyahou_name: nginx-1.23.3
tasks:#上传nginx压缩安装包到: /root/ansible-playbook-nginx/,提前操作
#安装编译工具和相关依赖
#- name: Install gcc gcc-c++ and yilai
# yum: name={{ item }} state=installed
# with items:
# - gcc
# - gcc-c++
# - openssI-devel
# - openssl
# - zlib
# - zlib-devel# - pcre
# - pcre-devel
#注意:下面yum安装依赖方式也可用上面方式安装
#安装编译工具和相关依赖- name: Install gcc gcc-c++ and yilai
yum: name=gcc,gcc-c++,openssl-devel,openssl,zlib,zlib-devel,pcre,pcre-devel,vim,wget state=installed#解压nginx压缩包
- name: Unarchive nginx package
unarchive: #调用unarchive模块解压
src: "{{ src_nginx }}" #调用上面的src_nginx变量dest: "{{ nginx_jieya_dir }}" #调用上面nginx_jieya_dir变量,解压后的路径
#配置编译nginx
- name: config and bianyi nginxshell: useradd -s /sbin/nologin nginx && #远程执行命令,创建一个用户
cd {{ nginx_jieya_dir }} && #进入到这个解压目录
cd {{ nginx_jieyahou_name }} && #nginx解压后的名称
./configure --user=nginx --group=nginx --prefix={{ nginx_install_dir }} --with-http_stub_status_module --with-http_ssl_module&&
make && make install #进行安装
#启动nginx
- name: Start nginx
shell: /usr/local/nginx/sbin/nginx
#注意上面解压也可用另一种方式: shell命令
#- name: Unarchive tomcat package
# copy: src=/root/ansible-playbook-deploy-tomcat/apache-tomcat-8.0.32.tar.gz dest=/tmp)
#- name: Unarchive tomcat
# shell: cd /tmp && tar -zxf apache-tomcat-8.0.32.tar.gz
案例2:远程批量安装二进制tomcat服务
#编写一个yaml文件
vim tomcat.yaml
#输入以下内容
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的#service: service模块,远程管理服务的
#remote user: root 是指定远程主机上使用的用户
#gather_facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率
#使用前先将相关软件包: tomcat压缩包和jdk压缩包上传到/root/ansible-playbook-tomcat/目录中
- hosts: test
remote_user: root
gather_facts: no
vars:
src_jdk: /root/ansible-playbook-tomcat/jdk-8u65-linux-x64.gz
jdk_install_dir: /usr/local/
jdk_jieyahou_name: jdk1.8.0_65
src_tomcat: /root/ansible-playbook-tomcat/apache-tomcat-8.0.32.tar.gz
tomcat_install_dir: /usr/local/
tomcat_jieyahou_name: apache-tomcat-8.0.32tasks:
#上传jdk压缩安装包到: /root/ansible-playbook-tomcat/,提前操作#解压idk压缩包
- name: Unarchive jdk package
unarchive:
src: "{{ src_jdk }}"
dest: "{{ jdk_install_dir }}"
#配置idk环境变量
- name: set jdk global envshell: echo '"export JAVA_HOME=/usr/local/{{ jdk_jieyahou_name }}"' >> ~/.bashrc &&
echo "'export PATH=$JAVA_HOME/bin:$PATH"' >> ~/.bashrc &&
echo '"export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"' >> /.bashrc && source ~/.bashrc #这上面都是在配置环境变量,将jdk变量设置到相应的全局变量文件里面
#有yum源时idk也可采用下面方式安装
#安装idk环境
#- name: Install jdk1.8
# yum: name=java-1.8.0-openjdk state=installed
#上传tomcat软件包到/root/ansible-playbook-deploy-tomcat/目录,提前操作
#解压tomcat软件包
- name: Unarchive tomcat package
unarchive:
src: "{{ src_tomcat }}"
dest: "{{ tomcat_install_dir }}"#start tomcat,注意: tomcat首次启动需要用 nohup./startup.sh & 或 nohup./catalina.sh & 启动,如果直接使用/...../tomcat../bin)startup.sh则启动不了
- name: Start tomcat
shell: cd "{{ tomcat_install_dir }}" && cd "{{ tomcat_jieyahou_name }}"/bin && nohup./startup.sh &#注意上面解压也可用另一种方式: shell命令
#- name: Unarchive tomcat package# copy: src=/root/ansible-playbook-tomcat/apache-tomcat-8.0.32.tar.gz dest=/tmp/
#- name: Unarchive tomcat
# shell: cd /tmp && tar -zxf apache-tomcat-8.0.32.tar.gz
案例3:远程批量安装二进制mysql5.7服务
#创建一个mysql启动文件,方便统一交给systemd管理
vim mysqlld.service
#输入内容如下
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.targetAfter=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/data/mysql5.7/bin/mysqld --defaults-file=/etc/my.cnfLimitNOFILE = 15000
#创建一个mysql的配置文件
vim mysql.conf
#输入内容如下
[client]
port = 3306
[mysqld]
basedir=/data/mysql5.7/ #指定它的base安装目录是哪个datadir=/data/mysql5.7/data/ #指定它的数据目录是哪个
user = mysql #用户port = 3306 #端口
character-set-server = utf8collation-server = utf8_general_ci
open_files_limit = 10240
back_log = 600
log-bin=mysql-bin #定义它的log-bin,开启log-bin
read_only = 0
expire_logs_days = 8
max_connections = 3000
max_connect_errors = 6000
max_allowed_packet = 32M
thread_cache_size = 300
query_cache_min_res_unit = 2k
transaction_isolation = READ-COMMITTED
tmp_table_size = 256Mmax_heap_table_size = 256M
key_buffer_size = 1024M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 6G
group_concat_max_len = 102400
skip-name-resolve
lower_case_table_names = 1log_error = /data/mysql5.7/log/mysql_error.log
slow_query_log = ON
slow_query_log_file = /data/mysql5.7/log/mysql_slow.log
#socket = /data/mysql5.7/mysql.sock
long_query_time = 3
log_timestamps = SYSTEM
server-id = 2#replicate_do_db=test_yzc_crm
innodb_buffer_pool_size = 2048M
#innodb_data_file_path = ibdata1:1024M:autoextend
innodb_data_file_path = ibdata1:76M:autoextend
innodb_thread_concurrency = 8
innodb_flush _log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb _log_file_size = 128M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 75
innodb_lock_wait_timeout = 120
innodb_file_per_table = 1
#skip-grant-tables
relay-log=mysql-relay
relay-log-index=mysql-relay.index
relay_log_info_repository=TABLE
[mysqldump]
quickmax_allowed_packet = 32M
[mysqld_safe]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES#编写一个yaml文件
vim mysql.yaml
#输入内容如下
#test: 为/etc/ansible/hosts中的主机列表 #task: 执行的任务
#name: 描述信息 #yum: yum模块,安装服务的
#copy: copy模块,远程传递文件的 #file: file模块,远程创建目录的#service: service模块,远程管理服务的
#remote user: root 是指定远程主机上使用的用户
#qather facts: no 是默认执行playbook时候,默认会收集目标主机的信息,禁用掉能提高效率#使用前先将相关软件包: mysql压缩包和jdk压缩包上传到/root/ansible-playbook-mysql5.7/目录中
- hosts: test
remote user: root
gather facts: no
vars:
src_mysql: /root/ansible-playbook-mysql5.7/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
mysql_install_dir: /data/mysql5.7
mysql_data_dir: /data/mysql5.7/data
mysql_log_dir: /data/mysql5.7/log #日志路径
mysql_yasuo_package_name: mysql-5.7.19-linux-glibc2.12-x86_64.tar.gzmysql_jieyahou_name: mysql-5.7.19-linux-glibc2.12-x86_64
config_mysql: /root/my.conf #conf配置文件路径
service_mysql: /root/mysqld.service #service文件路径tasks:
#上传mysql压缩安装包到: /root/ansible-playbook-mysql5.7/,提前操作#安装相关依赖
- name: yilai
yum: name=libaio-devel state=installed
#传输mysql压缩包
- name: transfer mysql packagecopy: src={{ src_mysql }} dest=/opt/ #拷贝压缩包到指定路径
#解压mysql压缩包并移动
- name: Unarchive mysql package
shell: mkdir /data &&
cd /opt/ && tar -zxf {{ mysql_yasuo_package_name }} && #移动到目录解压压缩包
mv {{ mysql_jieyahou_name }} {{ mysql_install_dir }} #解压过后将名字修改移动
#创建mysql用户,数据目录和日志目录,并设置权限
- name: create mysgl user log data
shell: useradd -s /sbin/nologin mysql &&
mkdir {{ mysql_data_dir }} && #创建数据存储目录
mkdir {{ mysql_log_dir }} && #创建日志存储目录
chown -R mysql.mysql {{ mysql_install_dir }} && #对目录进行授权
echo '"export PATH=/data/mysql5.7/bin/:$PATH"' >> ~/.bashrc && #全局变量授权
source ~/.bashrc
#准备mysql配置文件,传输过去
- name: transfer my.conf
copy: src={{ config_mysql }} dest=/etc #传输配置文件到远程客户端#初始化mysql
- name: init mysql
shell: mysqld --initialize --user=mysql --basedir={{ mysql_install_dir }} --datadir={{ mysql_data_dir }}#准备mysqld.service文件,传输过去,交给systemctl管理服务
- name: transfer mysqld.service
copy: src={{ service_mysql }} dest=/etc/systemd/system/ #传输service文件
#刷新service文件和启动mysgl
- name: flush service conf
shell: systemctl daemon-reload &&
systemctl enable mysqld &&
systemctl start mysqld#修改mysql的登录密码,初始化安装后的mysql,初始密码会在相应日志文件中,mysql_error.log中过滤password可以找出初始密码进行登录
然后登录mysql,使用set password='xx';修改密码#下面在脚本中,非交互式登录mysql时,获取不到密码变量的密码,可以手动登录修改密码
#- name: change mysql password wei '123456'
# shell: init_mysql_pass='cat /data/mysql5.7/log/mysql_error.log | grep password | awk '{print $NF}' &&
# mysql -uroot -p'${init_mysql_pass}' -e "set password='123456';"
#注意上面解压也可用另一种方式: shell命令
#- name: Unarchive tomcat package
# copy: src=/root/ansible-playbook-mysql/mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz dest=/tmp/
#- name: Unarchive tomcat
# shell: cd /tmp && tar -zxf mysql-5.7.19-linux-glibc2.12-x86_64.tar.gz
结合ansible命令ad-hoc的各种模块,编写playbook脚本,实现批量安装、卸载、启动、停止、挂载等各种复杂工作.