Playbooks学习笔记
[TOC]
YAML语法
1 示例
---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
要使用引号来包裹任何包含冒号的哈希值
Ansible 使用 “{{ var }}” 来引用变量
Playbooks简介
Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合
Ansible 模块是工具,那么 playbooks 就是使用工具时设置的方案计划
现在越来越多的DevOPS(Development and Operations)也开始将目光移向了Ansible,因为Ansible可以轻松的将shell脚本或简单的shell命令转换为Ansible plays
1 示例
---
- hosts: all
sudo: yes
tasks:
- name: 安装Apache
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: 复制配置文件
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: 0644
with_items:
- {
src: "/tmp/httpd.conf",
dest: "/etc/httpd/conf/httpd.conf" }
- {
src: "/tmp/httpd-vhosts.conf",
dest: "/etc/httpd/conf/httpd-vhosts.conf"
}
- name: 检查Apache运行状态,并设置开机启动
service: name=httpd state=started enabled=yes
2 Playbook案例逐行剖析
现在我们已经对playbook有了一个大概的了解,接一下,让我们详细解剖一下上面的playbook都做了是什么以及怎么工作的。
- 1 第一行,“---”,这个是YAML语法中注释的用法,就像shell脚本中的“#”号一样
- 2 第二行,“- hosts: all”,告诉ansible具体要在哪些主机上运行我的剧本(playbook),在本例中是all,即所有主机
- 3 第三行,“sudo: yes”,告诉ansible通过sudo来运行相应命令,这样所有命令将会以root身份执行
- 4 第四行,“tasks:”,指定一系列将要运行的任务
每一个任务(play)以“- name: 安装Apache”开头。“- name:”字段并不是一个模块,不会执行任务实质性的操作,它只是给“task” 一个易于识别和名称。即便把name字段对应的行完全删除,也不会有任何问题。
本例中我们使用yum模块来安装Apache,替代了“yum -y install httpd httpd-devel”
在每一个play当中,都可以例用 with_items 来定义变量,并通过“{{ 变量名 }}”的形式来直接使用使用yum模块的state=present选项来确保软件被安装,或者使用state=absent来确保软件被删除
第二个任务(play)同样是“- name”字符开头
我们使用copy模块来将“src”定义的源文件(必须是ansible所在服务器上的本地文件 )复制到“dest”定义的目的地址(此地址为远程主机的上地址)去,在传递文件的同时,还定义了文件的属主,属组和权限
这个play中,我们用数组的形式给变量赋值,使用{var1: value, var2: value} 的格式来赋值,变量的个数可以任意多,不同变量间以逗号分隔,使用{{item.var1 }}的形式来调用变量,本例中为:{{ item.src }}
- 5 第三个任务(play)使用了同样的结构,调用了service模块,以保证服务的正常开启
3 Playbook与shell脚本对比
当我们重复执行一个playbook时,当ansible发现系统的现有状态符合playbook所定义的状态时,anbile将自动跳过该操作
4 Ansible-playbook命令详解
1 限定执行范围:--limit
修改
- hosts:
字段
添加
--limit
参数指定
$ansible-playbook playbook.yml --limit webservers
备注:--list-hosts
执行结果会显示受影响的主机
$ansible-playbook playbook.yml --list-hosts
2 用户与权限设置:--remote-user
#在ansible-playbook中使用 --remote-user选项来指定用户boy
$ansible-playbook playbook.yml --remote-user=boy
#当前用户Tom想以Jerry的身份运行playbook,命令如下,执行过程中,会要求用户输入Jerry的密码
$ansible-playbook playbook.yml --sudo --sudo-user=jerry --ask-sudo-pass
3 收集服务器的信息
#ansible有一个模块叫setup, 收集服务器的信息
$ansible all -m setup 2>&1 | tee info.txt
0,1,2:在linux分别表示标准输入、标准输出和标准错误信息输出
'<':支持输入重定向
#将hadoop-hadoop-jobtracker-brix-00.out的内容作为test.sh的输入
$sh test.sh < hadoop-hadoop-jobtracker-brix-00.out
'>':支持输出重定向
将内容全局覆盖式的加入文件,相当于删除该文件并重新建立该文件,再写入的效果
#将ls * 的所有信息输出到文件test.txt中
$ls * > test.txt
'>!':如果存在则覆盖
'>&':执行时屏幕上所产生的任何信息写入指定的文件中
'>>':追加到文件中
'>>&':屏幕上的信息追加到文件中
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
4 Ansible-playbook命令还有一些其他选项
--inventory=PATH (-i PATH):指定inventory文件,默认文件是/etc/ansible/hosts
--verbose(-v):显示详细输出,也可以使用-vvvv显示精确到每分钟的输出
--extra-vars=VARS(-e VARS):定义在playbook使用的变量,格式为:"key=value,key=value"
--forks=NUM ( -f NUM):指定并发执行的任务数,默认为5,根据服务器性能,调大这个值可提高ansible执行效率
--connection=TYPE ( -c TYPE):指定连接远程主机的方式,默认为ssh,设为local时,刚只在本地执行playbook,建议不做修改
--check:检测模式,playbook中定义的所有任务将在每台远程主机上进行检测,但并不真正执行
Playbooks示例
主机信息:
主机 | IP |
---|---|
boy1 | 115.159.192.111 |
boy2 | 118.89.188.52 |
boy3 | 107.170.254.14 |
$cat /ets/ansible/hosts
boy1
boy2
boy3
[web]
boy2
boy3
1 拷贝
copytest.yml文件
---
- hosts: boy2
tasks:
- name: 拷贝文件text.txt到boy2中
copy:
src=/root/playbooks/copyfile/test.txt
dest=/root/playbooks/copyfile/test.txt
owner=root
group=root
mode=0644
- name: 拷贝文件text到boy2中:2
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: 0644
with_items:
- {
src: "/root/playbooks/copyfile/test2.txt",
dest: "/root/playbooks/copyfile/test2.txt"
}
2 创建自己指定用户 加上了变量
$ansible-playbook createuser.yml --extra-vars "user=girl1"
createuser.yml文件
---
#create user
- name: create user
hosts: boy2
user: root
vars:
tasks:
- name: create {{ user }}
user: name="{{ user }}"
3 查看服务是否开启
$ansible-playbook playbook.yml
cat playbook.yml
---
#This is a test file
- hosts: boy3
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is running
service:
name: httpd
state: started
handlers:
- name: restart apache
service:
name: httpd
state: restarted
树形结构,对齐很重要
4 playbooks组成
Target section: 定义将要执行 playbook 的远程主机组
Variable section: 定义 playbook 运行时需要使用的变量
Task section: 定义将要在远程主机上执行的任务列表
Handler section: 定义 task 执行完成以后需要调用的任务
例子:
##############################################################################
---
- hosts: webservers //Target section
remote_user: root
vars: //Variable section
http_port: 80
max_clients: 200
tasks: //Task section
- name: ensure apache is at the latest version
yum: name=httpd state=latest
- name: write the apache config file
template: src=/srv/httpd dest=/etc/httpd.conf
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers: //Handler section
- name: restart apache
service: name=httpd state=restarted
##############################################################################
1、Hosts和Users
playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
hosts 用于指定要执行指定任务的主机其可以是一个或多个由冒号分隔主机组。
remote_user 则用于指定远程主机上的执行任务的用户。
不过remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务其可用于play全局或某任务。
此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户。
- hosts: webnodes
tasks:
- name: test connection ping:
remote_user: admin
sudo: yes
2、任务列表和action
play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。
在运行自下而下某playbook时如果中途发生错误所有已执行任务都将回滚因此在更正playbook后重新执行一次即可。
task的目的是使用指定的参数执行模块而在模块参数中可以使用变量。模块执行是幂等的这意味着多次执行是安全的因为其结果均一致。
每个task都应该有其name用于playbook的执行结果输出建议其内容尽可能清晰地描述任务执行步骤。如果未提供name则action的结果将用于输出。
3、handlers
用于当关注的资源发生变化时采取一定的操作
“notify”这个action可用于在每个play的最后被触发这样可以避免多次有改变发生时每次都执行指定的操作取而代之仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler也即notify中调用 handler中定义的操作。
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
#handler是task列表这些task与前述的task并没有本质上的不同。
handlers:
- name: restart memcached
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
4、tags
tags用于让用户选择运行或路过playbook中的部分代码
ansible具有幂等性因此会自动跳过没有变化的部分即便如此有些代码为测试其确实没有发生变化的时间依然会非常地长,此时如果确信其没有变化就可以通过tags跳过此些代码片断
示例:基于playbook 实现web 服务器的部署
1、提供好inventory 文件
#cat /etc/ansible/hosts
[webservers]
10.11.0.10
10.11.0.11
准备好http的配置文件: /root/httpd.conf
2、编辑 playbook 剧本
#cat /etc/ansible/install_web.yml
---
- hosts: webservers
remote_user: root
gather_fasks: False
vars:
packages: httpd
tasks:
- name: Install httpd
yum: name={{ packages }} state=present
- name: Cofiguration httpd
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
tags: httpd_conf
notify:
- restart httpd
- name: Start httpd
service: name=httpd state=started enabled=no
tags: start
- name:Add centos user
user: name={{ item }} state=absent
tags: adduser
with_items:
- centos
- admin
handlers:
- name: restart httpd
service: name=httpd state=restart
3、部署
#ansible-plbooks /etc/ansible/install_web.yml
参考
1 魏巍-Ansible系列课程-基础入门-Playbook入门篇
2017-12-15-Boy