主机规划
主机名称 | 操作系统版本 | 内网IP | 外网IP(模拟) | 安装软件 |
---|---|---|---|---|
ansi-manager | CentOS7.5 | 172.16.1.180 | 10.0.0.180 | ansible |
ansi-haproxy01 | CentOS7.5 | 172.16.1.181 | 10.0.0.181 | |
ansi-haproxy02 | CentOS7.5 | 172.16.1.182 | 10.0.0.182 | |
ansi-web01 | CentOS7.5 | 172.16.1.183 | 10.0.0.183 | |
ansi-web02 | CentOS7.5 | 172.16.1.184 | 10.0.0.184 | |
ansi-web03 | CentOS7.5 | 172.16.1.185 | 10.0.0.185 |
添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
1 | # 使用一个专门的用户,避免直接使用root用户 |
Ansible 配置清单Inventory
之后文章都是如下主机配置清单
1 | [yun@ansi-manager ansible_info]$ pwd |
Ansible Roles 基本概述
前面已经学习了 变量、tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?
简单的回答就是:使用 roles。roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。以便 playbook 更好的调用。相比 playbook,roles 的结构更加的清晰有层次。
假如:无论我们安装什么软件都会安装时间同步服务,那么每个 playbook 都要编写时间同步服务的 task。此时我们可以将时间同步服务 task 写好,等到用的时候再调用即可。
注意事项:在编写 roles 的时候,最好能够将一个 task 拆分为一个文件,方便后续复用「彻底打散」。
Roles 目录结构
在 roles 目录下,可以使用如下命令创建目录
1 | ansible-galaxy init nfs roles # 其中 nfs 为目录名称 |
这样创建的目录是全目录,但是我们可能只需要部分目录,因此实际应用中大多数都由我们自己创建目录,而不是用命令创建目录。
示例目录构造如下:
1 | [yun@ansi-manager tmp]$ tree ./ |
目录说明:
1、首先要有 roles 目录,然后在 roles 目录下创建相应的目录。
2、roles 下的目录名最好见文知意,如 common 目录表示基础目录,是必要的;nfs 目录表示安装 nfs 服务;memcached 目录表示安装 memcached 服务;等等。
3、可以根据自身需要创建 roles 下的二级目录,不需要的目录可以不创建,没需要全目录创建。
4、roles 目录下的二级目录中,有些目录必须包含一个 main.yml 文件,以便 ansible 使用。
Roles 依赖关系
roles 允许在使用 role 时自动引入其他 role。roles 的依赖关系存储在 role 目录中的 meta/main.yml 文件中。
例如:安装 WordPress 是需要先确保 Nginx 和 PHP 都能正常运行,此时都可以在 WordPress 的 role 中定义依赖 Nginx 和 php-fpm 的 role。
1 | [yun@ansi-manager playbook]$ cat /app/roles/wordpress/meta/main.yml |
此时 WordPress 的 role 会先执行 Nginx 的 role,然后执行 php-fpm 的 role,最后再执行 WordPress 本身的 role。
Ansible Roles 案例实战-部署 NFS 服务
整体目录结构
1 | [yun@ansi-manager ansible_roles]$ pwd |
服务端信息
目录结构
1 | [yun@ansi-manager ansible_roles]$ pwd |
tasks任务目录信息
1 | [yun@ansi-manager ansible_roles]$ cat roles/nfs/tasks/main.yml |
handlers任务目录信息
1 | [yun@ansi-manager ansible_roles]$ cat roles/nfs/handlers/main.yml |
模板目录信息
1 | [yun@ansi-manager ansible_roles]$ cat roles/nfs/templates/exports.j2 |
客户端信息
客户端就比较简单了,就一个挂载任务
1 | [yun@ansi-manager ansible_roles]$ cat roles/nfs_client/tasks/main.yml |
变量信息
1 | [yun@ansi-manager ansible_roles]$ pwd |
playbook 信息
1 | [yun@ansi-manager ansible_roles]$ cat nfs_server.yml |
任务执行
1 | [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check nfs_server.yml # 语法检测 |
Ansible Roles 案例实战-部署 memcached 服务
整体目录结构
1 | [yun@ansi-manager ansible_roles]$ pwd |
服务信息
目录结构
1 | [yun@ansi-manager memcached]$ pwd |
tasks任务目录信息
1 | [yun@ansi-manager memcached]$ cat tasks/main.yml |
handlers任务目录信息
1 | [yun@ansi-manager memcached]$ cat handlers/main.yml |
模板目录信息
1 | [yun@ansi-manager memcached]$ cat templates/memcached.j2 |
playbook 信息
1 | [yun@ansi-manager ansible_roles]$ cat memcached_server.yml |
任务执行
1 | [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check memcached_server.yml # 语法检测 |
Ansible Roles 案例实战-部署 Rsync 服务
整体目录结构
1 | [yun@ansi-manager ansible_roles]$ pwd |
服务端信息
目录结构
1 | [yun@ansi-manager rsyncd]$ pwd |
tasks任务目录信息
1 | [yun@ansi-manager rsyncd]$ pwd |
handlers任务目录信息
1 | [yun@ansi-manager rsyncd]$ cat handlers/main.yml |
模板目录信息
1 | [yun@ansi-manager rsyncd]$ pwd |
客户端信息
1 | [yun@ansi-manager rsync_client]$ pwd |
变量信息
1 | [yun@ansi-manager ansible_roles]$ pwd |
playbook 信息
1 | [yun@ansi-manager ansible_roles]$ cat rsyncd_server.yml |
任务执行
1 | [yun@ansi-manager ansible_roles]$ ansible-playbook -b -i ../hosts_key --syntax-check rsyncd_server.yml # 语法检测 |
Ansible Galaxy
1 | https://galaxy.ansible.com |