ansible-playbook
介绍:
playbook剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
playbook是ansible用于配置,部署,和管理被控节点的剧本。通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。
playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
- 将多个要执行ansible操作安装顺序整合到一个文件中,这个文件就是yaml
- 执行yaml文件的方法是通过ansible-playbook执行
yaml文件
yaml文件中的元素
- 变量
- 循环
- 判断
变量
变量命名规则
- 只能以字母为开头
- 构成只能有数字、字母、下划线
变量类别
- 自定义
- 内置变量
获取内置变量
[root@localhost ~]# ansible all -m setup
执行a.yaml,同时传递变量name=tom,age=20
[root@localhost ~]# ansible-playbook a.yaml --extra-vars "name=tom, age=20"
案例:安装httpd,要求设置apache的端口为808,网站跟目录/myweb
- host: all # 指定要操作的主机组
remoute_user: root # 指定在远程主机上以哪个用户身份执行tasks
vars: # 定义变量
- port: 808 # 变量名、变量值
- root: /myweb # 变量名、变量值
tasks: # 指定要执行的操作列表
- name: install httpd # 设置一个名称,用于给用户提示正在执行操作
yum: name=httpd state=latest # yum是模块名,后面是参数
- name: start httpd
service: name=httpd state=started # service是模块名,后面的参数
yaml文件中主要构成
- host:
- tasks:
- vars:
- remote_user:
案例:通过一个yaml文件实现如下要求:
在被管理主机上新建一个用户组,组名mygp1,组id是800
再在每个被管理主机上新建用户tom01,将tom加入到这个组中
将当前主机上/etc/inittab分发到所有被管理主机的/tmp下
# 创建yaml文件
[root@localhost ~]# vim user.yaml
- hosts: all
remote_user: root
tasks:
- name: create gropu
group: name=mygp1 gid=800 state=present
- name: create user
user: name=tom group=mygp1 state=present
- name: send file
copy: src=/etc/inittab dest=/tmp
# 执行yaml文件
[root@localhost ~]# ansible-playbook user.yaml
案例1:在所有被管理节点安装httpd,然后启动httpd
- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
- name: start httpd
service: name=httpd state=started enabled=true
触发器
- 让一个task在特定的情况下才会被执行
案例2:在所有被管理节点安装httpd,然后启动httpd,要求httpd启动端口是8080
- hosts: all
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=present
- name: start httpd
service: name=httpd state=started enabled=true
- name: send httpd.conf
copy: src=/root/httpd.conf.template dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
yaml使用变量
(1)自定义变量
- hosts: all
remote_user: root
vars:
- package_name: mysql-server # mariadb-server
- service_name: mysqld # mariadb
tasks:
- name: install mysql server
yum: name={{ package_name }} state=latest
- name: start mysql server
service: name={{ service_name }} state=started
(2)使用ansible的内置变量
案例:
在每个被管理主机上创建一个用户,用户名和主机名相同
在每个被管理主机上创建一个和主机同名的目录
# 查询内置变量
[root@localhost ~]# ansible all -m setup | grep fqdn
"ansible_fqdn": "centos6-2",
[root@localhost ~]# cat c.yaml
- hosts: all
tasks:
- name: create user
user: name={{ ansible_fqdn }} state=present
- name: create file
file: name=/tmp/{{ ansible_fqdn }} state=touch
(3)主机清单变量
# 定义主机变量
[webservers]
11.11.11.12 userid=1050
11.11.11.13 userid=1060
# 定义主机组变量
[webservers:vars]
username=jerry
- hosts: all
tasks:
- name: create user
user: name={{ username }} uid={{ userid }} state=present
template
- template称为模板
- 模板的用处是用来动态生成服务的配置文件
判断
- 格式:when 条件
- 做用:判断满足条件,才执行操作
案例:用playbook实现如下功能
1:在所有被管理主机上安装zsh
2:在主机名为centos7-2的主机上创建用户tom3,其他主机不创建
- hosts: all
tasks:
- name: install zsh
yum: name=zsh state=present
- name: create user tom3
user: name=tom3 state=present
when: ansible_fqdn == "centos7-5"
循环
格式:
- 内置变量:item
- 循环格式:with_items 列表
注意:
- playbook中的循环一般用于循环次数少,而且简单的情况
- 循环次数多,而且复杂,肯定是在本地创建shell脚本,然后使用script模块执行
案例:在所有被管理主机上创建5个用户u1 u2 u3 u4 u5
- hosts: all
tasks:
- name: create user
user: name={{ item }} state=present
with_items:
- u1
- u2
- u3
- u4
- u5
tags
作用:给某个task设置一个表情,用于仅仅执行某个task
案例:
- hosts: all
tasks:
- name: isntall
shell: yum install httpd -y
- name: send file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
tags:
- senfile
- name: start httpd
shell: systemctl start httpd
handlers:
- name: restart httpd
shell: systemctl restart httpd
[root@localhost ~]# ansible-playbook 4.yaml --tags="senfile"
amsbile-playbool应用1
安装ansible并配置远程主机免密连接
[root@master ~]# yum install epel-release -y
[root@master ~]# yum install ansible -y
[root@master ~]# ssh-keygen -t rsa
[root@master ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.31.64
[root@master ~]# vi /etc/ansible/hosts
[server]
192.168.31.64
2)(编写lnmp.yml,以下所有操作必须写在playbook中)
准备php测试页面
[root@master ~]# vi /roo/a.php
<?php
phpinfo();
?>
准备nginx配置文件
[root@master ~]# yum install epel-release -y
[root@master ~]# yum install nginx -y
[root@master ~]# cp /etc/nginx/nginx.conf.default /root/nginx.conf
修改三个位置
location / {
root /var/www/html;
index index.html index.htm;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
编写yaml文件
- hosts: all
tasks:
- name: create dir
shell: mkdir -pv /var/www/html
- name: install basic soft
shell: yum install make gcc gcc-c++ zlib-devel pcre-devel ncurses-devel -y
- name: send nginx package
copy: src=/root/nginx-1.17.10.tar.gz dest=/usr/local/
- name: install nginx
shell: cd /usr/local/ && tar xf nginx-1.17.10.tar.gz && cd nginx-1.17.10 && ./configure --prefix=/usr/local/nginx && make && make install
- name: send nginx.conf
copy: src=/root/nginx.conf dest=/usr/local/nginx/conf/nginx.conf
- name: start nginx
shell: /usr/local/nginx/sbin/nginx
- name: install php and mysql
shell: yum install php-fpm mariadb-server -y
- name: start php and mysql
shell: systemctl start php-fpm && systemctl start mariadb
- name: send test page
copy: src=/root/a.php dest=/var/www/html
使用ansible模块分发源码包、安装包
3)使用ansible模块安装nginx依赖环境
4)编译安装nginx
5)推送配置文件并启动nginx
6)安装mysql和php相关服务
7)配置nginx和php整合
8)重启nginx并配置php测试页面为hello world
9)成功运行playbook
[root@master ~]# ansible-playbook a.yaml