在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