ansible-playbook剧本

发布时间 2023-05-03 05:35:42作者: esecpe

一、playbook

playbook是剧本的意思
通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。
playbook本身由以下各部分组成:

Tasks: 任务,即调用模块完成的某操作
Variables: 变量
Templates: 模板
Handlers: 处理器,当某条件满足时,触发执行的操作
Roles: 角色
playbook yaml语法是换行空两格,-和:后必须空一格
playbook由YMAL语言编写,YAML是一种非标记语言。是用来写配置文件的语言,非常简洁合强大

YAML语法和其他语言类似,也可以表达散列表、标量等数据结构
结构通过空格来展示,
序列里配置项通过 - 来表示
Map里的键值用:来分隔
YAML的扩展名为yaml

1、playbook简介

Playbooks 是 Ansible的配置、部署、编排语言,他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合
Playbooks 与 ad-hoc相比,是一种完全不同的运用ansible的方式,是非常之强大的。
简单来说,playbooks是一种简单的配置管理系统与多机器部署系统的基础,与现有的其他系统有不同之处,且非常适合于复杂应用的部署。
playbook是ansible用于配置,部署,和管理被控节点的剧本。
通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态。playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。
也可以这么理解,playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,这次由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情

2、playbook使用场景

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook。
就像执行shell命令与写shell脚本一样,也可以理解为批处理任务,不过playbook有自己的语法格式。
使用playbook你可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。在你使用Ansible的过程中,你也会发现,你所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单。

3、yaml基本语法规则

1、大小写敏感
2、使用缩进表示层级关系
3、缩进时不允许使用tab键、只允许使用空格
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

hosts 定义节点,可以是组
remote_user 是你以什么用户身份进行登陆
tasks 是你的任务
become:yes 表示切换用户
become_user: mysql 表示切换到mysql用户,配合上一条使用
- name: 为下面执行的操作起名

4、yaml支持的数据结构

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)
纯量:单个的、不可再分的值

5、yaml支持的数据结构

对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes)/ 字典(dictionary)
数组:一组按次序排列的值,又称为序列(sequence)/ 列表(list)
纯量:单个的、不可再分的值

回到顶部

二、操作示例一

 编写yaml文件也就是playbook

vim test1.yaml
---                                                                   
   - name: first play                                                   
     gather_facts: false                                                    
     hosts: webservers                                                     
     remote_user: root                                                      
     tasks:                                                                 
     - name: test connection                                                
       ping:                                                                 
     - name: disable selinux
       command: '/sbin/setenforce 0'                                           
       ignore_errors: True                                                     
     - name: disable firewalld
       service: name=firewalld state=stopped                                   
     - name: install httpd
       yum: name=httpd state=latest
     - name: install configuration file for httpd
       copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf              
       notify: "restart httpd"                                                 
     - name: start httpd service
       service: enabled=true name=httpd state=started
     handlers:                                                               
     - name: restart httpd                                                   
       service: name=httpd state=restarted

##Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。

 修改配置文件并放入/opt/目录下

vim httpd.conf         #在/opt/目录下放入修改之后的配置文件
  
#42行,指定端口
Listen 8080
#95行,指定域名
ServerName www.lnj.com:8080

 

 运行playbook

ansible-playbook test1.yaml
//补充参数:
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
ansible-playbook test1.yaml --syntax-check                         
ansible-playbook test1.yaml --list-task                            
ansible-playbook test1.yaml --list-hosts                           
ansible-playbook test1.yaml --start-at-task='install httpd'        

三、操作实例二:定义、引用变量

- name: second play
  hosts: dbservers
  remote_user: root
  vars:                                                                       
    - groupname: mysql                                                        
    - username: nginx
  tasks:
    - name: create group
      group: name={{groupname}} system=yes gid=306                               
    - name: create user
      user: name={{username}} uid=306 group={{groupname}}
    - name: copy file
      copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt                  
 
ansible-playbook test2.yaml -e "username=nginx"   

回到顶部

四、操作示例三:指定远程主机sudo切换用户

---
- hosts: dbservers
remote_user: long
become: yes #2.6版本以后的参数,之前是sudo,意思为切换用户运行
become_user: root #指定sudo用户为root
执行playbook时:ansible-playbook test3.yaml -K <密码>

回到顶部

五、playbook的模块

Templates 模块

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

先准备一个以 .j2 为后缀的 template 模板文件,设置引用的变量

cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
 
vim /opt/httpd.conf.j2
Listen {{http_port}}            #42行,修改
ServerName {{server_name}}  #95行,修改
DocumentRoot "{{root_dir}}"     #119行,修改 <Directory "{{root_dir}}">     #131修改 配置目录访问权限

 修改主机清单文件,使用主机变量定义一个变量名相同,而值不同的变量

vim /etc/ansible/hosts
[webservers]
192.168.20.100 http_port=192.168.20.100:80 server_name=www.mcl.com:80 root_dir=/etc/httpd/htdocs
 
[dbservers]
192.168.20.110 http_port=192.168.20.110:80 server_name=www.mcl.com:80 root_dir=/etc/httpd/htdocs

编写 playbook

vim apache.yaml
---
- hosts: all
  remote_user: root
  vars:
   - package: httpd
   - service: httpd
  tasks:
  - name: install httpd package
    yum: name={{package}} state=latest
  - name: install configure file
    template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板
    notify:
      - restart httpd
  - name: create root dir
    file: path=/etc/httpd/htdocs state=directory
  - name: start httpd server
    service: name={{service}} enabled=true state=started
 handlers:
  - name: restart httpd
    service: name={{service}} state=restarted
 
ansible-playbook apache.yaml

 

回到顶部

六、tags 模块

可以在一个playbook中为某个或某些任务定义“标签”,在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。
playbook还提供了一个特殊的tags为always。作用就是当使用always当tags的task时,无论执行哪一个tags时,定义有always的tags都会执行。

vim webhosts.yaml
---
- hosts: webservers
  remote_user: root
  tasks:
   - name: Copy hosts file
     copy: src=/etc/hosts dest=/opt/hosts
     tags:
       - only                                                       
   - name: touch file
     file: path=/opt/testhost state=touch
     tags:
       - always                                                      
 
ansible-playbook webhosts.yaml --tags="only"
回到顶部

七、Roles 模块

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

roles 的目录结构:

cd /etc/ansible/
tree roles/
roles/
├── web/
│ ├── files/
│ ├── templates/
│ ├── tasks/
│ ├── handlers/
│ ├── vars/
│ ├── defaults/
│ └── meta/
└── db/
├── files/
├── templates/
├── tasks/
├── handlers/
├── vars/
├── defaults/
└── meta/  

 roles 内各目录含义解释

●files
用来存放由 copy 模块或 script 模块调用的文件。

●templates
用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。

●tasks
此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用 include 包含其它的位于此目录的 task 文件。

●handlers
此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。

●vars
此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。

●defaults
此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。

●meta
此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

在一个 playbook 中使用 roles 的步骤:

(1)创建以 roles 命名的目录

mkdir /etc/ansible/roles/ -p        #yum装完默认就有

(2)创建全局变量目录(可选)

mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/lnmp     #文件名自己定义,引用的时候注意

(3)在 roles 目录中分别创建以各角色名称命令的目录,如 nginx、mysql、php

mkdir /etc/ansible/roles/nginx
mkdir /etc/ansible/roles/mysql
mkdir /etc/ansible/roles/php

4)在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建

mkdir /etc/ansible/roles/nginx/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta}

(5)在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名

touch /etc/ansible/roles/nginx/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

(6)修改 site.yml 文件,针对不同主机去调用不同的角色

vim /etc/ansible/site.yml
---
- hosts: webservers
  remote_user: root
  roles:
    - nginx
    - mysql
    - php

(7)运行 ansible-playbook

cd /etc/ansible
ansible-playbook site.yml
回到顶部

八、roles在LNMP中的应用

编写nginx模块

写一个简单的tasks/main.yml

vim /etc/ansible/roles/nginx/tasks/main.yml
- name: install nginx
  yum: name={{pkg}} state=latest
- name: start
  service: enabled=true name={{svc}} state=started

//定义变量:可以定义在全局变量中,也可以定义在roles角色变量中,一般定义在角色变量中

vim /etc/ansible/roles/nginx/vars/main.yml
pkg: nginx
svc: nginx

这里我们定义在角色变量中

编写mysql模块

vim /etc/ansible/roles/mysql/tasks/main.yml
- name: install mysql
  yum: name={{pkg}} state=latest
- name: start mysql
  service: enabled=true name={{svc}} state=started
 
vim /etc/ansible/roles/mysql/vars/main.yml
pkg:
 - mariadb
 - mariadb-server
svc: mariadb

编写php模块

vim /etc/ansible/roles/php/tasks/main.yml
- name: install php
  yum: name={{pkg}} state=latest
- name: start php-fpm
  service: enabled=true name={{svc}} state=started
 
vim /etc/ansible/roles/php/vars/main.yml
pkg:
 - php
 - php-fpm
svc: php-fpm
YAML 复制 全屏