Ansible_编写Playbook文件
阅读原文时间:2023年07月10日阅读:1

一、Playbook的实施

1、Ansible playbook与临时命令概述:

2、Ansible playbook的编写规则

3、编写规则实例

  • 执行单个任务实例:

    • //安装httpd服务

      [root@localhost ~]# vim example.yml

      • name: This is test example playbook
        hosts: 192.168.121.81 #如果是多个主机,可以使用all表示对所有主机操作
        tasks:

        • name: install httpd
          yum:
          name: httpd
          state: present

        //执行example.yml文件
        [root@localhost ~]# ansible-playbook example.yml
        PLAY [This is test example playbook] **************************************************************************************************************************************

      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [192.168.121.81]

      TASK [install httpd] ******************************************************************************************************************************************************
      changed: [192.168.121.81]

      PLAY RECAP ****************************************************************************************************************************************************************
      192.168.121.81 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0   

  • 执行多个任务实例:

    • //执行多个任务,先安装httpd服务,然后启动httpd服务

      [root@localhost ~]# vim example.yml

      • name: This is test example playbook
        hosts: 192.168.121.81
        tasks:

        • name: install httpd
          yum:
          name: httpd
          state: present

        • name: start httpd service
          service:
          name: httpd
          state: started
          enabled: yes

        //执行example.yml文件
        [root@localhost ~]# ansible-playbook example.yml

      PLAY [This is test example playbook] **************************************************************************************************************************************

      TASK [Gathering Facts] ****************************************************************************************************************************************************
      ok: [192.168.121.81]

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

      TASK [start httpd service] ************************************************************************************************************************************************
      changed: [192.168.121.81]

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

      //查看受管主机上httpd服务状态
      [root@localhost ~]# ansible 192.168.121.81 -m shell -a 'systemctl status httpd'
      192.168.121.81 | CHANGED | rc=0 >>
      ● httpd.service - The Apache HTTP Server
      Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
      Active: active (running) since Sat 2020-08-29 14:34:37 CST; 2min 15s ago
      Docs: man:httpd.service(8)
      Main PID: 17031 (httpd)
      Status: "Running, listening on: port 80"
      Tasks: 213 (limit: 11340)
      Memory: 43.4M
      CGroup: /system.slice/httpd.service
      ├─17031 /usr/sbin/httpd -DFOREGROUND
      ├─17033 /usr/sbin/httpd -DFOREGROUND
      ├─17034 /usr/sbin/httpd -DFOREGROUND
      ├─17035 /usr/sbin/httpd -DFOREGROUND
      └─17036 /usr/sbin/httpd -DFOREGROUND

      Aug 29 14:34:37 localhost.localdomain systemd[1]: Starting The Apache HTTP Server…
      Aug 29 14:34:37 localhost.localdomain httpd[17031]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
      Aug 29 14:34:37 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
      Aug 29 14:34:37 localhost.localdomain httpd[17031]: Server configured, listening on: port 80

4、执行playbook

5、执行ansible-playbook,提高输出信息详细程度

  • 输出详细程度命令:

    • 选项

      描述

      -v

      显示任务结果

      -vv

      任务结果和任务配置都会显示

      -vvv

      包含关于与受管主机连接的信息

      -vvvv

      增加了连接插件相关的额外详细程序选项,包括受管主机上用于执行脚本的用户以及所执行的脚本

6、语法验证

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

  • 语法实例:

    [root@ansible roles]# ansible-playbook --syntax-check vhosts.yaml

    playbook: vhosts.yaml
    //没有报错,说语法没有错误

7、检测文件执行是否出错

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

  • 检测实例:

    [root@ansible roles]# ansible-playbook -C vhosts.yaml
    ……..

二、执行多个play

1、编写多个play规则

  • Playbook是一个YAML文件,含有由一个或多个play组成的列表,记住一个play按顺序列出了要对清单中的选定主机执行的任务

  • Playbook中的各个play编写为playbook中的顶级列表项。各个play是含有常用play关键字的列表项

  • 演示实例:

    ---

    • name: first play
      hosts: 192.168.121.81
      tasks:

      • name: first task
        yum:
        name: httpd
        status: present

      • name: second task
        service:
        name: httpd
        enabled: true

    • name: second play
      hosts: 192.168.121.82
      tasks:

      • name: first task
        service:
        name: mariadb
        enabled: true

2、playbook中的远程用户和特权

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

1️⃣:用户属性

  • playbook中的任务通常通过与受管主机的网络连接来执行

  • 用于任务执行的用户帐户取决于Ansible配置文件/etc/ansible/ansible.cfg中的不同关键字

  • 运行任务的用户可以通过remote_user关键字来定义。不过,如果启用了特权升级,become_user等其他关键字也会发生作用

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

  • 演示实例:(remote_user 表示连接远程主机的用户名)

    ---

    • name: test file
      hosts: all
      remote_user: lisi

2️⃣:特权升级属性

  • Ansible也提供额外的关键字,从而在playbook内定义特权升级参数

  • become布尔值关键字可用于启用或禁用特权升级,无论它在Ansible配置文件中的定义为何。它可取yestrue值来启用特权升级,或者取nofalse值来禁用它

  • 演示实例:(使用“true”或“yes”来表示启用这个特权,如:become=true)

    ---

    • name: test file
      hosts: all
      remote_user: lisi
      become: yes
  • 如果启用了特权升级,则可以使用become_method关键字来定义特定playbook期间要使用的特权升级方法

    • 演示实例:(become_method=sudo 表示用什么方式将普通账户切换到root或所需的其他账户,同样包括普通用户使用sudo执行命令,这里可以用su或sudo)

      ---

      • name: test file
        hosts: all
        remote_user: lisi
        beacome: yes
        become_method: sudo
  • 此外,启用了特权升级时,become_user关键字可定义特定play上下文内要用于特权升级的用户帐户

    • 演示实例:(become_user=root 设置为root账户,相当于我们以普通账户登入到远程主机时,再使用su - root切换为root账户)

      ---

      • name: test file
        hosts: all
        remote_user: lisi
        beacome: yes
        become_method: sudo
        become_user: root //become_user为普通用户时,表示以普通用户身份登录远程主机

3️⃣:演示如何在play中使用关键字

---

  • name: /etc/hosts is up to date
    hosts: 192.168.121.81
    remote_user: root
    become: yes

    tasks:

    • name: 192.168.121.81 in /etc/hosts
      lineinfile:
      path: /etc/hosts
      line: '192.168.121.81 web1.example.com'
      state: present

3、查找用于任务的模块

1️⃣:对于每一个模块,Ansible官网提供了其功能摘要,以及关于如何通过模块的选项来调用各项具体功能的说明

  • ansible-doc -l命令。这将显示模块名称列表以及其功能的概要

    • [root@ansible ~]# ansible-doc -l

2️⃣:使用ansible-doc [module name]命令来显示模块的详细文档

  • 演示实例:

    [root@ansible ~]# ansible-doc yum

3️⃣:ansible-doc命令还提供-s选项,它会生成示例输出,可以充当如何在playbook在使用特定模块的示范,此输出可以作为起步模板,包含在实施该模块以执行任务的playbook中。输出中包含的注释,提醒管理员各个选项的用法

  • 演示实例:

    [root@ansible ~]# ansible-doc -s yum

4、play语法变化

1️⃣:YAML注释

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

2️⃣:YAML字符串

  • YAML中的字符串通常不需要放在引号里,即使字符串中包含空格。字符串可以用双引号或单引号括起

    • 实例:

      this is a string
      'this is another string'
      "this is yet another a string"

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

    • 实例:

      include_newlines: |
      Example Company
      123 Main Street
      Atlanta, GA 30303

  • 要编写多行字符串,还可以使用大于号字符来表示换行字符转换成空格并且行内的引导空白将被删除

    • 实例:

      fold_newlines: >
      This is an example
      of a long string,
      that will become
      a single sentence once folded.

3️⃣:YAML字典

  • 字典实例:

    name: svcrole
    svcservice: httpd
    svcport: 80

4️⃣:YAML列表

  • 实例:

    hosts:

    • 192.168.121.81
    • 192.168.121.82
    • 192.168.121.83