Skip to content

Ansible

什么是Ansible

  • Ansible是一个基于Python的自动化工具软件
  • 安装后添加配置被管理的服务器,可以远程批量控制多台服务器进行同样操作。
  • 控制操作完全基于SSH协议,不需要在被管理的服务器上安装任何客户端软件
  • 三大核心组件:playbook(剧本)、inventory(主机清单)、module(模块)

Ansible基本用法

  1. 主机安装ansible工具
shell
yum install ansible -y
  1. 配置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

案例

批量配置nginx

  • 配置/etc/ansible/hosts文件,添加待操作的主机列表
  • 执行 ansible-galaxy init roles/nginx-demo 生成初始化目录结构
  1. (主任务)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
  1. (触发器)handlers/main.yml
yaml
- name: restart nginx  # 等待notify任务触发
  service:
    name: nginx
    state: restarted
  1. (文件)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;
        }
    }
}
  1. (启动入口)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 web01
ansible-playbook playbook.yml --limit "web01,web02"
-l/--limit指定限制执行的主机范围
ansible-playbook playbook.yml --syntax-check && ansible-playbook playbook.yml -C -D 语法检查 + 空跑预演
全速前进中...