文章目录
一、Ansible-playbook
一个不同于Ansible命令行执行方式的模式,其功能更强大灵活。简单来说,playbooks是一个非常简单的配置管理和多主机部署系统。值得注意,playbook是通过YAML格式来进行描述定义的。
Playbooks 可用于声明配置,在 playbooks 中可以编排有序的执行过程,甚至于做到在多组机器间,来回有序的执行特别指定的步骤.并且可以同步或异步的发起任务.
- 作用:将多个模块操作的功能进行整合;实现重复工作简单化(提高工作效率);实现特殊需求
- 使用adhoc 时,主要是使用 /usr/bin/ansible 程序执行任务.而使用 playbooks 时,更多是将之放入源码控制之中,用之推送你的配置或是用于确认你的远程系统的配置是否符合配置规范.
- Ansible中文权威指南
1.1 核心元素
- Hosts 执行的远程主机列表
- Tasks 任务集
- Varniables 内置变量或自定义变量在playbook中调用
- Templates 模板,即使用模板语法的文件,比如配置文件等
- Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
1.2 YAML编写格式
- 文件的第一行应该以"—"三个连字符开始,表示YAML文件的开始。可以连续三个连子号(—)区分多个play。
- 在同一行中,#之后的内容表示注释
- YMAL中的列表元素以 “-” 开头然后紧跟着一个空格,同一个列表中的元素应该保持相同的的缩进。
- 注意缩进的关系:两个空格一个缩进关系。缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行实现的。
- 创建键值对 :使用冒号(如 age: 18)冒号后面必须是一个空格;如果没有空格是错误的;(如 age:18(错误))
1.3 常用命令
运行ymal文件 : ansible-playbook filename.yml
检查语法结构 : ansible-playbook --syntax-check filename.yml
模拟执行剧本 : ansible-playbook -C filename.yml
[root@ansible PlayBook]# ansible-playbook -h
#ansible-playbook常用选项:
--check or -C #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出playbook文件中定义所有的tags
--list-tasks #列出playbook文件中定义的所以任务集
--limit #主机列表 只针对主机列表中的某个主机或者某个组执行
-f #指定并发数,默认为5个
-t #指定tags运行,运行某一个或者多个tags。(前提playbook中有定义tags)
-v #显示过程 -vv -vvv更详细
二、Ansible-playbook的简单编写
为了编写方便,我们可以更改当前目录的缩进为:两个空格为一个缩进。
编写 .vimrc文件
autocmd FileType yaml setlocal ai ts=2 sw=2 et
2.1 安装且配置httpd
1、创建playbook文件: vim install.yml
- 注意:调用copy模块去配置apache默认访问页面时,copy模块要调用的文件和YAML文件是在同一目录下的。
2、执行playbook : ansible-playbook apache/install.yml
3、还可以加入变量 http_port 使得YMAL文件更加便于使用
---
- hosts: test
vars:
- http_port: 80
tasks:
- name: install apache
yum:
name: httpd
state: present
- name: config apache
template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart apache
- name: start apache
service:
name: httpd
state: started
enabled: yes
- name: create index.html
copy:
src: index.html
dest: /var/www/html/index.html
- name: start firewalld
service:
name: firewalld
state: started
enabled: yes
- name: config firewalld
firewalld:
service: http
state: enabled
permanent: yes
immediate: yes
handlers:
- name: restart apache
service:
name: httpd
state: restarted
- hosts: localhost
become: false
tasks:
- name: test apache
uri:
url: 'http://172.25.37.2:{{ http_port }}'
return_content: yes
三、playbook基础详解
3.1 Tasks 列表
- 每一个 play 包含了一个 task 列表.一个 task 在其所对应的所有主机上执行完毕之后,下一个 task 才会执行。
- 在运行 playbook 时(从上到下执行),如果一个 host 执行 task 失败,这个 host 将会从整个playbook
的整个执行过程中移除. 如果发生执行失败的情况,改正playbook 中的错误,然后重新执行即可. - 每个 task 的目标在于执行一个 moudle, 通常是带有特定的参数来执行.在参数中可以使用变量(variables)modules 具有幂等性,即,遇到远端系统被意外改动,需要恢复原状,当再一次地执行 moudle,moudle只会执行必要的改动,只会改变需要改变的地方.所以重复多次执行 playbook 也很安全.
3.2 Handlers:在发生改变时执行的操作
当发生改动时,notify actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, notify 只会被触发一次.
- Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.
- handlers 会按照声明的顺序执行
3.3 变量的优先级
如果同样名称的变量在多个地方都有定义,那么采纳是有个确定的顺序,如下:
- extra vars (在命令行中使用 -e)优先级最高
- 然后是在inventory中定义的连接变量(比如ansible_ssh_user)
- 接着是大多数的其它变量(命令行转换,play中的变量,included的变量,role中的变量等)
- 然后是在inventory定义的其它变量
- 然后是由系统发现的facts
- 然后是 “role默认变量”, 这个是最默认的值,很容易丧失优先权