ansible(二)
一、ansible playbook应用概述
-
概述
playbook是ansible用于配置,部署和管理被控节点的剧本。他就是组织多个task的容器,他的实质就是一个文件,有着特定的组织格式,它采用的语法格式是YAML(Yet Another Markup Language); -
组成
playbook是由一个或多个play组成的列表,play的主要功能是为ansible中的task定义好一个角色,指定剧本对应的服务器组,组成一个完整的流程控制集合。 -
应用场景
执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作的时候,执行ad-hoc命令是不合适的,这时最好使用playbook。
就像执行shell命令写shell脚本一样,也可以理解为批处理任务
,不过playbook有自己的语法格式。
使用playbook可以方便的重用这些代码,可以移植到不同的机器上,像函数一样,最大化的利用代码。在使用ansible的过程中会发现,所处理的大部分操作都是编写playbook。可以把常见的应用都写成playbook,之后管理服务器便简单许多。
二、ansible playbook语法
-
YMAL格式是类似于JSON的文件格式,便于理解和阅读,同时便于书写。首先学习下YMAL的个格式。
- 文件的第一行应该以"---"(三个连字符)开始,表名YMAL文件的开始
- 在同一行中,#之后的内容表示注释,类似于shell,python和ruby
- YMAL中的列表元素以"-"开头然后紧跟着一个空格,后面为元素内容
- 同一个列表中的元素应该保持相同的缩进,否则会被当成错误处理
- play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格
--- #安装与运行MySQL服务 - hosts: slave1 remote_user: root task: - name: install mysql-server package yum: name=mysql-server state=present - name: startint mysqld service service: name=mysql state=started
我们的文件名称应该是以.yml结尾,像我们上面的例子就是mysql.yml。其中,由三部分组成
host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候--list-hosts选项会显示哪些主机将参与执行task的过程。
remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限
tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上,模块是必须的,同时也要给予模块相应的参数。
使用ansible-play运行playbook文件,得到如输出以下信息,输出内容为json格式。并且由不同颜色组成,便于识别,一般而言- 绿色代表执行成功,系统保持原样
- 黄色代表系统状态发生改变
- 红色代表执行失败,显示错误输出
执行有三个步骤:1、收集facts 2、执行tasks 3、报告结果
-
基础组件
-
ansible-playbook命令语法:
ansible-playbook <filename.yml>...[options]
[options]:
-C, --check:并不在远程主机上执行,只是测试
-i PATH, --inventory=PATH:资产的文件路径
--flush-cache:清楚fact缓存
--list-hosts:列出匹配的远程主机,并不执行任何动作
-t,TAGS, --tags=TAGS:运行指定的标签任务
--skip-tags:跳过指定的notify
- 远程主机通过playbook安装nginx
[root@ansible ~]# vi nginx_install.yaml
---
- hosts: 192.168.100.102
remote_user: root
tasks:
- name: nginxa
yum: name=pcre-devel,pcre,zlib-devel state=present
- name: nginxb
shell: cd /root; wget ftp://192.168.100.100/tools/nginx-1.12.2.tar.gz;tar zxvf /root/nginx-1.12.2.tar.gz -C /usr/src;cd /usr/src/nginx-1.12.2/;./configure --prefix=/usr/local/nginx;make;make install
- 利用playbook编写文件为远端主机安装http并配置其网页
---
- hosts: 192.168.100.103
remote_user: root
vars:
- pack: httpd
- serv: httpd
tasks:
- name: install httpd
yum: name={{ pack }} state=present
- name: copy html
copy: src=/tmp/index.html dest=/var/www/html/
notify:
- restart httpd
- name: start httpd services
shell: systemctl start httpd;systemctl enable httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
[root@ansible ansible]# echo "haohaoxuexi">/tmp/index.html
[root@ansible ansible]# ansible-playbook httpd.yml
[root@ansible ansible]# echo "tiantianxiangshang">/tmp/index.html
[root@ansible ansible]# ansible-playbook httpd.yml
- ansible循环基于列表items多值进行循环创建用户
---
[root@ansible ansible]# vim loop.yml
- hosts: 192.168.100.103
remote_user: root
tasks:
- name: create users
user: name={{ item }} state=present
with_items:
- test11
- test21
- test31
- ansible匹配节点的ip地址,批量修改主机名
[root@ansible ansible]# vim hostname.yml
---
- hosts: web
remote_user: root
tasks:
- name: show hostname
shell: hostname
- name: show ip
command: ip a
- hostname: name=web{{ ansible_default_ipv4.address.split('.')[-1] }}