Ansible教程:Playbook


在Ansible中,可以把经常需要执行的命令写入一个YAML格式文件。在文件中可以包含多个任务。一旦Playbook写好,我们可以随时调用脚本,执行一些复杂的系统任务。

YAML语法的注意点

  • 文件以 — 开始,以 … 结束,但开始和结束标志可选。
  • 注释符为 #
  • 缩进非常严格
  • 不要使用tab,而是使用空格
  • 区分大小写
  • 键值对使用冒号:来分隔;数组以 - 分隔
  • 跨行数据需要使用 > 或者 | (|会保留换行符)

Playbook

Playbook中可以包含多个play。可以通过ansible-playbook来运行playbook。每个play中可以包含:

  • hosts
  • tasks
  • variables
  • roles
  • handlers

简单示例

demo.yml

yaml
---
- hosts: all
  tasks:
    - name: Demo playbook
      ping:
    - name: Create a temporary file
      shell: touch /tmp/tmp.txt      

运行playbook

bash
ansible-playbook demo.yml

还可以在运行ansible-playbook时指定同时连接数:

bash
ansible-playbook demo.yml -f 5

同时添加多个play

yaml
---
- hosts: webserver
  tasks:
    - name: Demo playbook
      ping:
- hosts: dbserver
  tasks:
    - name: Create a temporary file
      shell: touch /tmp/tmp.txt      

常用playbook

创建用户

yaml
---
- hosts: dev
  tasks:
    - name: Add user lcoding
      user:
        name: lcoding
        shell: /bin/bash
        group: daemon
        password: "{{ '12345' | password_hash('sha512')}}"

删除用户

yaml
---
- hosts: dev
  tasks:
    - name: Delete user lcoding
      user:
        name: lcoding
        state: absent
        remove: yes

注意:remove参数的作用是在删除用户的同时删除用户目录。

通过apt在Ubuntu上安装软件

yaml
---
- hosts: dev
  tasks:
    - name: Install lynx & whois
      ansible.builtin.apt:
        name: 
          - lynx
          - whois

升级软件到最新版本

yaml
---
- hosts: dev
  tasks:
    - name: Update software
      ansible.builtin.apt:
        name: '*'
        state: latest

获取被控主机信息

yaml
---
- hosts: dev
  tasks:
    - debug:
        var: ansible_hostname
    - debug:
        msg: "RAM: {{ansible_memtotal_mb}} MB"

注意,这里的信息其实都是调用Ansible默认模块setup获取并返回的。

执行playbook时的错误处理

首先,Ansible自身的运行机制就是一旦运行中出现错误,后续的剧本就不会继续运行。

但我们可以通过设定 ignore_errors: true 来使得脚本在遇到错误时能够继续执行下去。

yaml
---
- hosts: dev
  tasks:
    - name: xxx
      service:
        name: NonExistingService
        state: started
      ignore_errors: true

需要注意的是,上面的 ignore_errors 只是表明在执行第一个任务失败后会继续,对后续任务没有影响。

如果想要在全局添加类似设定:

yaml
---
- hosts: dev
  ignore_errors: true
  tasks:
    - name: xxx
      service:
        name: NonExistingService
        state: started

这样的设定就会针对所有任务。

handlers

当需要定义不同任务的依赖关系时,可以通过handlers来实现。

yaml
---
- hosts: dev
  tasks:
    - name: create a subfolder
      file:
        path: /tmp/folder1
        state: directory
      notify: create a new file
  handlers:
    - name: create a new file
      file:
        path: /tmp/folder1/newfile.txt
        state: touch

条件执行任务

yaml
---
- hosts: dev
  tasks:
    - name: stop DB service when memory is low
      service:
        name: MariaDB-server
        state: stopped
      when: ansible_memfree_mb < 500

使用block定义一组任务

yaml
---
- hosts: dev
  tasks:
    - name: apache2
      block:
        - name: install apache2
          service:
            name: apache2
            state: present
        - name: start apache2
          service:
            name: apache2
            state: started
            enabled: yes
      when: ansible_distribution == 'Debian' or ansible_distribution == 'Ubuntu'

类似于编程语言中的Exception处理,在block中还可以使用rescue,always来定义出错时的处理逻辑。

循环的使用

例如:在目标主机的/tmp下创建三个文件:

yaml
---
- hosts: dev
  tasks:
    - name: touch multiple files
      file:
        path: /tmp/{{item}} # item is the keyword
        state: touch
      loop:
        - file1.txt
        - file2.txt
        - file3.txt

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !