Linux企业级——Ansible-playbook的简介及应用

1.playbook(剧本)的介绍

1.1 简介

playbook是 一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。

1.2 核心元素

Tasks:任务,由模板定义的操作列表
Variables:变量
Templates:模板,即使用模板语法的文件
Handlers:处理器 ,当某条件满足时,触发执行的操作
Roles:角色

1.3 主要组成部分的介绍
1.3.1 hosts和users

在playbook中的每一个play都可以选择在哪些服务器和以什么用户完成,hosts一行可以是一个主机组、主机、多个主机,中间以冒号分隔,可使用通配模式。

1.3.2 Tasks(任务)

1.Play的主体部分是tasks列表,tasks列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。在运行playbook时(从上到下执行),如果一个host执行tasks失败,整个tasks都会回滚,修正playbook中的错误,然后重新执行即可。Tasks的目的是使用指定的参数执行模块,而在模块参数中可以使用变量,模块执行时幂等的,这意味着多次执行是安全的,因为其结果一致。
2.每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
3.定义一个task,常见的格式:”module: options” 例如:yum: name=httpd
4.ansible的自带模块中,command模块和shell模块无需使用key=value格式

1.3.3 Handlers(触发器)

1.handlers也是一些task的列表,和一般的task并没有什么区别。

2.是由通知者进行的notify,如果没有被notify,则Handlers不会执行,假如被notify了,则Handlers被执行

3.不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次

1.3.4 Templates(模板)

Jinja是基于Python的模板引擎。template类是Jinja的另一个重要组件,可以看作一个编译过的模块文件,用来生产目标文本,传递Python的变量给模板去替换模板中的标记。

2.playbook的实际应用

实验环境:

虚拟机名称

ip

版本

角色

server1

172.25.66.1

7.5

ansible

server2

172.25.66.2

7.5

远程主机hosts

server3

172.25.66.3

7.5

远程主机hosts

前期准备:

ansible运行yml文件 ansible运行playbook_apache

vim .vimrc		#编辑.vimrc文件,设定缩进
autocmd FileType yaml setlocal ai ts=2 sw=2 et		#设定Tab为两个空格
2.1 安装apache服务
2.1.1 编写inventory主机文件
vim /home/devops/ansible/hosts		#编辑组文件
[localhost]
172.25.66.1

[test]
172.25.66.2

[db]
172.25.66.3

[webserver:children]
test
db

[webserver:vars]
http_port=80

ansible运行yml文件 ansible运行playbook_apache_02

2.1.2 配置文件
在server2安装httpd服务:
yum install httpd -y

ansible运行yml文件 ansible运行playbook_apache_03

从server2给server1发送httpd.conf文件:
scp /etc/httpd/conf/httpd.conf devops@server1:/home/devops/ansible/apache

ansible运行yml文件 ansible运行playbook_ansible运行yml文件_04

添加默认发布文件index.html:
vim index.html

ansible运行yml文件 ansible运行playbook_html_05

ansible运行yml文件 ansible运行playbook_ansible运行yml文件_06

2.1.3 创建playbook文件install.yml
mkdir /home/devops/ansible/apache 	 #创建一个目录,将所有文件放到一起
cd apache		#进入apache目录
vim install.yml  	#编辑yml文件
---
- hosts: test
  vars:    #定义变量,只有组文件中的test组主机可使用
    - http_port:  80		#端口为80
  tasks:	#定义任务
    - name: install apache 	 #安装apache
      yum:
        name: httpd
        state:  present
    - name: config apache  	#配置apache
      template:
        src:  /home/devops/ansible/apache/httpd.conf.j2   #j2模板
        dest: /etc/httpd/conf/httpd.conf
      notify: restart apache		#重启apache触发器

    - name: start apache  #开启apache服务
      service:
        name: httpd
        state:  started
        
    - name: create index.html   #添加默认发布文件
      copy:
        src:  /home/devops/ansible/apache/index.html
        dest: /var/www/html/index.html

    - name: start firewalld 	 #开启防火墙
      service:
        name: firewalld
        state:  started

    - name: config firewalld   #防火墙配置,添加服务
      firewalld:
        service: http
        state: enabled
        permanent: yes
        immediate: yes
  handlers:   #触发器
    - name: restart apache		#重启apache服务
      service:
        name: httpd
        state:  restarted

- hosts: localhost  #测试
  vars:	
    - http_port: 80  #重新定义变量
  become: false
  tasks:
    - name:  test apache
      uri:
        url: http://172.25.66.2:{{ http_port }}
        return_content: yes
2.1.4 修改httpd.conf.j2中的监听端口

ansible运行yml文件 ansible运行playbook_html_07

2.1.5 执行playbook : ansible-playbook apache/install.yml

ansible运行yml文件 ansible运行playbook_apache_08

2.1.6 测试

ansible运行yml文件 ansible运行playbook_apache_09