目录
一、Playbook简介
二、Playbook核心元素
三、Playbook语法
四、Playbook的运行方式
五、Playbooks中tasks语法使用
1、file
2、lineinfile
3、replace
4、shell
5、template/copy
6、fetch
7、unarchive
8、wait_for
9、when
10、pause
11、register
12、run_once
13、debug
14、delegate_to
15、local_action
16、ignore_errors
17、user
18、group
19、yum
20、cron
playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,可以让远程主机达到预期状态,也可以说,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。
ansible使用playbook来管理自动化task,playbook是yaml格式的文件,其基本内容可以认为是多条ansible的ad-hoc的语句组成。我们完成一个任务,例如安装部署一个httpd服务,我们需要多个模块(一个模块也可以称之为task)提供功能来完成。而playbook就是组织多个task的容器,他的实质就是一个文件,是用yaml(Yet Another Markup Language)语言编写的文件,有着特定的组织格式。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便,YAML语法能够简单的表示散列表,字典等数据结构。
playbook命令根据自上而下的顺序依次执行。同时,playbook开创了很多特性,它可以允许你传输某个命令的状态到后面的指令,如你可以从一台机器的文件中抓取内容并附为变量,然后在另一台机器中使用,这使得你可以实现一些复杂的部署机制,这是ansible命令无法实现的。
playbook使用yaml语法格式,后缀可以是yaml,也可以是yml
通过ansible-playbook命令运行
ansible-playbook ... [options]
常用命令:
ansible-playbook filename.yml [options]
# ssh 连接的用户名
-u REMOTE_USER, --user=REMOTE_USER
# ssh登录认证密码
-k, --ask-pass
# sudo 到root用户,相当于Linux系统下的sudo命令
-s, --sudo
# sudo 到对应的用户
-U SUDO_USER, --sudo-user=SUDO_USER
# 用户的密码(—sudo时使用)
-K, --ask-sudo-pass
# ssh 连接超时,默认 10 秒
-T TIMEOUT, --timeout=TIMEOUT
# 指定该参数后,执行 playbook 文件不会真正去执行,而是模拟执行一遍,然后输出本次执行会对远程主机造成的修改
-C, --check
# 设置额外的变量如:key=value 形式 或者 YAML or JSON,以空格分隔变量,或用多个-e
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
# 进程并发处理,默认 5
-f FORKS, --forks=FORKS
# 指定 hosts 文件路径,默认 default=/etc/ansible/hosts
-i INVENTORY, --inventory-file=INVENTORY
# 指定一个 pattern,对- hosts:匹配到的主机再过滤一次
-l SUBSET, --limit=SUBSET
# 只打印有哪些主机会执行这个 playbook 文件,不是实际执行该 playbook
--list-hosts
# 列出该 playbook 中会被执行的 task
--list-tasks
# 私钥路径
--private-key=PRIVATE_KEY_FILE
# 同一时间只执行一个 task,每个 task 执行前都会提示确认一遍
--step
# 只检测 playbook 文件语法是否有问题,不会执行该 playbook
--syntax-check
# 当 play 和 task 的 tag 为该参数指定的值时才执行,多个 tag 以逗号分隔
-t TAGS, --tags=TAGS
# 当 play 和 task 的 tag 不匹配该参数指定的值时,才执行
--skip-tags=SKIP_TAGS
# 输出更详细的执行过程信息,-vvv可得到所有执行过程信息。
-v, --verbose
操作文件,比如创建文件或目录、删除文件或目录、修改文件权限等
常用参数:
directory - 与path结合说明我们要操作的是一个目录
touch - 与path结合说明我们要操作的是一个文件
link - 创建软连接
hard - 创建硬链接
absent - 删除目标
示例:
- name: 创建一个testfile文件
file: path=/tmp/testfile state=touch
- name: 创建一个目录,并指定目录权限
file: path=/tmp/data state=directory mode=0755
- name: 删除一个目录
file: path=/tmp/data state=absent
- name: recurse默认为no,指定为yes代表以递归方式指定文件权限
file: dest=/user/bin mode=0755 recurse=yes
修改文件某一行文本
常用参数:
示例:
- name: 替换文件中包含line123的行为testline
lineinfile: path=/tmp/test regexp="^line" line="testline"
根据正则表达式替换文件内容
常用参数:
简单示例:
- name: 将/tmp/test文件中的ABC替换成abc
repace:path=/tmp/test regexp="ABC" replace=abc
执行脚本命令
示例:
- shell: mkdir /tmp/mytest
- shell: echo "export JAVA_HOME=/opt/jdk" >> /etc/profile
模板作用类似于copy,可将文件分发到不同节点上
常用参数:
示例:
- template: src=/mytemplates/tt.j2 dest=/etc/file.conf
- template: src=/mytemplates/tt.j2 dest=/etc/file.conf group=wheel mode=0644
- template: src=/mytemplates/suzuka.j2 dest=/etc/suzuka validate='visudo -cf %s'
功能与copy类似,但是是用于从远程主机中拷贝文件到管理主机,不能拷贝目录
常用参数:
示例:
- fetch: src=/tmp/test dest=/tmp/
解压缩,将压缩文件解压分发到不同节点上
常用参数:
示例:
- unarchive: src=/myfiltes/jdk.tar.gz dest=/opt
等待某些操作完成以后再进行后续操作
常用参数:
示例:
- name: 每隔10s检查一次,等待8080端口正常监听,才开始下一个任务,直到超时
wait_for: port=8080 state=started delay=10
- name: 等待文件创建
wait_for: path=/tmp/tt
条件判断,满足后再执行任务
示例:
- name: 判断变量tt是否定义
shell: echo "I've got {{ tt }}"
when: tt is defined
暂停一定时间
常用参数:
示例:
- name: 等待用户30s用于输入
pause: seconds=30 prompt="ENTER to continue CTRL-C a to quit"
用于注册一个变量,保存命令的结果,常与when结合使用
示例:
- name: 执行pwd
shell: /bin/pwd
register: pwd_result
- name: 当路径中包含"home"显示路径
shell: echo {{ pwd_result }}
when: pwd_result.stdout.find('home') != -1
指定该task只能在某一台机器上执行一次,可以和delegate_to结合使用,如果没有delegate_to,那么这个task会在第一台机器上执行
简单示例:
- name: 在web.example.org机器上刷新环境变量
shell: source /etc/profile
run_once: true
用于在调试中输出信息
简单示例:
- name: 显示调试信息
debug: var=pwd_result
任务委派功能,指定在某一台机器上执行一个操作
本地操作功能,在运行ansible命令机器上执行一个操作
忽略错误的命令,通常情况下当出现执行失败时ansible会停止运行,有时候你会想要继续执行下去就需要添加这个
简单示例:
- name: 删除临时目录
shell: rm /tmp/data
ignore_errors:yes
用户的管理
用户组的管理
常用参数:
present:增加
absent:删除
软件包管理
常用参数:
name:指定需要管理的软件包名
state:参数非常灵活,可以包含的值及含义如下
present:确保软件包已经安装了
installed:安装
latest:安装最新的软件包
removed/absent:删除对应的软件包
disable_gpg_check:用于禁用对rpm包公钥验证,默认值no表示不禁用验证,yes表示禁用验证
示例:
- name:安装httpd服务
yum: name=httpd state=latest
- name: 删除旧版gcc
yum: name = {{ item }} state=removed
with_items:
- gcc
- httpd
- php
定时任务,功能相当于crontab
常用参数:
name:任务名称
minute:分, hour:时,day:天,month:月,weekday:周
job:指定要执行的命令或者脚本
state:当设置为absent代表删除任务
示例:
- name: 新增一个定时查看路径任务
cron: name=check minute=5 job='pwd'