Ansible playbook实现apache批量部署,并对不同主机提供以各自IP地址为内容的index.html
环境准备:
[root@ansible ~]#mkdir /data/ansible
[root@ansible ansible]#cd /data/ansible/
[root@ansible ansible]#cp /etc/ansible/ansible.cfg .
[root@ansible ansible]#ansible --version
ansible 2.9.27
config file = /data/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
[root@ansible ansible]#vim ansible.cfg
inventory = ./hosts
[root@ansible ansible]#cp /etc/ansible/hosts .
[root@ansible ansible]#cat hosts
[webservers]
10.0.0.17
10.0.0.27
[root@ansible ansible]#ansible webservers -m ping
10.0.0.27 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.0.0.17 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Playbook常见组件:
Hosts:执行的远程主机列表
Tasks:任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括name和task,一个name只能包括一个task
Variables:内置变量或自定义变量在playbook中调用
Templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
Handlers和notify结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
tags:标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
roles角色:
角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。
简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
运维复杂的场景:建议使用 roles,代码复用度高
roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中
roles各目录作用:
roles/project/:项目名称,有以下子目录
files/:存放由copy或script模块等调用的文件
templates/:template模块查找所需要模板文件的目录
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含
vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
创建role:
创建role的步骤:
1、创建role的目录结构,在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
2、编写和准备role的功能文件
3、编写playbook文件调用需要的角色应用于指定的主机
1、创建httpd角色相关的目录
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#mkdir -pv /data/ansible/roles/httpd/{tasks,handlers,files}
2、创建httpd角色相关的文件
[root@ansible ansible]#cd /data/ansible/roles/httpd/
#main.yml 是task的入口文件
[root@ansible httpd]#vim tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: index.yml
- include: service.yml
[root@ansible httpd]#vim tasks/group.yml
- name: create apache group
group: name=apache system=yes gid=80
[root@ansible httpd]#vim tasks/user.yml
- name: create apache user
user: name=apache system=yes shell=/sbin/nologin home=/var/www/ uid=80 group=apache
[root@ansible httpd]#vim tasks/install.yml
- name: install httpd package
yum: name=httpd
[root@ansible httpd]#vim tasks/config.yml
- name: config file
copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes
notify: restart
[root@ansible httpd]#vim tasks/index.yml
- name: index.html
copy: src=index.html dest=/var/www/html/
[root@ansible httpd]#vim tasks/service.yml
- name: start service
service: name=httpd state=started enabled=yes
[root@ansible httpd]#vim handlers/main.yml
- name: restart
service: name=httpd state=restarted
3、在files目录下准备两个文件
[root@ansible httpd]#cat files/index.html
<h1> Welcome to http website </h1>
[root@ansible httpd]#cp /etc/httpd/conf/httpd.conf files/httpd.conf
[root@ansible httpd]#ls files/
httpd.conf index.html
[root@ansible httpd]#tree
.
├── files
│ ├── httpd.conf
│ └── index.html
├── handlers
│ └── main.yml
└── tasks
├── config.yml
├── group.yml
├── index.yml
├── install.yml
├── main.yml
├── service.yml
└── user.yml
3 directories, 10 files
4、在playbook中调用角色
[root@ansible httpd]#cd ..
[root@ansible roles]#pwd
/data/ansible/roles
[root@ansible roles]#cd ..
[root@ansible ansible]#pwd
/data/ansible
[root@ansible ansible]#vim /data/ansible/role_httpd.yml
---
# httpd role
- hosts: webservers
remote_user: root
roles:
- httpd
5、运行playbook
[root@ansible ansible]#ansible-playbook -C role_httpd.yml
[root@ansible ansible]#ansible-playbook role_httpd.yml
[root@ansible ansible]#curl 10.0.0.17
<h1> Welcome to http website </h1>
[root@ansible ansible]#curl 10.0.0.27
<h1> Welcome to http website </h1>