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>