Ansible教程(3)Ansible Playbook详细说明

TangLu 系统运维 2023-11-02 10773 0

一、Ansible Playbook介绍

如果基于AD-Hoc去执行多任务(如安装Nginx、修改配置文件、启动服务),需要先使用yum或command模块安装程序,再使用copy模块复制配置文件,最后使用service模块启动服务。为了解决这种多任务繁琐的情况,可以使用Ansible的playbook(剧本)功能。


二、Ansible Playbook构成

Inventory:主机列表,表示剧本中的任务要应用在哪些主机上

Tasks:具体任务,即调用哪些模块完成操作,可以配置多个任务

Variables:变量,包含内置变量和自定义变量

Templates:模板,即使用模板语法来灵活变更的配置文件

Handlers与notify:触发器,由某事件触发执行的操作,比如修改配置文件后自动重启服务


三、Ansible Playbook语法

1、playbook本质是包含了一个或多个任务的YAML配置文件,通常以.yaml或者.yml结尾

2、在单一的一个playbook文件中,使用连续的三个中横线(---)作为每个play的区分

3、缩进必须统一,不能空格和tab混合使用,缩进级别需要一致,同样的缩进代表同样的级别

4、使用冒号“:”之后还需要书写内容的话,则需要空一格才能书写

5、使用短横线“-”后必须追加一个空格


四、Ansible Playbook参数

· hosts:指定远程主机(多个主机用逗号分隔)或主机组

- hosts: webservers


· remote_user指定执行任务的用户(可以定义在hosts字段下,也可单独给每个task定义),通常是root用户,也可指定非root用户使用sudo方式执行任务

- hosts: 192.168.1.31
    remote_user: root  #定义全局用户


· tasks:任务信息将定义在此字段下

tasks: 
  - name: run df -h
    remote_user: test  #单独为task定义用户
    shell: name=df -h


· sudo(可省略):如果设置为yes,那么sudo_user指定的用户在执行任务时会获得root权限


· sudo_user(可省略):指定需要使用sudo执行操作的用户

tasks: 
  - name: run df -h
    sudo_user: test
    sudo: yes
    shell: name=df -h


· connection(可省略):通过什么方式连接到远程主机,默认为SSH    


· gather_facts(可省略):如果明确不需要通过setup模块来获取远程主机facts信息,可以使用这个选项,能提升一定的性能

- hosts: all
  gather_facts_: no
  tasks:
    - name: sleep 5
      command: sleep 5


· ignore_errors(可省略):默认情况下ansible会因为一个错误导致后面的任务全部失败,有些时候可能会忽略一些错误的发生,让其他任务能正常执行

-hosts: all
  tasks:
    - name: ignore_test
      command: /bin/false
      ignore_errors: yes
    - name: touch file
      file: path=/tmp/test.txt state=touch

五、Ansible Playbook基础示例

1、基本示例

- hosts: webservers
  tasks:
    - name: 1.Installed NFS Server
      yum:
        name: nfs-utils
        state: present
    - name: 2.Configure NFS Server
      copy:
        src: ./exports.j2
        dest: /etc/exports

2、高级示例,包含变量、触发器等使用

cat playbook01.yml
- hosts: 192.168.1.31     #定义需要执行的主机或主机组
  remote_user: root      #远程用户
  vars:            #定义变量
    http_port: 8088      #变量
  tasks:            #定义一个任务
    - name: create new file               #定义任务的名称
      file: name=/tmp/playtest.txt state=touch   #调用模块,具体要做的事情
    - name: install package
      yum: name=httpd
    - name: config httpd
      template: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
      notify:                #触发器,当条件触发后需要做的操作,配合handlers使用
        - restart apache  #需要引用的handlers的名字
    - name: copy index.html
      copy: src=/var/www/html/index.html dest=/var/www/html/index.html
    - name: start httpd
      service: name=httpd state=started
  handlers:                                             #notify定义的触发执行相应的处理动作
    - name: restart apache               #要与notify定义的内容相同
      service: name=httpd state=restarted      #触发要执行的动作


六、Ansible playbook运行结果说明

当playbook运行后在PLAY RECAP(汇总报告)一列将返回返回的结果包含了任务ok的数量(已经达到任务要求,无需再次处理)、changed数量

playbook1.png


ansible-playbook命令示例与常用选项

ansible-playbook -t tag_name httpd.yml #-t指定标签名,多个标签用逗号分隔
ansible-playbook playbookname.yml --list-task #列出该playbook中的任务

# --check | -C:只检测可能会发生的改变,但不真正执行操作
# --list-hosts:列出运行任务的主机
# --list-tags:列出playbook文件中定义的所有tags
# --list-tasks:列出playbook文件中定义的所有任务
# --limit:主机列表 只针对主机列表中的某个主机或者某个组执行
# -f:指定并发数,默认为5个
# -t:指定tags运行,运行某一个或者多个tags。前提是playbook中有定义tags
# -e:声明变量和值


七、使用ansible-vault加密Playbook

ansible-vault encrypt hello.yml  #加密playbook,加密否的文件无法直接执行和查看
ansible-vault view hello.yml  #查看加密后的文件
ansible-vault edit hello.yml  #查看加密后的文件
ansible-vault decrypt hello.yml  #解密playbook

评论