Linux-ansible之Playbook简单应用

一、Playbook简介

playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,可以让远程主机达到预期状态,也可以说,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

ansible使用playbook来管理自动化task,playbook是yaml格式的文件,其基本内容可以认为是多条ansible的ad-hoc的语句组成。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,是用yaml(Yet Another Markup Language)语言编写的文件,有着特定的组织格式。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便,YAML语法能够简单的表示散列表,字典等数据结构。

playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。

二、Playbook核心元素(背会)

  • Hosts 执行的远程主机列表

  • Tasks 任务集

  • Varniables 内置变量或自定义变量在playbook中调用

  • Templates 模板,即使用模板语法的文件,后缀.j2,比如配置文件等

  • Handlers 和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行

  • tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码

三、Playbook语法

playbook使用yaml语法格式,后缀可以是yaml,也可以是yml

  • 一般情况下,一个playbook需要使用"---"开始。
  • 在单一一个playbook文件中,可以连续三个连子号(---)区分多个play。还有选择性的连续三个点号(...)用来表示play的结尾,也可省略。

  • 次行开始正常写playbook的内容,一般都会写上描述该playbook的功能

  • 使用#号注释代码

  • 缩进必须统一,不能空格和tab混用

  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的

  • YAML文件内容和Linux系统大小写判断方式保持一致,是区分大小写的,k/v的值均需大小写敏感

  • k/v的值可同行写也可以换行写。同行使用<span style="background-color:red;">: </span>分隔

  • v可以是个字符串,也可以是一个列表[]

极简版


  • name: 标准 Playbook

hosts: all

gather_facts: true

become: yes

vars:

app_name: myapp

app_port: 80

tasks:

  • name: 安装 Nginx

package:

name: nginx

state: present

  • name: 启动服务

service:

name: nginx

state: started

enabled: yes

handlers:

  • name: 重启 Nginx

service:

name: nginx

state: restarted

...

测试运行: ansible-playbook -C nginx.yml

真正运行: ansible-playbook nginx.yml

常用命令:

复制代码
  ansible-playbook filename.yml [options]
   
  # ssh 连接的用户名
  -u REMOTE_USER, --user=REMOTE_USER
   
  # ssh登录认证密码
  -k, --ask-pass    
   
  # sudo 到root用户,相当于Linux系统下的sudo命令
  -s, --sudo       
      
  # sudo 到对应的用户
  -U SUDO_USER, --sudo-user=SUDO_USER   
   
  # 用户的密码(—sudo时使用)
  -K, --ask-sudo-pass     
   
  # ssh 连接超时,默认 10 秒
  -T TIMEOUT, --timeout=TIMEOUT
   
  # 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
  -C, --check      
   
  # 设置额外的变量如: key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e
  -e EXTRA_VARS, --extra-vars=EXTRA_VARS    
   
  # 进程并发处理,默认 5
  -f FORKS, --forks=FORKS    
   
  # 指定 hosts 文件路径,默认 default=/etc/ansible/hosts
  -i INVENTORY, --inventory-file=INVENTORY   
   
  # 指定一个 pattern,对- hosts:匹配到的主机再过滤一次
  -l SUBSET, --limit=SUBSET    
   
  # 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook
  --list-hosts  
   
  # 列出该 playbook 中会被执行的 task
  --list-tasks   
   
  # 私钥路径
  --private-key=PRIVATE_KEY_FILE   
   
  # 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍
  --step    
   
  # 只检测 playbook 文件语法是否有问题,不会执行该 playbook
  --syntax-check  
   
  # 当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔
  -t TAGS, --tags=TAGS   
   
  # 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行
  --skip-tags=SKIP_TAGS   
   
  # 输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
  -v, --verbose 

常规操作playbook和hosts文件放在同一目录下
ansible-play -i ./hosts nginx.yml

在playbook中添加了新的流程,可以添加标签tags,运行时可以指定标签运行(只运行标签命令)
ansible-play -i ./hosts -t reboot nginx.yml

lineinfile 修改文件某一行文本(少量修改可用)


ansible-play -i ./hosts -t config -t reboot nginx.yml

template/copy(template可以使用变量)

模板作用类似于copy,可将文件分发到不同节点上,可以在模板文件中引入变量

常用参数:

  • src: 源文件路径

  • dest: 目标文件路径

  • group: 目标文件属组

  • mode: 目标文件权限

  • backup: 如果目标文件存在,则先备份目标文件

  • force: 是否强制覆盖,默认为yes

  • validate: 在复制之前通过命令验证目标文件,如果验证通过则复制

创建playbook:vim nginx01.yml

创建文件用来替换目标主机的文件:vim configure_files/nginx.j2(写好文件内容)

执行脚本:ansible-play -i ./hosts nginx01.yml

unarchive

解压缩,将压缩文件解压分发到不同节点上

常用参数:

  • src: 源文件路径

  • dest: 目标文件路径

  • mode: 目标文件权限

示例:

复制代码
  - name:
      unarchive: src=/myfiltes/jdk.tar.gz dest=/opt
创建目录拉入压缩文件,创建脚本
wait_for

等待某些操作完成以后再进行后续操作

常用参数:

  • connect_timeout: 在下一个任务执行之前等待连接的超时时间

  • delay: 指在等待过程中轮询的时间间隔

  • host: 等待的主机地址,默认是127.0.0.1

  • port: 等待的主机端口

  • path: 文件路径,只有当这个文件存在时才开始执行下一个任务

  • state: 等待的状态,值可以为started/stoped/absent/present

  • timeout: 等待的超时时间,默认300秒

when

条件判断,满足后再执行任务

示例:

复制代码
  - name: 判断变量tt是否定义
    shell: echo "I've got {{ tt }}"
    when: tt is defined
pause

暂停一定时间

常用参数:

  • minutes: 暂停多少分钟

  • seconds: 暂停多少秒

  • prompt: 打印一串信息提示用户操作

示例:

复制代码
  - name: 等待用户30s用于输入
    pause: seconds=30 prompt="ENTER to continue CTRL-C a to quit"
debug

用于在调试中输出信息

run_once

指定该task只能在某一台机器上执行一次,可以和delegate_to结合使用,如果没有delegate_to,那么这个task会在第一台机器上执行

简单示例:

复制代码
        - name: 在web.example.org机器上刷新环境变量
          shell: source /etc/profile
          run_once: true
ignore_errors

忽略错误的命令,通常情况下当出现执行失败时ansible会停止运行,有时候你会想要继续执行下去就需要添加这个

相关推荐
汤愈韬2 小时前
IPSec工作原理——TK
网络·网络协议·网络安全·security
Do_GH2 小时前
【Linux】09.WSL+SVN部署操作说明
linux·运维·svn
ElevenS_it1883 小时前
连锁门店IT运维监控实战:200+门店网络设备+POS统一纳管+按区域分组告警路由完整配置(Zabbix Proxy架构)
运维·网络·架构·zabbix
dualven_in_csdn3 小时前
mqtt消息及日志查看
linux·运维·服务器
白狐_7983 小时前
【踩坑实录】VMware中OpenKylin虚拟机网络失联的深度分析与排查全过程
网络·麒麟
都在酒里3 小时前
Linux字符设备驱动开发(四):进入硬件世界——GPIO子系统与LED设备驱动
linux·运维·驱动开发
无足鸟ICT3 小时前
【RHCA+】fortune命令(输出一句话)
linux
Coin_learning3 小时前
Linux 基础命令完全教程:从入门到实战
linux
Yupureki3 小时前
《MySQL数据库基础》9.索引原理
linux·运维·服务器·网络·数据库·mysql