ansible playbook编写

playbook简介

Playbook与ad-hoc相比,是一种完全不同的运用。

playbook是一种简单的配置管理系统与多机器部署系统的基础,且非常适合于复杂应用的部署。

playbook中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务。

使用playbook可以方便的重用这些代码,可以移植到不同的机器上面。

playbook才是ansible真正强大之处。

 

playbook语法

l playbook由YMAL语言编写 ,以下为playbook常用到的YMAL格式:
文件的第一行应该以"---"三个连字符开始,表明YMAL文件的开始。
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。
YMAL中的列表元素以”-”开头然后紧跟着一个空格, 同一个列表中的元素应该保持相同的缩进
---
# 一个美味水果的列表
- Apple
- Orange
- Mango
l 一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格):
---
# 一位职工的记录
name: Example Developer
job: Developer
skill: Elite
l 字典也可以使用缩进形式来表示, 如果你喜欢这样的话:
---
# 一位职工的记录
{name: Example Developer, job: Developer, skill: Elite}

playbook基础

l 主机与用户
---
- hosts: server2               #指定主机组,可以是一个或多个组,逗号分隔。
  remote_user: root                #指定远程主机执行的用户名
---
- hosts: webservers
  remote_user: root           
  become: yes                  #切换用户运行
  become_user: mysql            #指定sudo用户为mysql
 
l Tasks 列表
Play的主体部分是task列表,task列表中的各任务按次序逐个在hosts中指定的主机上执行,即在所有主机上完成第一个任务后再开始第二个任务。如果一个host执行task失败,整个tasks都会回滚
每一个task必须有一个名称name,这样在运行playbook时,从其输出的任务执行信息中可以很好的辨别出是属于哪一个task的。
tasks:
    - name: install apache  #定义任务名
 
l A nsible的自带模块中,command模块和shell模块无需使用key=value格式:
tasks:
  - name: disable selinux
    command: /sbin/setenforce 0
l 使用 command 和 shell  时,我们需要关心返回码信息 :
tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand

    ignore_errors: True  #返回值如果不为0,就会报错,tasks停止 

l 执行playbook
# ansible-playbook apache .yml
# ansible-playbook apache .yml --syntax-check    #检查yaml文件的语法是否正确
# ansible-playbook apache .yml --list-task       #检查tasks任务
# ansible-playbook apache .yml --list-hosts      #检查生效的主机
# ansible-playbook a.yml --start-at-task="启动apache服务"    
  指定从某个task开始运行
 

lHandlers: 在发生改变时执行的操作 

l Template 生成目标文件,copy无法对配置文件进行修改。
定义变量
[webservers]
server2 http_ip=172.25.0.2
 
在模板文件中引用变量
# vim httpd.conf.j2
Listen { { http_ip }}:{ { httpd_port }}
 
l system保留变量:facts
$ ansible hostname -m setup
server2 | SUCCESS => {
    " ansible_facts ": {
        "ansible_all_ipv4_addresses": [
            "172.25.0.2"
  ...
l 取值
{ { ansible_facts ["eth0"]["ipv4"]["address"] }}
{ { ansible_facts.eth0.ipv4.address }}
{ { ansible_facts ['hostname'] }}
{ { ansible_facts [' fqdn '] }}
{ { ansible_facts ['interfaces'] }}
{ { ansible_facts [' dns ']['nameservers'] }}
{ { ansible_facts ['devices'][' vda ']['partitions']['vda1']['size'] }}
{ { ansible_facts ['kernel'] }}
l 禁用facts
- hosts: whatever
  gather_facts : no
 
 

lwhen判断

lwith_items 循环

l 加密文件
$ ansible-vault encrypt userlist.yml
New Vault password: *****
Confirm New Vault password: *****
Encryption successful
$ ansible-playbook test.yml   --ask-vault-pass
Vault password: *****
$ ansible-vault decrypt userlist.yml 
$ ansible-vault view userlist.yml
$ ansible-vault edit userlist.yml
 
l 变量文件推荐的管理方式

.

├── group_vars

│   └── webservers

│       └── vars

├── haporxy.cfg.j2

├── host_vars

│   └── server2

│       ├── vars

│       └── vault

├── httpd.conf.j2

├── inventory

└── playbook.yml

group_vars管理主机组变量

host_vars管理主机变量

vars存放纯文本信息

vault存放加密信息

ansible-doc 用法: (模块用法查询)

rqm 的缺点:

编写playbook,安装Apache:

编写playbook,安装mariadb:

编写playbook,创建MySQL数据库:

导入已有playbook:

playbook中使用变量:

文件中使用playbook定义的变量:

1)、文件是  .j2  的模板文件,普通文件不能修改

2)、playbook中用的模块是  template

playbook中使用变量:

notify:

handlers:

所在任务执行后,所进行的操作

加密认证:

playbook循环的使用:(循环创建用户)

创建和数据在同一文件中:

创建和数据分开:

数据文件加密:

ansible 部署 haprodxy:

使用魔术变量获取节点信息: (内置变量)

组变量与主机变量:(主机变量优先级 > 组变量优先级)

组变量:一般存放公用变量

主机变量:一般存放私有变量   目录命名与 hosts 中的 主机名 保持一致

vars存放纯文本信息,vault存放加密信息

block 任务块:

变量:

处理任务失败:

ignor_error  忽略错误

rescue 出现错误执行的任务

always 总是执行的任务

滚动升级:

socat 命令升级:

ansible与prodxy结合

 
 

猜你喜欢

转载自blog.csdn.net/qq_47714288/article/details/112002939
今日推荐