Ansible
什么是Ansible
- Ansible是一个基于Python的自动化工具软件
- 安装后添加配置被管理的服务器,可以远程批量控制多台服务器进行同样操作。
- 控制操作完全基于SSH协议,不需要在被管理的服务器上安装任何客户端软件
- 三大核心组件:
playbook(剧本)、inventory(主机清单)、module(模块)
Ansible基本用法
- 主机安装ansible工具
shell
yum install ansible -y - 配置hosts文件添加被管理的服务器
shell
vim /etc/ansible/hosts
# 添加被管理的服务器
[webgroup] # 给下面3台服务器分到一组,组名为webgroup可以自定义
192.168.1.100
192.168.1.101
192.168.1.102
[dbgroup]
192.168.1.[10:20] # 代表 10~20 共11台
[server]
node2 ansible_host=192.168.1.11 ansible_port=22 ansible_user=root ansible_ssh_pass=123456
# 支持给单独每个服务器添加自定义的变量,例如:端口,用户名,密码等
# [组名:vars]格式支持给一个组同时添加自定义的变量
[dbgroup:vars]
ansible_port=22
ansible_user=root
ansible_ssh_pass=123456
ansible_ssh_private_key_file=/root/.ssh/id_rsa
# [组名:children]格式将所有组合并到allserver组中
[allserver:children]
webgroup
dbgroup
server 注意事项
- 当主机第一次通过ssh链接到其他服务器时候,会有一个链接提示确定信息,需要取消这个提示,方便后续操作
- vim /etc/ssh/sshd_config,找到
StrictHostKeyChecking no,取消注释,保存退出
常用命令
命令说明
- ansible 分组/主机 -m 模块名称 -a "参数值"。
-m:指定要执行的模块名称,-a:指定执行模块的参数值 - 其实你会发现
shell模块可以执行任何命令,完全用不到其他模块了,但是需要了解一些参数的关键词作用,在后续编写playbook脚本时会用到。
| 模块名称 | 用法命令格式 | 功能作用 | 常用参数说明 |
|---|---|---|---|
| ping 连通模块 | ansible 分组/主机 -m ping | 测试控制节点与被控节点 SSH 连通性 | 无需额外参数,仅检测网络+SSH 是否可用 |
| shell 执行命令模块 | ansible 分组/主机 -m shell -a "系统命令" | 远程执行复杂 Shell 命令 | 可以是任何shell命令,替代任何模块 |
| 外部清单调用 | ansible 分组/主机 -i 外部hosts文件路径 -m ping | 指定自定义主机清单文件,不使用默认 /etc/ansible/hosts | -i:指定外部主机清单文件路径 |
| yum 软件安装模块 | ansible 分组/主机 -m yum -a "name=软件名 state=present/absent" | 批量安装卸载软件 | state=present 安装 state=absent 卸载 name:可写单个包或包组 |
| systemd/service 服务模块 | ansible 分组/主机 -m service -a "name=服务名 state=started/stopped/restarted enabled=yes" | 管理系统服务启停、开机自启 | state=started 启动 state=stopped 停止 state=restarted 重启 enabled=yes 开机自启 |
Playbook
说明
- Playbook是一种YAML格式的一套文件,用于批量执行复杂的多任务和操作。
- 可以理解为把多个操作命令组织起来,形成一个任务序列,方便批量执行。
shell
ansible-galaxy init roles/test-demo # 初始化一个名为test-demo的角色目录,会生成一个playbook目录格式
roles/test-demo/
├── defaults/main.yml # 低优先级变量(默认值,不经常用)
├── handlers/main.yml # 触发器(重启服务常用,多与notify配合使用)
├── meta/main.yml # 角色说明、依赖(无视,不经常使用)
├── tasks/main.yml # 核心任务(main.yml)
├── templates/main.yml # 可以带变量的模板文件(jinjia2模板)
├── tests/ # 测试用(无视,不经常使用)
└── vars/main.yml # 自定义变量优先级高
├── site.yml # 启动入口,会调用上面指定任务目录所有文件执行相应内容(一般手动创建自定义启动文件) - roles里面可以放多个不同定义的任务
- /roles/
- test-demo1
- test-demo2
- test-demo3
- nginx-demo
- mysql-demo
- site.yml
- 每个任务都有相投的目录结构,目录下包含多个文件,每个文件都有自己的作用
- test-demo/
- defaults/
- main.yml
- files/
- file.conf
- handlers/
- main.yml
- tasks/
- main.yml
- templates/
- file.conf.j2
- vars/
- main.yml
- defaults/
案例
批量配置nginx
- 配置
/etc/ansible/hosts文件,添加待操作的主机列表 - 执行
ansible-galaxy init roles/nginx-demo生成初始化目录结构
- (主任务)task/main.yml
yaml
- name: install nginx # 安装nginx软件 相当于yum install nginx
yum:
name: nginx
state: present
- name: copy nginx.conf # 复制nginx.conf文件到目标主机的/etc/nginx/nginx.conf路径
copy:
src: nginx.conf # 自动去files目录下找nginx.conf文件
dest: /etc/nginx/nginx.conf #目的路径
notify: restart nginx # 只有这个任务触发了,才会去handlers目录下执行restart nginx任务
- name: ensure nginx running # 相当于systemctl start nginx && systemctl enable nginx
service:
name: nginx
state: started
enabled: yes - (触发器)handlers/main.yml
yaml
- name: restart nginx # 等待notify任务触发
service:
name: nginx
state: restarted - (文件)files/nginx.conf
shell
# nginx.conf内容:被copy语句自动复制
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
} - (启动入口)site.yml。最后执行
ansible-playbook site.yml命令启动批量操作
yaml
- hosts: webserver
roles:
- nginx-demo | 命令/参数 | 说明 |
|---|---|
ansible-playbook playbook.yml | 执行 Playbook |
ansible-playbook playbook.yml -i 自定义主机列表文件 | -i跟文件指定自定义或主机列表文件 |
ansible-playbook playbook.yml -C | -C检查模式(空跑,不实际变更) |
ansible-playbook playbook.yml -D | 对比文件差异(常与 -C 联用) |
ansible-playbook playbook.yml -l web01ansible-playbook playbook.yml --limit "web01,web02" | -l/--limit指定限制执行的主机范围 |
ansible-playbook playbook.yml --syntax-check && ansible-playbook playbook.yml -C -D | 语法检查 + 空跑预演 |