Ansible能够按照不一样的角色来部署服务,这样能够更加清晰地为不一样用途的服务器进行分类管理。
例如建立一个base 角色,用来初始化新装的服务器,好比安装基本的软件包、关闭防火墙和selinux,启动相关的服务等。同时分别建立web 和database的角色来定义和安装配置web服务器和数据库服务器。mysql
系统环境和软件版本同上一篇文章。linux
建立一个base 角色
在/etc/ansible/roles目录下建立base目录,而且在base下建立三个目录tasks, templates和handlers.web
/etc/ansible/roles/ └── base # 角色名base ├── handlers # 用来触发一些重启服务的操做 ├── tasks # 要编排的任务放在该目录下 └── templates # 放置一些配置的模板文件
每一个目录下必须包含main.yml文件用来添加任务内容,例如添加任务到tasks/main.yml文件:sql
--- - 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
app
则模板文件会调用该变量的值并传递给客户端机器socket
依照上述步骤在分别创建两个角色 web 和 database
web 目录结构以下所示ide
web ├── handlers ├── tasks │ └── main.yml └── templates
任务tasks/main.yml 配置以下,为简化配置暂时使用默认配置ui
--- - 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角色定义的配置和操做。