Ansible-playbook roles 实战总结
目录结构展示
主要实现自动化部署客户服务器初始环境
# tree
.
├── baseenv
│ ├── files
│ ├── handlers
│ ├── tasks
│ ├── templates
│ └── vars
├── deploy
│ ├── files
│ │ ├── 504.lic
│ │ ├── 505.lic
│ │ ├── stable-2.91-1.sql
│ │ └── stable-2.91-2.sql
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── base.yml
│ │ ├── main.yml
│ │ ├── mysql.yml
│ │ └── vpn.yml
│ ├── templates
│ │ ├── Initmysql.sh.j2
│ │ ├── motd.j2
│ │ └── stable_2.91.sql.j2
│ └── vars
│ └── main.yml
├── hosts
└── site.yml
files目录:存放一些常用不变的文件
handlers目录:用于一些重启服务的触发规则
tasks目录:正儿八经的任务描述
templates目录:存放一些需要包装按需求描述的文件
vars目录:全局变量描述
hosts文件:主机组 若想对单个主机实现,则可以另建host_vars、 group_vars目录,然后在目录下自定义
任务介绍
任务描述
一开始把任务写在一个main.yml 文件中,但是后来发现挺乱的。
将每个任务以模块的形式展开,在集中调用比较方面,相互之间的 耦合度也没有那么高,可扩展
$ cat deploy/tasks/base.yml # 就拷贝一些文件过去
- name: Copy motd file
template:
src: ./motd.j2
dest: /etc/motd
- name: Update hostname {{ hostname }}
shell: hostnamectl set-hostname {{ hostname }}
- name: Copy License File
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
backup: yes
with_items:
- { src: "{{ license }}", dest: "/root/license/" }
- { src: "{{ licensetest }}", dest: "/root/license/" }
$ cat deploy/tasks/mysql.yml # 执行mysql脚本没有找到好的模块或者方法,就采用了脚本的形式
- name: Copy sqlfile
template:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
with_items:
- { src: "{{ stable_sql }}", dest: "{{ stable_sql_path }}" }
- { src: "Initmysql.sh.j2" , dest: "/root/Initmysql.sh" }
- name: Copy must exec sql
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
with_items:
- { src: "stable-2.91-1.sql", dest: "/root/" }
- { src: "stable-2.91-2.sql", dest: "/root/" }
- name: Exec sql script
shell: sh /root/Initmysql.sh
$ cat deploy/tasks/vpn.yml #自动安装VPN
- name: Install Openvpn Server
yum:
name: openvpn
state: present
- name: Download Vpnclient Conf {{ vpnclientfile }}
get_url:
url: http://10.10.10.10/yydsvpnfiles/{{ vpnclientfile }}
dest: "/etc/openvpn/client.conf"
- name: Start Openvpn Client
service:
name: openvpn@client.service
state: started
enabled: yes
- name: Check Openvpn Client Server
shell: ps aux | grep openvpn
register: check_openvpn
- name: Output info
debug:
msg: "{{ check_openvpn.stdout_lines }}"
$ cat deploy/tasks/main.yml # 聚合
---
- include: base.yml
- include: vpn.yml
- include: mysql.yml
$ cat site.yml # 入口文件
---
- hosts: test
roles:
- deploy
$ ansible-playbook test site.yml -i host
总结
- 这只是简简单单的拷贝文件的roles,具体的根据业务场景定制化,无非就是把一些命令行或者shell任务描述成编排的样式,最终一键部署, 但是某些场景用脚本还是脚本方便。
- 如果一个任务不知道用什么模块,可以先百度下,然后具体用法可以参照ansible-doc module 查询
- 变量需要注意使用引号,不然报错也会有提示
- 注意变量的完整性,能复制尽量复制粘贴