ansible-playbook剧本

esec esec     2023-05-03     258

关键词:

一、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 复制 全屏

ansible-playbook剧本初体验(代码片段)

实验目的:通过ansible剧本对被管理端进行部署httpd服务,并且修改配置文件,启动服务。操作环境操作系统IP地址角色Centos7192.168.71.129ansible管理端Centos7192.168.71.130ansible被管理端Centos7192.168.71.131ansible被管理端实验步骤:安装ansible... 查看详情

ansible-playbook剧本基础(代码片段)

ansible的剧本是使用yaml语言进行编写的,基本语法如下:基本语法:1、大小写2、同级别要对齐,缩进表示层级3、缩进不允许使用Tab键4、缩进空格数不规定,相同元素区分即可支持的数据结构:1、对象:键值对集合,又称映射/哈... 查看详情

ansible-playbook剧本

一、playbookplaybook是剧本的意思通过task调用ansible的模块将多个play组织在一个playbook中运行。playbook本身由以下各部分组成:Tasks:任务,即调用模块完成的某操作Variables:变量Templates:模板Handlers:处理器,当某条件满足时,触发执行... 查看详情

你是自己的主角,写个ansible剧本,让架构搭建更容易(代码片段)

目标:重点命令单词syntax语法check检查,示例:对剧本语法检查ansible-playbook--syntax-checktasks任务,示例:列出任务ansible-playbook--list-taskstags标签,示例:ansible-playbook--list-tags:列出标签学 查看详情

ansible-playbook

playbook: 通过事先编写好的playbook文件实现批量管理操作 ===============ansible的任务集注意:1.yml中不可使用tabs键2.缩进对齐,严格控制缩进3.#表注释4.---开头 playbook文件 :是ansible主机用于配置,部署和管理托管主机... 查看详情

ansible-playbook 在设置时挂起

】ansible-playbook在设置时挂起【英文标题】:ansible-playbookhangsatsetup【发布时间】:2017-01-3115:37:01【问题描述】:我正在尝试运行ansible-plabook,但它在设置时挂起。我的剧本做了很多工作,比如调用不同的角色和模块,它还收集事... 查看详情

ansible-playbook批量部署zabbix

一、需求  机房每次增加一批服务器,一些初始环境变量,监控端,脚本,时间校对,配置文件参数修改等一系操作,刚开始按步就班,也用到一些脚本,高效性没能体现出来。现在升级到ansible,自动化部署应用,配置,... 查看详情

ansible-playbook一键化部署apache服务

原创chaos_oper最后发布于2019-06-1321:31:44阅读数463收藏展开Playbook(任务剧本)playbook是简单易用的自动化语言编排定义ansible任务集的配置文件,由ansible顺序依次执行,通常是JSON格式的*YML文件playbook是一个非常简单的配置管理和多... 查看详情

Ansible-playbook 针对不在清单文件中并包含组变量的任意主机运行

】Ansible-playbook针对不在清单文件中并包含组变量的任意主机运行【英文标题】:Ansible-playbookrunagainstarbitraryhostwhichisnotininventoryfileandincludegroupvars【发布时间】:2017-06-0419:10:33【问题描述】:当我以这种方式运行剧本runrole.yml时:a... 查看详情

ansible-playbook之修改ssh端口和limits参数控制

一、描述  拿到一批机器,需要做首先是修改ssh端口,防火墙配置,以及limits.conf控制文件描述符,进程数,栈大小等。二、剧本如下:---    - hosts: "{{ host }}"      remote_u... 查看详情

ansible

Ansibleansible ansible-doc ansible-playbook Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。其特性有:模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自... 查看详情

ansible-playbook实现mysql的二进制部署

  在第十周作业的《通过编译、二进制安装MySQL5.7》一篇中,笔者演示了如何利用二进制来完成指定版本的MySQL安装,但此种方法仅适用于单台主机,如果是企业中,要安装MySQL的主机数量很多,则费时费力。借助于运维自... 查看详情

ansible-playbook(代码片段)

...使用同样的缩进级别作为同一列表。who谁what事情how动作ansible-playbook命令格式ansible-playbook[option]filename常用选项:-C,--check模拟运行--list-hosts列出剧本主机清单[root@m01ansible_playbook]#ansible-playbook--list-hostsapache.yamlplaybook:apache.yamlplay# 查看详情

ansible-playbook(代码片段)

1.什么是playbook?playbook剧本<---文件YAMLplay找谁明星找那个主机web01task做什么干什么事情yumcopyservice找多个明星,做多件事情找一个明星,做多件事情2.playbook和Ad-Hoc的区别?3.Playbook三板斧?缩进冒号短横线(语法格式)2.1:使用playbook编... 查看详情

ansible-playbook基础(代码片段)

#roles跟调用角色的剧本文件应该与roles同级关系,即放在ansible目录下#makir/root/ansible/roles/nginx,http,ftp,mysql,redispalybook.ymlroles/project/tasks/定义task,role的基本元素,至少包含一个main.yml文件files/存放由copy或script模块等调用的文件vars/定... 查看详情

Ansible 使用循环将结果命令写入本地文件

...oop【发布时间】:2019-10-2805:32:10【问题描述】:我编写了ansible-playbook来收集来自许多网络设备的结果。下面的剧本工作正常。但是如果我必须用很多命令来收集结果。假设有20个命令,我必须创建许多任务来将结果写入我的剧本... 查看详情

ansible使用普通用户身份认证切换root权限执行剧本(ubuntu系统)(代码片段)

...reason将cybereason的deb包上传到ansible-server主机mkdir/etc/ansible/ansible-playbook/mkdir/datacd/datarz-E/data/cybereason-sensor-20.1.401.0-1.x86_64_ensoc-capitaland_ensoc-capitaland-r.cybereason.net_443_ACTIVE_NORMAL_deb.deb配置ansible主配置文件vim/etc/ansible/hosts[all:vars]##----Li... 查看详情

如何从ansible-playbook的bash-script启动后台循环(代码片段)

我正在创建一个简单的流量模拟器:一个每10秒钟卷曲一次Web服务器的客户端。客户端(Debian)和WebServer使用Ansible进行配置。Ansible-SSH连接关闭后,后台循环将关闭。起初我启动了命令:$whiletrue;docurlpython_webserver:8000;sleep10;done<... 查看详情