1、简介
1.1 ansible 是什么?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
1.2 ansible 特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
1.3 架构图
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
ansible要实现管理主机,需要满足以下两点:
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即ad-hoc
和playbook
:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。2.2 执行流程
简单理解就是Ansible在运行时, 首先读取ansible.cfg
中的配置, 根据规则获取Inventory
中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
2.3 执行过程
- 加载自己的配置文件,默认
/etc/ansible/ansible.cfg
; - 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的
.ansible/tmp/XXX/XXX.PY
文件; - 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,
sleep 0
退出;3、部署安装
3.1 安装方式
ansible安装常用两种方式,yum安装
和pip程序安装
。3.1.1 pip安装
yum install python-pip
pip install ansible
3.1.2 yum 安装
# 配置仓库: yum install epel-release -y # 安装ansible: yum install ansible -y
3.1.3 安装目录
如下(yum安装):
配置文件或指令 | 描述 |
---|---|
/etc/ansible/ansible.cfg | 主配置文件,配置ansible工作特性 |
/etc/ansible/hosts | 主机清单 |
/etc/ansible/roles/ | 存放角色的目录 |
/usr/bin/ansible | 主程序,临时命令执行工具 |
/usr/bin/ansible-doc | 查看配置文档,模块功能查看工具 |
/usr/bin/ansible-galaxy | 下载/上传优秀代码或Roles模块的官网平台 |
/usr/bin/ansible-playbook | 定制自动化任务,编排剧本工具 |
/usr/bin/ansible-pull | 远程执行命令的工具 |
/usr/bin/ansible-vault | 文件加密工具 |
/usr/bin/ansible-console | 基于Console界面与用户交互的执行工具 |
通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器 ,
对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
3.2 配置文件
3.2.1 ansible.cfg
# 配置文件解读:
/etc/ansible/ansible.cfg # 这是ansible默认配置文件
[defaults]
# 主机清单文件
inventory = /etc/ansible/hosts
# 库文件存放目录
library = /usr/share/my_modules/ # 指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
module_utils = /usr/share/my_module_utils/
# 脚本在远程服务器执行的临时目录
remote_tmp = ~/.ansible/tmp
# 脚本在本机执行的临时目录
local_tmp = ~/.ansible/tmp
# 插件过滤配置文件
plugin_filters_cfg = /etc/ansible/plugin_filters.yml
# 默认并发数
forks = 5
# 定义多少时间回查一下任务的状态
poll_interval = 15
# 默认用户
sudo_user = root
# sudo用户是否需要输入密码
ask_sudo_pass = True
# 每次执行都需要询问ssh密码
ask_pass = True
# 自动选择传输方式,新版本默认使用openssh,老版本用patamiko
transport = smart
# 远程服务器默认通信端口
remote_port = 22
# 不检远程服务器的host_key
host_key_checking = False
# 开启ansible的日志功能
log_path = /var/log/ansible.log
# 修改ansible默认模块为shell
module_name = shell
# 设置SSH连接的超时时间,单位为秒
timeout = 10
3.2.2 hosts
# ansible 默认主机清单
/etc/ansible/hosts
# 方式一:直接指明主机地址或主机名
192.168.0.10 ansible_ssh_pass=1
192.168.0.11 ansible_ssh_pass=1
192.168.0.11 ansible_ssh_pass=1
# 方式二:定义一个主机组[组名]
[nginx]
192.168.75.1[0:2] ansible_ssh_pass=1
# 验证是否可以连接:
[root@hchost ~]# ansible nginx -m ping
4、常用命令
4.1 ansible指令
ansible HOST_PATTERN OPTION
OPTIONS:
-m,--module-name:模块名称
-a,--args:向模块传递参数
-f,--forks:在几个主机上并行(default=5)
-C,--check:don't make any changes;
--list-host:列出匹配主机
connection Options:
-u,--user:以指定身份登录远程主机
-c,--connection:连接方式(default=smart)
example:
ansible HOST_PATTERN -m MODULE_NAME -a MODULE_ARGS -f FORKS -C
ansible
[-f forks] [-m module_name] [-a args]
也可以通过ansible -h
来查看帮助,下面我们列出一些比较常用的选项,并解释其含义:
-a MODULE_ARGS
#模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等-k
,--ask-pass
#ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证--ask-su-pass
#ask for su password。su切换密码-K
,--ask-sudo-pass
#ask for sudo password。提示密码使用sudo,sudo表示提权操作--ask-vault-pass
#ask for vault password。假设我们设定了加密的密码,则用该选项进行访问-B SECONDS
#后台运行超时时间-C
#模拟运行环境并进行预运行,可以进行查错测试-c CONNECTION
#连接类型使用-f FORKS
#并行任务数,默认为5-i INVENTORY
#指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts
#查看有哪些主机组-m MODULE_NAME
#执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数-o
#压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用-S
#用 su 命令-R SU_USER
#指定 su 的用户,默认为 root 用户-s
#用 sudo 命令-U SUDO_USER
#指定 sudo 到哪个用户,默认为 root 用户-T TIMEOUT
#指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改-u REMOTE_USER
#远程用户,默认为 root 用户-v
#查看详细信息,同时支持-vvv
,-vvvv
可查看更详细信息
4.2 ansible-doc指令
ansible-doc OPTION MODULE
OPTIONS:
-s: # 查看模块的简单说明
-l,--list: # 列出所有模块
-a,--all: # 查看所有文档
-M MODULE_PATH, --module-path=MODULE_PATH # 指定模块的路径
example:
ansible-doc -s ping # 查看ping模块的说明
ansible-doc -l |grep mysql # 查看mysql所以模块的说明
Usage: ansible-doc [options] [module...]
5、配置公钥
# 1.生成私钥
[root@hchost ~]# ssh-keygen
# 2.向主机分发私钥
[root@hchost ~]# ssh-copy-id root@192.168.0.10
[root@hchost ~]# ssh-copy-id root@192.168.0.11
# 服务端:在/root/.ssh目录下生成公钥和私钥对
[root@hchost .ssh]# ssh-keygen -t rsa
# 把本地的公钥文件安装到远程主机
[root@hchost .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub -p 416 root@hw10
注意:
如果出现报错:ssh-copy-id: command not found
需要安装包:yum -y install openssh-clientsansible
- 推送公钥的playbook ```yaml
- hosts: all
user: root
tasks:
- name: ssh-copy-id
authorized_key: user=root key=”{{ lookup(‘file’, ‘/root/.ssh/id_rsa.pub’) }}”
tags:
- sshkey ```
- name: ssh-copy-id
authorized_key: user=root key=”{{ lookup(‘file’, ‘/root/.ssh/id_rsa.pub’) }}”
tags:
https://www.yuque.com/xyzh/linux/yuxcul
https://www.yuque.com/u12479099/mxh2aa/ab8v0a
https://www.yuque.com/weiker/jiagoushi/izp2oq
https://www.yuque.com/xnops/linux/2303932bdd44ae9dc9f6aa6b971e7bfc#Mm5BD