介绍

ansible官方文档里写道

Ansible is a radically simple IT automation engine

即:Ansible是一款极其简单的IT自动化工具

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

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:

(1)、连接插件connection plugins:负责和被监控端实现通信;

(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

 

基本框架图  

 

自动化运维工具Ansible连续剧之--介绍安装与连接_系统/运维

 

组件介绍

Ansible:Ansible核心程序。

connection plugins :连接插件,负责和被监控端实现通信。

HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。

Playbooks:”剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。

CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。

CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。

 

ansible特点

  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作,默认使用SSH协议对设备进行管理;

  • 有大量常规运维操作模块,可实现日常绝大部分操作。

  • 配置简单、功能强大、扩展性强;

  • 支持API及自定义模块,可通过Python轻松扩展;

  • 通过Playbooks来定制强大的配置、状态管理;

  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;

  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

  • 幂等性   幂等性不会重复执行相同的指令。例如不会重复安装软件。

 

工作原理图

自动化运维工具Ansible连续剧之--介绍安装与连接_系统/运维_02


测试环境

名称IP系统
ansible192.168.10.10CenOS7
PC1192.168.10.11CenOS7
PC2192.168.10.12CenOS7

 

安装

安装ansible非常简单,直接YUM安装就可以。

# yum install epel-release -y
# yum install ansible -y
# ansible --version  #查看版本
    ansible 2.7.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]


配置

ansible.cfg为ansible的主配置文件,他主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等。

hosts是我们定义主机清单的配置文件。

# cd /etc/ansible/
# ls
ansible.cfg  hosts  roles

主配置文件的一些解释

[defaults]
# some basic default values...
#inventory      = /etc/ansible/hosts       //定义资源清单文件的位置
#library        = /usr/share/my_modules/     //library指向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     //设置默认执行命令的用户
#ask_sudo_pass = True    //执行ansible命令是否询问ssh密码,每次都询问
#ask_pass      = True        //和上面一起的
#transport      = smart
#remote_port    = 22        //连接被管理的端口,默认22
#module_lang    = C
#module_set_locale = False    //第一次使用ansible连接客户端的提示开关
# SSH timeout#timeout = 10      //SSH连接超时的间隔,单位是秒

hosts定义方式

定义一个[组名]把地址或主机名加进去

我自己定义的两台主机,我把它分为了两个组。

[web]192.168.10.11
[sql]192.168.10.12

组成员可以使用通配符来匹配,如下 192.168.10.[1:5] #表示匹配从192.168.10.1——192.168.10.5的主机。

 

Ansible命令集

/usr/bin/ansible   # Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行

/usr/bin/ansible-doc  # Ansible 模块功能查看工具

/usr/bin/ansible-galaxy # 下载/上传优秀代码或Roles模块的官网平台,基于网络的

/usr/bin/ansible-playbook # Ansible 定制自动化的任务集编排工具

/usr/bin/ansible-pull # Ansible远程执行命令的工具(使用较少,海量机器时使用,对运维的架构能力要求较高)

/usr/bin/ansible-vault # Ansible 文件加密工具

/usr/bin/ansible-console  # Ansible基于Linux Consoble界面可与用户交互的命令执行工具

 

SSH与公私钥

在主机执行以下命令,将公钥发送到两台被连接主机。

#ssh-keygen -t rsa                             #创建公钥与私钥
#ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.11            #将公钥传输给对端服务器

此时服务器可以免密码登录

 

测试

这里用一个PING模块来验证一下是否连接成功,下一篇博客我们再研究另外的常用模块。

命令格式:

ansible<host-pattern> [options]

 

命令参数

-a MODULE_ARGS, --args=MODULE_ARGS

            module arguments  # 指定Ansible调用的模块

--ask-become-pass   ask forprivilege escalation password # Ansible su切换用户的时候使用该参数输入密码

  -k,--ask-pass        ask for SSHpassword  # 以密码认证

--ask-su-pass         ask for supassword (deprecated, use become) # su的时候使用该参数

  -K,--ask-sudo-pass   ask for sudo password(deprecated, use become) # sudo的时候

--ask-vault-pass      ask forvault password # ansible-valut 加密文件

  -BSECONDS, --background=SECONDS  # 后台等待秒数

--become-user=BECOME_USER

                        run operations as thisuser (default=None)  # su到哪个用户

  -C,--check           don't make any changes;instead, try to predict some

                        of the changes that mayoccur  # 不执行命令只做命令执行检查

  -c CONNECTION, --connection=CONNECTION

                        connection type to use(default=smart)

  -eEXTRA_VARS, --extra-vars=EXTRA_VARS  # 调用外部变量

                        set additionalvariables as key=value or YAML/JSON

  -fFORKS, --forks=FORKS  # Ansible一次命令执行并发的线程数

  -h,--help            show this help messageand exit

  -iINVENTORY, --inventory-file=INVENTORY  #Ansible调用的Hosts文件,默认/etc/ansible/hosts

                        specify inventory hostfile

                       (default=/etc/ansible/hosts)

  -lSUBSET, --limit=SUBSET  # 限定主机列表中的某台机器执行

                        further limit selectedhosts to an additional pattern

--list-hosts          outputs alist of matching hosts; does not execute

                        anything else  ## 列出主机列表中的主机

  -mMODULE_NAME, --module-name=MODULE_NAME  #Ansible 调用的执行模块

  -M MODULE_PATH, --module-path=MODULE_PATH  #调用的模块路径

  -S,--su              run operations with su(deprecated, use become) #使用su和become结合使用

  -RSU_USER, --su-user=SU_USER  # su的话切换至哪个用户

  -s,--sudo            run operations withsudo (nopasswd) (deprecated, use

                        become)  # 执行sudo命令

  -USUDO_USER, --sudo-user=SUDO_USER  # sudo

  -TTIMEOUT, --timeout=TIMEOUT  # 执行命令的超时时间

--vault-password-file=VAULT_PASSWORD_FILE  ## ansible-vault加密的密码文件

  -v,--verbose         verbose mode (-vvv formore, -vvvv to enable

                        connectiondebugging)  # 显示详细信息 -vvvv

--version             showprogram's version number and exit ## 显示版本号

 

ping模块测试:

# ansible all  -m ping
192.168.10.11 | SUCCESS => {"changed": false, "ping": "pong"}
192.168.10.12 | SUCCESS => {"changed": false, "ping": "pong"}

 

看到两台主机都返回了成功ping通,至此我们就可以愉快的使用ansible对区域内的服务器开始管理工作啦!