一篇文章搞懂——ansible-playbook高级用法

ansible-playbook高级用法

  • ansible-playbook介绍

img

  • playbook 剧本是由一个或多个"play"组成的列表
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
  • Playbook 文件是采用YAML语言编写的

YAML的格式

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进必须是统一的,不能空格和tab混用
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表
  • YAML文件扩展名通常为yml或yaml
scalar 标量
#key对应value
name: wang
age: 18

#使用缩进的方式
name: 
 wang
age:
 18
Dictionary 字典
  • 字典由多个key与value构成,key和value之间用 :分隔, 并且 : 后面有一个空格,所有k/v可以放在一行,或者每个 k/v 分别放在不同行
#汇总模式
account: { name: wang, age: 30 }

#缩进模式
account: 
 name: wang
 age: 18
List 列表
  • 列表由多个元素组成,每个元素放在不同行,且元素前均使用"-"打头,并且 - 后有一个空格, 或者将所有元素用 [ ] 括起来放在同一行
course: [ linux , golang , python ]

#缩进模式
course:
 - linux
 - golang
 - python
#数据里面也可以包含字典
course:
 - linux: manjaro
 - golang: gin
 - python: django
三种常见的数据格式
  • XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
  • JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
  • YAML:YAML Ain’t Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab

img

  • 可以用工具互相转换,参考网站:
    • https://www.json2yaml.com/
    • http://www.bejson.com/json/json2yaml/

Playbook 核心组件

  • 一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
    • Hosts 执行的远程主机列表
    • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
    • Variables 内置变量或自定义变量在playbook中调用
    • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
    • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
    • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
hosts 组件
  • Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
Websrvs:dbsrvs     #或者,两个组的并集
Websrvs:&dbsrvs   #与,两个组的交集
webservers:!dbsrvs  #在websrvs组,但不在dbsrvs组
remote_user 组件
  • remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: websrvs
 remote_user: root
  
 tasks:
   - name: test connection
     ping:
     remote_user: nameke
     sudo: yes #默认sudo为root
     sudo_user:chengzi  #sudo为chengzi
task列表和action组件
  • play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task
  • task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
  • 每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。
  • 如果未提供name,则action的结果将用于输出
  • task两种格式:
action: module arguments  #示例: action: shell wall hello 
module: arguments   #建议使用 #示例: shell: wall hello
#注意:shell和command模块后面跟命令,而非key=value
---
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
   - name: install httpd
     yum: name=httpd 
   - name: start httpd
     service: name=httpd state=started enabled=yes
其它组件说明
  • 某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers任务
  • 还可以通过"tags"给task 打标签,可在ansible-playbook命令上使用-t指定进行调
ShellScripts VS Playbook 案例
#1、SHELL脚本实现
#!/bin/bash
# 安装Apache
yum install --quiet -y httpd 
# 复制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
systemctl enable --now httpd

#2、Playbook实现
---
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
   - name: "安装Apache"
     yum: name=httpd
   - name: "复制配置文件"
     copy: src=/https/blog.csdn.net/tmp/httpd.conf dest=/etc/httpd/conf/
   - name: "复制配置文件"
     copy: src=/https/blog.csdn.net/tmp/vhosts.conf dest=/etc/httpd/conf.d/
   - name: "启动Apache,并设置开机启动"
     service: name=httpd state=started enabled=yes
playbook 命令
  • 格式:ansible-playbook <filename.yml> … [options]
#常用选项
--syntax-check      #语法检查,可缩写成--syntax, 相当于bash -n 
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run 
--list-hosts    #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY        #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的
name
-v -vv  -vvv #显示过程

playbook应用案例

  • 利用 playbook 创建 mysql 用户
---
- hosts: dbsrvs
 remote_user: root
 gather_facts: