Ansible Playbook 剧本语法

Ansible 系列:

Ansible Playbook 剧本语法

Playbook(剧本)是系统 Ansible 指令的集合,其利用 YAML 语言编写,自上而下按顺序一次执行。它可以实现一些 Ad-Hoc 指令无法实现的操作,例如从一台机器的文件中抓取内容并赋为另一台机器的变量等操作。

下面是一个 Playbook 剧本例子:

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

第一行中 --- 是 YAML 将文件解释为正确文档的格式要求,YAML 它允许多个文档存在与同一个文件中,每个文档由 --- 符号分割。通常一个 Playbook 对应一个文档,因此你也可以省略它。

YAML 具有强制性的格式规范,对空格非常敏感,通过空格来将不同信息分组在一起,而不能使用制表符,并且必须使用一致的间距才能正确读取文件。

- 开头的项目被视为列表项目,具有 key:value 格式的项。

YAML 文件的扩展名通常为 .yaml 或 .yml。

Playbook 的执行结果有三种颜色:

  • 红色: 表示有task执行失败或者提醒的信息
  • 黄色:表示执行了且改变了远程主机状态
  • 绿色:表示执行成功

Playbook 剧本语法

一个 Playbook 主要有以下四部分构成:

  • target section:定义将要执行 playbook 的远程主机组;
  • variable section:定义 playbook 运行时需要使用的变量;
  • task section:定义将要在远程主机上执行的任务列表;
  • handler section:定义task执行完成以后需要调用的任务;

Hosts(主机) 与 Users(用户)

每一个 Play 都要指定操作的目标主机,并且可以指定用哪个身份去完成执行的步骤(Tasks)。例如:

- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      remote_user: yourname
      sudo: yes
  • hosts:用于指定要执行指定任务的主机,可以是一个或多个,由逗号分隔符分隔的主机组。
  • remote_user:用于指定远程主机上执行任务的用户,它也可用于各tasks中。
  • sudo:如果设置为 yes 则获取 root 权限去执行该任务,如果需要在使用 sudo 时指定密码,可在运行 ansible-playbook 命令时加上选项 --ask-sudo-pass (-K)
  • connection:通过什么方式连接到远程主机(默认 ssh)。
  • gather_facts:默认会执行 setup 模块,设置该选项设置为 False 可以关闭自动执行 setup 模块。

vars (环境变量)

在执行 ansible-playbook 时通过添加选项 --extra-vars 看定义环境变量,可以在 Playbook 中定义,还可以在主机清单文件中配置。如果环境变量之间有冲突,则三者的优先级从高到低。

在 Playbook 中通过 {{ var_name }} 引用环境变量,如:

- hosts: all
  vars:  
    file_name: test

  tasks:
  - name:
    file: path=/tmp/{{ file_name }} state=touch

register (注册变量)

通过 register 关键字可以存储指定命令的输出结果到一个自定义的变量中。

- hosts: all
  tasks:
    - name:
      shell: netstat -lntp
      register: System_Status

    - name: Get System Status
      debug: msg={{System_Status.stdout_lines}}

tasks (任务)

每一个 Play 包含了一个 tasks 任务列表,任务列表中的任务会按次序逐个在指定的主机上执行,并且完成第一个后再开始第二个任务。

tasks 通过模块来完成实际操作,其格式为 "module:options",除了 Command 和 Shell 模块之外,通常大多数模块使用 key=value 格式的参数。

tasks:
 - name: make sure apache is running
   service: name=httpd state=running
   
tasks:
 - name: disable selinux
   command: /sbin/setenforce 0

tasks:
  - name: run this command and ignore the result
    shell: /usr/bin/somecommand
    ignore_errors: True

when (条件语句)

Playbook 中的条件判断语句使用 when,通常这可以结合 Setup 模块针对不同系统主机执行不同的操作。

- hosts: all
  remote_user: root
  tasks:
    - name: Create File
      file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
      when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")

#系统为centos的主机才会执行
    - name: Centos Install httpd
      yum: name=httpd state=present
      when: (ansible_distribution == "CentOS")

#系统为ubuntu的主机才会执行
    - name: Ubuntu Install httpd
      yum: name=httpd2 state=present
      when: (ansible_distribution == "Ubuntu")

with_items (循环语句)

除了条件语句之外,还可以使用循环语句 with_items,例如下面场景中通过循环语句批量安装软件:

- hosts: all
  remote_user: root
  tasks:
    - name: Installed Pkg
      yum: name={{ item }} state=present
      with_items:
        - wget
        - tree
        - lrzsz

或者批量创建用户:

- hosts: all
  remote_user: root
  tasks:
    - name: Add Users
      user: name={{ item.name }} groups={{ item.groups }} state=present
      with_items:
        - { name: 'testuser1', groups: 'bin' }
        - { name: 'testuser2', groups: 'root' }

ignore_errors (异常处理)

默认 Playbook 会检查命令和模块的返回状态,如遇到错误就中断执行。通过加入参数 ignore_errors: yes 来忽略错误。

- hosts: all
  remote_user: root
  tasks:
    - name: Ignore False
      command: /bin/false
      ignore_errors: yes

    - name: touch new file
      file: path=/tmp/bgx_ignore state=touch

tags (标签)

通过对任务添加一个至多个标签,可以在执行 ansible-playbook 指令时使用 -t--skip-tags 选项来控制执行指定标签任务,或跳过指定标签的任务。

- hosts: all
  remote_user: root
  tasks:
    - name: Install Nfs Server
      yum: name=nfs-utils state=present
      tags:
        - install_nfs
        - install_nfs-server

    - name: Service Nfs Server
      service: name=nfs-server state=started enabled=yes
      tags: start_nfs-server

使用 -t 指定 tags 执行, 多个 tags 使用逗号隔开即可:

ansible-playbook -t install_nfs-server playbook.yml

handlers (触发回调)

我们还可以通过 handlers 在某个任务执行完成后触发某些操作,例如当一个文件内容被改动时,重启两个 services,如下面 Playbook:

- hosts: all
  remote_user: root
  tasks:
    - name: template configuration file
      template: src=template.j2 dest=/etc/foo.conf
      notify:
         - restart memcached
         - restart apache
  handlers:
    - name: restart memcached
      service:  name=memcached state=restarted
    - name: restart apache
      service: name=apache state=restarted       

notify 下列出的即是 Handlers,Handlers 其实也是一些 tasks 的列表。

Handlers 是由通知者进行 notify,如果没有被 notify,Handlers 不会执行。

include (引入外部 Tasks 模块)

include 用来动态的包含 Tasks 任务列表。

- hosts: all
  remote_user: root
  tasks:
    - include_tasks: p1.yml
    - include_tasks: p2.yml
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345