【ansible】剧本playbook

目录

编写playbook

一,Ansible playbook

 

二,yaml 标记语言

1,YAML的三种数据结构

案例1

三,playbook结果语法检测

案例2

四,yaml注释

 

五,yaml字符串 和多行字符串表示方式


编写playbook

一,Ansible playbook

临时命令可以作为一次性对一组主机运行简单的任务。不过,若要真正发挥Ansible的力量,需要了解如何使用playbook可以轻松重复的方式对一组主机执行多项复杂的任务。

play是针对对清单中选定的主机运行一组有序任务。playbook是一个文本文件,其中包含有一个或者多个按特定顺序运行的play组成的列表。

play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测的成果。在playbook中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或者架构所需的步骤。

 

二,yaml 标记语言

YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等 YAML:YAML Ain’t Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)

 

YAML 语言特性

  • YAML的可读性好
  • YAML和脚本语言的交互性好
  • YAML使用实现语言的数据类型
  • YAML有一个一致的信息模型
  • YAML易于实现
  • YAML可以基于流来处理
  • YAML表达能力强,扩展性好

 

1,YAML的三种数据结构

对象: 键值对的集合,又称为映射、哈希、字典

数组: 一组按次序排列的值,又称为序列/列表

纯量: 单个的、不可再分的值

对象:

(1)yaml语法

Key:value

Key1:value1

key:

  key1: vaule1

  key2: vaule2

(2)流式风格语法

是指用花括号包裹,逗号加空格分割的写法,和json类似

key: {key1: value1,key2: value2}

(3)JSON

"key":"value"

"key":"{"key1":"value1","key2":"value2"}

数组:

key:

  - value1

  - value2

或者:

key:[value1,value2]

纯量:

字符串

布尔值

整数

浮点数

时间

日期

NULL

Int: 12

Float: 12.3

String: pets

Bool: TRUE

冒号后面有一个空格,杠后面也有一个空格;

布尔值,空值,数值不用加双引号

2,YAML语法格式

- name:

- 在单一文件第一行,用连续三个连字号“-” 开始,还有选择性的连续三个点号( … )用来表示文件的结尾

- 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能

- 使用#号注释代码    

- 缩进必须是统一的,不能空格和tab混用 (以空格的缩进来控制层级关系只要是左对齐的一列数据,都是同一个层级的,)

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

  YAML文件内容是区别大小写的,key/value的值均需大小写敏感

- 多个key/value可同行写也可换行写,同行使用,分隔

- v可是个字符串,也可是另一个列表

- 一个完整的代码块功能需最少元素需包括 name 和 tasks

- 一个name只能包括一个task

- YAML文件扩展名通常为yml或yaml

注:

play中的第一行开头是以破折号开头加空格(表示play列表中的第一项),而后是第一个键,即name属性。

name这标识该play的用途。name键是可选的,但建议使用它,因为它有助于记录您的playbook。这在playbook中包含多个play时特别有用。

 hosts,它指定对其运行play中的任务的主机。与用于ansible命令的参数相似,hosts属性将主机模式取为值,如清单中受管主机或组的名称。

tasks属性,其值指定要为该play运行的任务的列表。

案例1

(1)创建目录/day04/playbook ,并切换到当前目录下面

[root@server playbook]# pwd

在当前目录下面编译ansible.cfg文件

[root@server playbook]# vim ansible.cfg

[defaults]

inventory=./inventory

编辑inventory文件

[root@server playbook]# vim inventory

[test1]

node1

[test2]

node2

(2)编辑剧本文件playbook.yml

[root@server playbook]# vim playbook.yml

---

- name: play1

  hosts: all

  tasks:

    - name: 创建文件new1

      file:

        path: /new1

        state: touch

        mode: 644

        owner: root

        group: root

    - name: 创建用户lisi,指定uid为1111

      user:

        name: lisi

        uid: 1111

    - name: 编辑文件new1内容

      copy:

        dest: /new1

        content: "this is file\n"

...

(3)检测剧本文件是否有语法错误

[root@server playbook]# ansible-playbook --syntax-check playbook.yml

(4)空执行,假设执行,并不会在受控主机上真正运行

[root@server playbook]# ansible-playbook -C playbook.yml

(5)执行剧本playbbook.yml

[root@server playbook]# ansible-playbook playbook.yml

(6)在node1主机上查看剧本创建的文件new1

[root@node1 ~]# ls -l /new1

[root@node1 ~]# cat /new1

(7)在node2主机上查看剧本创建的文件new1

[root@node2 ~]# ll /new1

[root@node2 ~]# cat /new1

 

三,playbook结果语法检测

-v 显示任务结果

-vv 任务结果和任务配置

-vvv 包含有关受管主机的连接信息

-vvvv 增加了连接插件相关的额外详细程度选项,包含受管主机上用与执行脚本的用户以及所有执行的脚本

--syntax-check 用于检验playbook语法是否有问题

-C 执行空运算 可以检测将会发生什么更改但是并没有对受管主机进行实际更改

--list-tasks 查看playbook中的任务

1,--syntax-check 用于检验playbook语法是否有问题

检测剧本文件是否有语法错误

[root@server playbook]# ansible-playbook --syntax-check playbook.yml

2,-C 执行空运算 可以检测将会发生什么更改但是并没有对受管主机进行实际更改

空执行,假设执行,并不会在受控主机上真正运行

[root@server playbook]# ansible-playbook -C playbook.yml

3,--list-tasks 查看playbook中的任务

查看剧本中的任务

[root@server playbook]# ansible-playbook --list-tasks playbook.yml

案例2

通过剧本在受控端主机上完成以下操作

web服务

1,配置yum源,安装对应的服务软件 http

2,ip通过自定义端口访问网站内容/www

3,创建资源文件

4,重启服务

5,防火墙

6,selinux

7,测试

1,在当前用户的家目录下面编辑隐藏文件.vimrc;定义tab键的缩进;

   (全局生效在/etc/vimrc最后面编辑)

自动命令,文件类型为yaml 设置长度,宽度,结束

autocmd FileType yaml setlocal ai ts=2 dw=2 et

2,在控制端主机server上创建控制文件

[root@server playbook]# vim httpd.conf

Listen 8909

<Directory /www>

        AllowOverride none

        Require all granted

</Directory>

<VirtualHost *:8909>

        DocumentRoot /www

</VirtualHost>         

3,创建剧本文件web.yml

---

- name: configure web server

  hosts: test1,test2

  tasks:

    - name: 挂载

      mount:

        src: /dev/sr0

        path: /mnt

        fstype: iso9660

        state: mounted

    - name: Base-yum源配置

      yum_repository:

        name: BaseOS

        description: RHEL8-BaseOS

        baseurl: file:///mnt/BaseOS

        gpgcheck: no

        file: BaseOS

    - name: App-yum源配置

      yum_repository:

        name: AppStream

        description: RHEL8-AppStream

        baseurl: file:///mnt/AppStream

        gpgcheck: no

        file: AppStream

 

    - name: 安装httpd

      dnf:

        name: httpd

        state: installed

    

 - name: 创建配置文件

      copy:

        src: /day04/playbook/httpd.conf

        dest: /etc/httpd/conf.d/vhosts.conf

    - name: 创建目录

      file:

        path: /www

        state: directory

    - name: 网页文件

      copy:

        dest: /www/index.html

        content: "everything will be ok\n"

    - name: 启动防火墙

      service:

        name: firewalld

        state: restarted

        enabled: yes

    - name: 配置防火墙

      firewalld:

        port: 8909/tcp

        permanent: yes

        immediate: yes

        state: enabled

    - name: 开启selinux

      selinux:

        state: enforcing

        policy: targeted

    - name: 配置selinux的端口

      seport:

        ports: 8909

        proto: tcp

        setype: http_port_t

        state: present

 

    - name: selinux文件的标签

      sefcontext:

        target: '/www(/.*)?'

        setype: httpd_sys_content_t

        state: present

    - name: 重启服务

      service:

        name: httpd

        state: restarted

        enabled: yes

- name: 测试web界面

  hosts: node1

  tasks:

    - name: 测试node1主机

      uri:

        url: http://192.168.206.111:8909

        return_content: yes

    - name: 测试node2主机

       uri:

          url: http://192.168.206.222:8909

          return_content: yes

 

   

4,检查语法是否有错:

[root@server playbook]# ansible-playbook --syntax-check web.yml

5,执行剧本:

[root@server playbook]# ansible-playbook web.yml

四,yaml注释

#this is YAML   (顶格开始写注释,#后直接加内容)

Same data # This is also a YAML comment  (内容后写注释,#加空格加内容)

 

五,yaml字符串 和多行字符串表示方式

(1)单行字符串中间有空格可以不放在引号中。字符串也可以通过单引号或者双引号括起来

(2)编写多行换行操作可以通过|竖线保留字符串中的换行符

(3) >表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使他们跨占多行来提高可读性。

“|” 保留内容中换行符

[student@localhost ~]$ cat /etc/host1 192.168.100.111 server.example.com server

“>” 将换行符转换为空格字符一行显示

[student@localhost ~]$ cat /etc/host1 192.168.100.111 server.example.com server

重要:

只有空格字符作为缩进不能用制表符,如果您使用vi编辑器可以在$HOME/.vimrc文件中添加一下行以便更轻松的编辑playbook,以下配置实现的是在按下Tab键是执行一个双空格缩进,并在换行后自动缩进后续行。

 自动命令,文件类型为yaml 设置长度,宽度,结束

autocmd FileType yaml setlocal ai ts=2 dw=2 et

1“|” 保留内容中换行符

(1)编辑剧本,在content后面使用符号 |

    - name: 网页文件

      copy:

        dest: /www/index.html

        content: |

          this is line1

          this is line2

          this is line3

(2)访问网页

​[root@node1 ~]# curl http://192.168.206.111:8909

2“>” 将换行符转换为空格字符一行显示

(1)编辑剧本,在content后面使用符号 >

  - name: 网页文件

      copy:

        dest: /www/index.html

        content: >

          this is line1

          this is line2

          this is line3

(2)访问网页

​[root@node1 ~]# curl http://192.168.206.111:8909

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值