Ansible工作原理

ansible的playbook touch一个文件 ansible document_json

一、Ansible主要组成部分功能

PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API:供第三方程序调用的应用程序编程接口
ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具
配置文件

配置文件或指令

描述

/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常用命令语法

ansible <host-pattern> [-m module_name] [options]
指令 匹配规则的主机清单 -m 模块名 选项

--version 显示版本
-a 模块参数(如果有)
-m module 指定模块,默认为command
-v 详细过程 –vv -vvv更详细
--list-hosts 显示主机列表,可简写--list
-k, --ask-pass 提示连接密码,默认Key验证
-K,--ask-become-pass 提示使用sudo密码
-C, --check 检查,并不执行
-T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
-u, --user=REMOTE_USER 执行远程执行的用户
-U, SUDO_USER, --sudo-user 指定sudu用户
-b, --become 代替旧版的sudo 切换

二、Ansible 的命令执行过程

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
    Using /etc/ansible/ansible.cfg as config file
    2.匹配主机清单
    Parsed /etc/ansible/hosts inventory source with ini plugin
  2. 加载指令对应的模块文件,如command,生成.py的文件到本机的临时目录,这个目录就是在/etc/ansible/ansible.cfg定义的
    Using module file /usr/lib/python2.7/site-packages/ansible/modules/commands/command.py
    PUT /tmp/tmp4JvsLH TO /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py
  3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件,
    这个目录就是在/etc/ansible/ansible.cfg定义的
    ( umask 77 && mkdir -p "echo /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861" ....)
    sftp> put /tmp/tmp4JvsLH /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py\n'
  4. 给文件+x 权限
    'chmod u+x /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/ /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py && sleep 0'
  5. 执行并返回结果
    '/usr/bin/python /root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/command.py;
  6. 删除临时py文件,sleep 0退出
    rm -rf "/root/.ansible/tmp/ansible-tmp-1517301292.6-155771303493861/" > /dev/null 2>&1 && sleep 0
    8.断开远程主机连接
    'Shared connection to 7-db-3.hunk.tech closed.\r\n')

三、实验规划

除了6-DNS-1以外,所有的主机的DNS均指向192.168.7.254。并在Ansible主控端上把ssh-key下发到其他所有被控端

主机名

系统版本

IP地址

功能

7-web-0

Centos 7.4

192.168.7.200

Ansible主控端

6-dns-1

Centos 6.9

192.168.7.254

DNS服务器

6-web-1

Centos 6.9

192.168.7.201

服务器

7-web-2

Centos 7.4

192.168.7.202

服务器

7-db-3

Centos 7.4

192.168.7.203

服务器

Ansible必须通过Inventory 来管理主机。Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置

1、/etc/ansible/hosts文件内容

[web]
6-web-1.hunk.tech
7-web-0.hunk.tech
7-web-2.hunk.tech

[group:children]
dns
db

[dns]
6-dns-1.hunk.tech

[db]
7-db-3.hunk.tech

192.168.7.[200:203]
192.168.7.254

测试结果

ansible all -m ping

6-web-1.hunk.tech | SUCCESS
7-web-0.hunk.tech | SUCCESS
7-web-2.hunk.tech | SUCCESS
7-db-3.hunk.tech | SUCCESS 
6-dns-1.hunk.tech | SUCCESS 
192.168.7.201 | SUCCESS 
192.168.7.200 | SUCCESS