ansible playbook的使用

一、playbook的使用

1.ansible的playbook与临时命令

​ 临时命令可以对一组目标主机进行一项简单的任务。要发挥ansible的真正力量,还需要了解如何使用playbook轻松的对一组目标主机执行多项复杂的任务

​ playbook是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表

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

2.临时命令改写为playbook

​ 之前所熟知的ansible临时命令都可以使用playbook来编写

​ 下面我们举一个例子,看看这条命令在playbook中如何编写

[root@ansible ~]# ansible all -m user -a 'name=tongxue uid=4999 state=present'

​ 这个命令用playbook应该这样写:

[root@ansible ~]# vim user.yml
[root@ansible ~]# cat user.yml
---
- name: create user
  hosts: all
  tasks:
    - name: create user tongxue uid 4999
      user: 
        name: tongxue
        uid: 4999
        state: present
[root@ansible ~]#

​ Playbook是以YAML格式编写的文本文件,通常以.yml结尾。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但有两个基本的规则:

  • 处于层次结构中同一级别的数据元素(例如同一列表中的项目)必须具有相同的缩进量。

  • 如果项目属于其他项目的子项,其缩进量必须大于父项

    不过我们在编写playbook时,通常以2的倍数来进行缩进子项的缩进比它的父项的缩进要多两个,这样做更加的易读

​ playbook的开头一行由三个—(—)来进行分隔,这是文档开头的标记。其中的每个项目用一个—(-)来开头,所以playbook编写的格式如下:

---
- name1: name
  hosts: 1.1.1.1
  tasks: 
    - tasks1
    - tasks2
- name2
  hosts: 2.2.2.2
  tasks: 
    - tasks3
    - tasks4
- name3
  hosts: 3.3.3.3
  tasks: 
    - tasks5
    - tasks6

其中tasks是按顺序实际列出要在受管主机上运行的任务。列表中各项任务本身是一个键值对集合。

以上面创建用户的playbook为例,play中唯一任务有两个键:

  • name是记录任务用途的可选标签。最好命名所有的任务,从而帮助记录自动流程中的每一步用途。
  • user是要为这个任务运行的模块。其参数作为一组键值对传递,它们是模块的子项(name、uid和state)。

下面再来看一个含有多项任务的tasks属性案例:

---
- name: test
  hosts: all
  tasks:
    - name: create user tongxue uid 4999
      user:
        name: tongxue
        uid: 4999
        state: present
    - name: web server is enable
      service:
        name: httpd
        enabled: yes
        
    - name: ntp server is enable
      service:
        name: chronyd
        enabled: yes
        
    - name: vsftpd server is enable
      service:
        name: vsftpd
        enabled: yes

​ playbook中play和任务列出的顺序很重要,因为Ansible会按照相同的顺序运行它们

3.运行playbook

​ absible-playbook命令可用于运行playbook。该命令在控制节点上执行,要运行的playbook的名称则作为参数

[root@ansible ~]# ansible-playbook test.yml

以下示例中显示了一个简单的playbook的内容,后面是运行它的结果

[root@ansible ~]# cat test.yml 
---
- name: setup web server
  hosts: 192.168.10.201
  tasks:
    - name: install httpd
      yum: 
        name: httpd
        state: latest

    - name: service is enabled
      service:
        name: httpd
        state: started
        enabled: yes
[root@ansible ~]# ansible-playbook test.yml 

PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]

TASK [install httpd] *************************************************************************************ok: [192.168.10.201]

TASK [service is enabled] ********************************************************************************changed: [192.168.10.201]

PLAY RECAP ***********************************************************************************************192.168.10.201             : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible ~]#

​ 请注意,在playbook运行时,屏幕中会显示每个play和任务的name键的值。(Gathering Facts任务是一项特别的任务,setup模块通常在play启动时自动运行这项任务。)对于含有多个play和任务的playbook,设置name属性后可以更加轻松地监控playbook执行的进展。

​ 通常而言,Ansible Playbook中的任务是幂等的,而且能够安全地多次运行playbook。如果目标受管主机已处于正确的状态,则不应进行任何更改。如果再次运行这个playbook,所有任务都会以状态OK传递,且不报告任何更改。

4.提高输出的详细程度

​ ansible-playbook命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v命令提供了额外的信息,总共有四个级别

配置Playbook执行的输出详细程序

选项描述
-v显示任务结果
-vv任务结果和任务配置都会显示
-vvv包含关于与受管主机连接的信息
-vvvv增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本
5.语法验证

​ 在执行playbook之前,最好要进行验证,确保其内容的语法正确无误。ansible-playbook命令提供了一个–syntax-check选项,可用于验证playbook的语法。

下面是一个playbook的成功验证:

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

playbook: test.yml
[root@ansible ~]#

下面是一个playbook的验证失败:

[root@ansible ~]# ansible-playbook --syntax-check test.yml 
ERROR! conflicting action statements: service, enabled

The error appears to be in '/root/test.yml': line 10, column 7, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:


    - name: service is enabled
      ^ here
[root@ansible ~]#
6.执行空运行

​ 可以使用-C来对playbook进行空运行。这会使Ansible报告在执行该playbook时将会发生什么更改,但不会对受管主机进行任何实际的更改

注意加入该参数不会对受管主机进行任何的更改

[root@ansible ~]# ansible-playbook -C test.yml 

PLAY [setup web server] **********************************************************************************
TASK [Gathering Facts] ***********************************************************************************ok: [192.168.10.201]

TASK [install httpd] *************************************************************************************ok: [192.168.10.201]

TASK [service is enabled] ********************************************************************************ok: [192.168.10.201]

PLAY RECAP ***********************************************************************************************192.168.10.201             : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

[root@ansible ~]#
7.play中的远程用户和特权升级

​ Play可以将不同的远程用户或特权升级设置用于play,取代配置文件中指定的默认设置。这些在play本身中与hosts或tasks关键字相同的级别上设置。

7.1 用户属性

​ playbook中的任务通常通过与受管主机的网络连接来执行。与临时命令相同,用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字。运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用。

如果用于任务执行的Ansible配置中定义的远程用户不合适,可以通过在play中使用remote_user关键字覆盖

	remote_user: remoteuser
7.2 特权升级属性

​ Ansible也提供额外的关键字,从而在playbook内定义特权升级参数。become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yes或true值来启用特权升级,或者取no或false值来禁用它。

	become: true

​ 如果启用了特权升级,则可以使用become_method关键字来定义特定play期间要使用的特权升级方法。

以下示例中指定sudo用于特权升级:

	become_method: sudo

​ 此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户。

	become_user: privileged_user

​ 以下示例演示了如何在play中使用这些:

- name: setup web server
  hosts: 192.168.10.201
  remote_user: tongxue		##使用的用户
  become: yes				##特权升级
  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: latest

    - name: service is enabled
      service:
        name: httpd
        state: started
        enabled: yes
8.playbook的语法

注释

​ 注释也可以用于提高可读性。在YAML中,编号或井号字符(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号的前面加一个空格。

# this is a yaml
- name: setup web server # this is name

字符串

​ YAML中通常使用单引号或双引号来括起一段字符串

- name: install httpd
      yum:
        name: 'httpd'
        state: "latest"

​ 编写多行字符串有两种方式。可以使用管道符表示要保留字符串中的换行字符。

    - name: add conf
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: AddType application/x-gzip .gz .tgz
        line: |
          AddType application/x-httpd-php .php
          AddType application/x-httpd-php-source .phps

​ 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除。这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性。

    - name: add conf
      lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: AddType application/x-gzip .gz .tgz
        line: >
          AddType 
          application/x-httpd-php 
          .php

以上就是playbook的使用

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值