配置Ansible Role
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置Ansible Role相关的知识,希望对你有一定的参考价值。
Ansible可以按照不同的角色来部署服务,这样可以更加清晰地为不同用途的服务器进行分类管理。
例如创建一个base 角色,用来初始化新装的服务器,比如安装基本的软件包、关闭防火墙和selinux,启动相关的服务等。同时分别创建web 和database的角色来定义和安装配置web服务器和数据库服务器。
系统环境和软件版本同上一篇文章。
创建一个base 角色
在/etc/ansible/roles目录下创建base目录,并且在base下创建三个目录tasks, templates和handlers.
/etc/ansible/roles/
└── base # 角色名base
├── handlers # 用来触发一些重启服务的操作
├── tasks # 要编排的任务放在该目录下
└── templates # 放置一些配置的模板文件
每个目录下必须包含main.yml文件用来添加任务内容,例如添加任务到tasks/main.yml文件:
---
- name: disable selinux # 禁用selinux
selinux: state=disabled
- name: stop unused services # 停止不需要的服务
service: name={{ item }} state=stopped
with_items:
- atd
- firewalld
- chronyd
- tuned
- NetworkManager
- name: install packages # 安装需要的软件包
yum: name={{ item }} state=installed # 采用循环的方式取出各种安装包名称
with_items:
- "@base"
- "@Development tools"
- "@System Administration Tools"
- ntp
- name: ntp template # 配置ntp文件模板
template: src=ntp.conf.j2 dest=/etc/ntp.conf # 设置ntp模板文件的源路径和目标路径,模板采用jinja模板格式
tags: ntp # 设置标签为ntp
notify: restart ntp # notify 触发handler的重启操作,一旦更新了配置后就重启服务
- name: add group # 添加一个组
group: name=testgroup state=present gid=1010
- name: add users # 添加用户, 可按循环方式添加用户
user: name={{item.name}} state=present groups={{item.groups}} uid={{item.uid}}
with_items:
- {name: ‘testuser1‘,groups: ‘testgroup‘,uid: ‘1021‘}
- {name: ‘testuser2‘,groups: ‘testgroup‘,uid: ‘1022‘}
- name: set sysctl value # 设置sysctl内核参数
sysctl:
name: "{{item.name}}"
value: "{{item.value}}"
state: present
sysctl_set: yes
reload: yes
with_items:
- { name: ‘net.core.rmem_max‘, value: ‘16777216‘ }
- { name: ‘net.core.wmem_max‘, value: ‘7340032‘ }
- { name: ‘vm.swappiness‘, value: ‘5‘ }
在templates 目录中放置ntp模板文件ntp.conf.j2
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server {{ ntp_server }} # 此处可以将ntp服务器IP地址设置为变量,并且可以在/etc/ansible/group_vars中定义该变量
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
在handlers的main.yml配置文件中添加要触发的服务,一旦ntp配置更新后,就会触发handler去重启ntp服务达到生效的目的
---
- name: restart ntp
service: name=ntpd state=restarted
关于配置中变量的定义, 在/etc/ansible 目录下分别创建 group_vars和host_vars,分别代表组变量和主机变量,我们在group_vars目录下面建立testservers文件,添加如下内容ntp_server: 192.168.1.101
则模板文件会调用该变量的值并传递给客户端机器
依照上述步骤在分别建立两个角色 web 和 database
web 目录结构如下所示
web
├── handlers
├── tasks
│ └── main.yml
└── templates
任务tasks/main.yml 配置如下,为简化配置暂时使用默认配置
---
- name: install httpd server
yum:
name: httpd
state: installed
database 目录结构如下所示
database/
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── my.cnf.j2
任务tasks/main.yml 配置如下:
---
- name: setup database server
yum: name={{ item }} state=present # 安装 mariadb 服务器端, present和installed代表状态相同
with_items:
- mariadb-server
- mariadb-devel
- mariadb
- name: database template
template: src=my.cnf.j2 dest=/etc/my.cnf # 设置 mariadb 的配置模板
tags: mariadb
notify: restart mariadb
模板 templates/my.cnf.j2 内容如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
handlers/main.yml 配置如下,当配置变更时,触发重启mariadb命令
---
- name: restart mariadb
tags: mariadb
service: name=mariadb state=restarted
最后编辑playbook /etc/ansible/dev.yml,该playbook作为最终调用的配置,内容如下
---
- name: apply base config for dev servers
hosts: testservers # 对testservers组的主机更改配置
remote_user: root
roles: # 应用的角色为base 和 web
- base
- web
- name: apply db config for db servers # 对dbservers组的主机更改配置
hosts: dbservers
remote_user: root
roles: # 应用base 和database角色
- base
- database
注意 /etc/ansible/hosts文件要更新对应组和主机列表,才能匹配角色对主机的应用
[testservers] # 组
test3 # 主机
[dbservers]
test4
运行命令 ansible-playbook dev.yml 来执行该playbook
至此完成了一个比较简单的Ansible角色定义的配置和操作。
以上是关于配置Ansible Role的主要内容,如果未能解决你的问题,请参考以下文章
34-Ansible常用playbook和大型项目role角色拆分