Ansible-新装系统初始化

Ansible-新装系统初始化

介绍

ansible是一个自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible架构相对比较简单,无需agnet,仅需通过SSH连接客户机即可执行任务。

简单任务可以直接使用命令行方式运行,较复杂任务可以通过编写playbook方式运行,以下例子通过编写palybook方式,使用角色区分,简单初始化centos7。

语法参考:https://docs.ansible.com/ansible/latest/modules/modules_by_category.htm
Ansible Galaxy命令,用于安装指定的角色或集合:https://galaxy.ansible.com/

初始化文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## 创建整个项目文件夹
mkdir ansible-init
cd ansible-init
mkdir roles
touch ansible-host.lst

## 初始化roles
cd roles
ansible-galaxy init common

ansible-init/
├── ansible-host.lst
└── roles
└── common
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
└── main.yml

10 directories, 9 files

配置主机清单 ansible/ansible-host.lst

将主机分组,并定义变量,指定运行的用户或明文密码

1
2
3
4
5
6
7
8
9
10
[all]
192.168.8.252 hostname=vm252 server_type=app
192.168.8.253 hostname=vm252 server_type=db

[db]
192.168.8.253 hostname=vm252 server_type=db

[all:vars]
ansible_user=root
ansible_password=12341234

入口脚本 ansible/init.yml

这个是整个playbook入口,可以按不同主机组运行不同角色(roles)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
## 全部运行common角色
- hosts: all
user: root
gather_facts: true
roles:
- common
## db组运行db1角色、db2角色
- hosts: db
user: root
gather_facts: true
roles:
- db1
- db2

配置主脚本 ansible/roles/common/task/main.yml

主脚本默认为main.yml,里面可以包含各种子任务

1
2
3
4
5
6
7
8
---
- include_tasks: set-hosts.yml
##
- include_tasks: set-yum-repo-cdrom.yml
- include_tasks: set-centos7.yml
#- include_tasks: set-yum-repo-local.yml
- include_tasks: install-base-tools.yml
#- include_tasks: set-hy.yml

子任务1,ansible/roles/common/task/set-hosts.yml

这里用到copy,表示会在当前roles的files文件夹里查找hosts文件,并复制到目标主机

1
2
3
---
- name: set /etc/hosts
copy: src=hosts dest=/etc/hosts

子任务2,ansible/roles/common/task/set-yum-repo-local.yml

这里用到template,表示会将当前roles的templates文件夹查找local.repo.j2文件,并替换里面的变量后,复制到目标主机。需要修改为变量的场景,适合使用template模块。template使用jinja2语法。

1
2
3
{{ }} :用来装载表达式,比如变量、运算表达式、比较表达式等。
{% %} :用来装载控制语句,比如 if 控制结构,for循环控制结构。
{# #} :用来装载注释,模板文件被渲染后,注释不会包含在最终生成的文件中。
1
2
3
4
5
6
---
- name: backup yum repo files
shell: 'find /etc/yum.repos.d/ -name "*.repo" -exec mv {} {}.$(date +"%Y%m%d%H%M") \;'

- name: set yum repo
template: src=local.repo.j2 dest=/etc/yum.repos.d/local.repo

用到的变量在vars/main.yml里定义

1
2
3
4
5
6
7
8
9
prometheus:
base_path: /data/moni
server: 192.168.8.201:9090
consul: 192.168.8.201:18500
chrony:
server: 192.168.8.201
priority_networks: 192.168.8.0/24
yum:
server: 192.168.8.251:18001

template放在templates文件夹里,上面用到的是local.repo.j2

1
2
3
4
5
[base]
name=local
baseurl=http://{{ yum.server }}/
gpgcheck=0
enabled=1

运行

1
2
3
4
## 测试
ansible-playbook -i ansible_host.lst -C init.yml
## 运行
ansible-playbook -i ansible_host.lst init.yml

总结

整个初始化脚本框架搭建完毕

接下来需要添加各种子脚本,然后在主脚本main.yml引入即可