Ansible Playbook简介
ansbile-playbook是一系列ansible命令的集合,利用yaml 语言编写。playbook命令根据自上而下的顺序依次执行。同
时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容
并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
playbook通过ansible-playbook命令使用,它的参数和ansible命令类似,如参数-k(–ask-pass) 和 -K (–ask-sudo) 来询问ssh密码
和sudo密码,-u指定用户,这些指令也可以通过规定的单元写在playbook 。
ansible-playbook的简单使用方法: ansible-playbook example-play.yml 。
eg3.1:简单的Playbook
---
- name: Configure important user consistently
hosts: servera.lab.example.com
tasks:
- name:newbie exists with UID 4000
user:
name:newbie
uid:4000
state:present
Playbook是以YAML格式编写的文本文件,通常使用扩展名yml保存。Playbook使用空格字符缩进来表示其数据结构。YAML对用于缩进的空格数量没有严格的要求,但必须有两个基本的规则。
●处于层次机构中同一级别的数据元素(例如同一列表的项目)必须具有相同的缩进量。
●如果项目属于其他项目的子项,其缩进量必须大于父项。
重要
如果您使用vi文本编辑器,您可以应用一些设置,以便能更加轻松地编辑playbook。eg,在$HOME/ .vimrc 文件中添加下面这行后,如果vi检测到您在编辑YAML文件,它将Tab键按下时执行一个双空格缩进,并自动缩进后续行。
vim ~/.vimrc
autocmd FileType yaml setlocal ai ts=2 sw=2 et
Playbook基本语法
下面是一个简单的ansible-playbook示例,可以了解其构成:
# cat user.yml
- name: create user
hosts: all
remote_user: root
gather_facts: false
vars:
user:"test"
tasks:
- name: create user
user: name="{{ user }}"
配置项说明:
●name :对该playbook实现的功能做一个概述,后面执行过程中,会打印 name变量的值
●hosts :指定对哪些被管理机进行操作;
●remote_user :指定在远程被管理机上执行操作时使用什么用户,如不指定,则使用ansible.cfg中配置的
remote_user
●gather_facts :指定在执行任务之前,是否先执行setup模块获取主机相关信息,如未用到,可不指定
●vars :定义后续任务中会使用到的变量,如未用到,可不指定
●tasks :定义具体需要执行的任务
同样,如果想实现把这个新增的用户删除,只需将该playbook文件的最后一行替换为如下行再执行相应的playbook即可:
user: name="{{ user }}" state=absent remove=yes
Playbook简单示例
下面通过playbook管理一个httpd服务器来简单了解下playbook的应用:
1.创建playbook
# cat manage_apache.yml
- name: play to setup web server
hosts: all
tasks:
- name: latest httpd version installed
yum:
name: httpd
state: latest
- name: correct index.html is present
copy:
src: files/index.html
dest: /var/www/html/index.html
- name: start httpd service
service:
name: httpd
state: started
enabled: true
2. 执行playbook
运行playbook
ansible-playbook site.yml
# ansible-playbook manage_apache.yml
PLAY [play to setup web server] ***********************************************************
TASK [Gathering Facts] ********************************************************************
ok: [10.1.61.187]
TASK [latest httpd version installed] *****************************************************
changed: [10.1.61.187]
TASK [correct index.html is present] ******************************************************
changed: [10.1.61.187]
TASK [start httpd service] ****************************************************************
changed: [10.1.61.187]
PLAY RECAP ********************************************************************************
10.1.61.187 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
ansible-playbook常用选项
1. 打印详细信息
ansible-playbook 命令提供的默认输出不提供详细的任务执行信息。ansible-playbook -v
命令提供了额外的信息,总共有四个级别。
●-v:打印任务运行结果
●-vv:打印任务运行结果以及任务的配置信息
●-vvv:包含了远程连接的一些信息
●-vvvv:Adds extra verbosity opƟons to the connecƟon plug-ins,including the users being used in the managed hosts to
execute scripts, and what scripts have been executed
# ansible-playbook manage_apache.yml -vv
选项 | 描述 |
---|---|
-v | 显示任务结果。 |
-vv | 任务结果和任务配置都会显示 |
-vvv | 包含关于与受管主机连接的信息 |
-vvvv | 增加了连接插件相关的额外详细程度选项,包括受管主机上用于执行脚本的用户,以及所执行的脚本 |
2. 校验playbook语法
# ansible-playbook --syntax-check manage_apache.yml
playbook: manage_apache.yml
3.测试运行playbook
通过-C选项可以测试playbook的执行情况,但不会真的执行:
# ansible-playbook -C manage_apache.yml
PLAY [play to setup web server] ***********************************************************
TASK [Gathering Facts] ********************************************************************
ok: [10.1.61.187]
TASK [latest httpd version installed] *****************************************************
ok: [10.1.61.187]
TASK [correct index.html is present] ******************************************************
ok: [10.1.61.187]
TASK [start httpd service] ****************************************************************
ok: [10.1.61.187]
PLAY RECAP ********************************************************************************
10.1.61.187 : ok=4 changed=0 unreachable=0 failed=0 skipped=0
Multple Plays
# This is a simple playbook with two plays
- name: first play
hosts: web.example.com
tasks:
- name: first task
yum:
name: httpd
status: present
- name: second task
service:
name: httpd
state: started
- name: second play
hosts: db.example.com
tasks:
- name: first task
yum:
name: mariadb-server
status: present
- name: second task
service:
name: mariadb
state: started
实施多个PLAY
---
# This is a simple playbook with two plays
- name: first play
hosts: web.example.com
tasks:
- name: first task
yum:
name: httpd
status:present
- name: second task
service:
name: httpd
enabled: true
- name: second play
hosts: database.example.com
tasks:
- name: first task
service:
name: mariadb
enabled: true
YAML 注释
注释也可以用于提高可读性。在YAML中,编号或井号符号(#)右侧的所有内容都是注释。如果注释的左侧有内容,请在该编号符号前面加一个空格。
# This is a YAML comment
some data # This is also a YAML comment
YAML字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TN9TtAVg-1649737325814)(C:\Users\17589\AppData\Roaming\Typora\typora-user-images\image-20220411200111641.png)]
this is a string
'this is another string'
"this is yet another a string"
编写多行字符串有两种方式。可以使用竖线(|)字符表示要保留字符串中的换行字符。
include_newlines: |
Example Company
123 Main Street
Atlanta,GA 30303
fold_newlines: >
This is an example
of a long string,
that will become
a single sentence once folded.
YAML字典
YAML列表
放行防火墙
- name:firewalld permits access to httpd service
firewalld:
service: http
permanent: true|yes # 永久生效
state: enabled
immediate: yes