1、简介

1.1 ansible 是什么?

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

1.2 ansible 特点

  1. 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  2. 默认使用SSH协议对设备进行管理;
  3. 有大量常规运维操作模块,可实现日常绝大部分操作;
  4. 配置简单、功能强大、扩展性强;
  5. 支持API及自定义模块,可通过Python轻松扩展;
  6. 通过Playbooks来定制强大的配置、状态管理;
  7. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  8. 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

    1.3 架构图

    1、基础入门 - 图1
    1、基础入门 - 图2
    Ansible:Ansible核心程序。
    HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
    Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
    CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
    CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
    ConnectionPlugins:连接插件,Ansible和Host通信使用

ansible要实现管理主机,需要满足以下两点:

  • 主机清单中需要配置被管理主机的主机名或者ip;
  • 要能够连上被管理主机(授权);

    2、任务执行

    2.1 执行模式

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即ad-hocplaybook

  • ad-hoc模式(点对点模式)
      使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
  • playbook模式(剧本模式)
      是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

    2.2 执行流程

    1、基础入门 - 图3

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

2.3 执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时py文件,sleep 0退出;

    3、部署安装

    3.1 安装方式

    ansible安装常用两种方式,yum安装pip程序安装

    3.1.1 pip安装

    1. yum install python-pip
    2. 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 ```

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