编写和运行 Playbook

实验环境

[test@controller ~]$ mkdir web && cd web
[test@controller web]$ cat > ansible.cfg <<'EOF'
[defaults]
remote_user = test
inventory = ./inventory
[privilege_escalation]
become = True
become_user = root
become_method = sudo
become_ask_pass = False
EOF
[test@controller web]$ cat > inventory <<'EOF'
controller
node1
node2
node3
node4

Playbook 介绍

adhoc 命令可以作为一次性命令对一组主机运行一项简单的任务。不过,若要真正发挥Ansible的能力,需要使用功能 playbook。
playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。play是针对清单中选定的主机运行的一组有序任务。play可以让您将一系列冗长而复杂的手动管理任务转变为可轻松重复的例程,并且具有可预测性。
在 playbook 中,您可以将play内的任务序列保存为人类可读并可立即运行的形式。根据任务的编写方式,任务本身记录了部署应用或基础架构所需的步骤。

ad hoc 命令示例

ansible -m user -a "name=newbie uid=4000
state=present" node1

Playbooks以yaml格式编写,通常以 yaml 和 yml 扩展名保存

改写成playbook:

---
- name: Configure important user consistently
hosts: node1
tasks:
- name: newbie exists with UID 4000
user:
name: newbie
uid: 4000
state: present
...

yaml格式只使用空格缩进,对于空格的数量没有强制要求,正常使用2个空格。
基本规则:
同一级别的元素,使用相同的缩进。
对于子项目,使用比父项目更多的缩进。
增加空白行,提高可读性。

Vim 编辑器设置

如果使用vim编辑器,设置vim环境便于编辑Playbooks。
在$HOME/.vimrc文件中添加以下内容:

set ai ts=2 number

或者

autocmd FileType yaml set ai ts=2

“ai”,即 “autoindex”,表示自动缩进
“ts”,即 “tabstop”,表示tab键使用2个空格代替
“number”,显示行号
autocmd FileType yam,代表文件类型是yaml时,自动执行“set ai ts=2”

Playbook 编写

Playbook 示例

在 Ansible 中,缩进(Indentation) 不仅仅是为了好看,它代表了数据的层级结构和逻辑关系
一个 Play 本质上是在定义“在哪些机器上执行什么任务”。 它的顶级属性主要包括:

name: 建议项,用于描述这个 Play 的作用,增强可读性
hosts: 必填项,定义该 Play 在哪些受控节点上运行(如 webs, all)
become: 布尔值(yes/no),决定是否需要提权(默认切换到 root)执行任务。
vars: 定义该 Play 范围内的变量
vars_files: 引入外部变量文件
gather_facts: 布尔值,定义是否在执行前收集主机的硬件、网络等信息(默认 yes)
tasks: 核心项,这是一个列表,包含了该 Play 要执行的所有具体任务

#yaml格式起始行,一般不省略
---
# Playbook中第一个play
# play具有属性:name,hosts,become,tasks,缩进一致
# name属性,用于简要描述play
- name: debploy WebSite
# hosts属性,用于定义要在哪个受管理节点执行
  hosts: webs
# tasks属性,用于描述play中任务,属性是列表格式
  tasks:
# 第一个任务
# 任务具有属性:name和模块名等。
   # name简要描述任务
    - name: latest version of httpd and firewalld installed
    # 指明模块名,也就是要执行的任务
      yum:
    # 指定要操作的rpm包名称
        name:
          # rpm包名称是-开头的列表格式,或者逗号分隔的列表格式
          - httpd
          - firewalld
      # 定义软件包的状态,lastet代表升级为最新版本
        state: latest
    # 第二个任务
    - name: prepare index.html
    # copy 模块,用于将content属性值写入到目标文件
      copy:
        content: "Welcome to test WebSite\n"
        dest: /var/www/html/index.html
    # 第三个任务
    - name: enable and start httpd
      # service模块,用于启用并启动httpd服务
      service:
        name: httpd
        enabled: true
        state: started
    # 第四个任务
    - name: enable and start firewalld
      # service模块,用于启用并启动firewalld服务
      service:
        name: firewalld
        enabled: true
        state: started
    # 第五个任务
    - name: firewalld permits access to httpd service
    # firewalld,用于放行http服务
      firewalld:
        service: http
        permanent: true
        state: enabled
        immediate: yes

# Playbook中第二个play,-开头表示列表
- name: Test WebSite
  hosts: localhost
  become: no
  tasks:
    - name: connect to intranet web server
  # uri模块,用于测试网站是否可以访问
      uri:
        url: http://{{item}}
      loop:
        - node1
        - node2
  # yaml格式结束行,一般省略

语法校验命令: ansible-playbook --syntax-check playbook.yaml 如果缩进有问题,它会精确指出报错的行号

空运行命令,模拟运行并不真正执行:ansible-playbook playbook.yaml -C

YAML 单行字符串

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

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

YAML 多行字符串

使用竖线(I)字符表示,所见即所得,保留字符串中的换行字符。
示例:

---
- name: test string
  hosts: node1
  tasks:
   - name: test string
  # 用户显示变量值或者字符串
     debug:
       msg: |
         Example Company
         123 Main Street
         Atlanta, GA 30303

使用大于号(>)字符表示换行字符。执行时空格代替换行符,并且行内的引导空白将被删除
示例:

---
- name: test string
  hosts: node1
  tasks:
    - name: test string
   # 用户显示变量值或者字符串
      debug:
        msg: >
          This is an example
          of a long string,
          that will become
          a single sentence once folded.

这种方法通常用于将很长的字符串在空格字符处断行,使它们跨占多行来提高可读性

  • 提高输出详细程度

-v,显示任务结果。一般情况使用 -v 即可。
-vv,任务结果和任务配置都会显示。
-vvv,包含关于与受管主机连接的信息。
-vvvv,增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,以及所执行的脚本。

Playbook 提权

在playbook中指定此关键字将覆盖/etc/ansible/ansible.cfg文件中的设置特权升级属性
remote_user,指定ssh用户

become,启用或禁用特权升级
become_method,启用特权升级的方法
become_user,特殊升级的帐户

---
- name: Enable intranet services
  hosts: node1
  remote_user: test
  become: true
  become_method: sudo
  become_user: root
  tasks:
  - name: latest version of httpd and firewalld installed
    yum:
      name:
      - httpd
      - firewalld
    state: latest
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐