自动化运维工具Ansible

1.ansible概述和运行机制

1.1ansible概述

Ansible是Red Hat公司使用python研发的开源的自动化运维工具,类似于saltstack和Puppet这样老牌的自动化运维工具。

ansible作为一个后起之秀,在发布的短时间内迅速崛起,超越了大部分老牌的自动化运维工具,其中就包括了Saltstack和Puppet,能获得这样成绩的原因,有一个不同和优点是我们不需要在节点中安装任何客户端。它使用SSH来和节点进行通信。所以只需要被管理节点具备SSH服务以及python即可,无需任何多余操作就可实现自动化管理,而管理节点只需要安装Ansible工具,以及pythonopenssl即可。

总的来说:Ansible是一个部署一群远程主机的工具;Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要管理员通过ssh登录到一台远程主机上能做的操作,Ansible都可以做到。Ansible是python开发的,故依赖一些python库和组件,如:paramiko,PyYaml和jinja三个关键组件;

1.2官方网站

https://www.ansible.com/

自动化运维工具Ansible_第1张图片

1.3Ansible 的命名由来

此名取自 Ansible 作者最喜爱的《安德的游戏》小说,而这部小说更被后人改编成电影 -《战争游戏》

1.4ansible的基本架构

ansible系统由管理节点和被管理节点组成,Ansible 在管理节点将 Ansible 模块通过SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN、GIT 等来管理自定义模块及编

 自动化运维工具Ansible_第2张图片

 由上图可以看到ansible的组成是由5个部分组成的

剧本:playbooks

Ansible: ansible的核心程序

Modules:包括 Ansible 自带的核心模块及自定义模块。

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Inventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

Plugins:模块功能补充,通过插件来实现记录日志,发送邮件或其他功能。

Connectior Plugins:连接插件, ansible基于连接插件连接到各个主机上,默认是使用ssh。

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

Host Inventory: 记录由Ansible管理的主机信息,包括端口、密码、ip等。 [ˈɪnvəntri] 清单。

右边绿色部分是被管理的主机(虚拟机,物理机,云主机等),从以上架构图中可以看出ansible是由主机清单,playbook以及各模块插件组成。
简单的说就是,用户(管理员)通过ansible的主机清单配置或Playbook配置(一组任务),调用ansible的各种模块及参数来对清单中的主机进行统一管理。

1.5ansible任务执行方式

ansible执行自动化任务,分为两种执行方式:

1.ad-hoc:即ansible命令,命令行界面,单条命令的批量执行,称之为ad-hoc这种方式,主要用来进行功能测试,或者是简单的应用部署

2.playbook:Playbook方式(剧本方式),从字面意思就可以知道,我们的剧本方式是提前设置好内,进行剧本的演示。即把多个想要执行的任务放到一个playbook中,当然多个任务在事物逻辑上最好是有上下联系的。通过多个任务可以完成一个总体的目标,这就是playbook。Playbook方式适用于大型自动化部署应用

1.6ansible具有如下特点

部署简单, 只需要在管理主机上部署ansible环境,被管理端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置。

1、部署简单,只需在管理端部署Ansible环境,被管理端无需做任何操作,即不需要安装agent

2、默认使用SSH协议对设备进行管理

3、易读的语法,基于yaml语法编写playbook

4、模块化设计,调用特定的模块来完成特定任务

5、基于Python语言实现,由Paramiko(python的一个可并发连接ssh主机功能库), PyYAML和Jinja2(模板化)三个关键模块实现。支持API(供第三方程序调用的应用程序编程接口(API))及自定义模块,可通过Python轻松扩展

6、支持playbook剧本,连续任务按先后设置顺序完成。通过Playbooks来定制强大的配置、状态管理

7、幂等性,一个任务执行一遍和执行n遍效果一样,不会因为重复执行带来意外情况。意味着在同一台服务器上多次执行同一个playbook是安全的

8、对云计算平台、大数据都有很好的支持

2.安装并配置Ansible管理两个节点

2.1拓扑环境

自动化运维工具Ansible_第3张图片

注:运行ansible时,需要关闭SElinux,或者让SELinux放行Ansible的操作 

[root@cong11 ~]# setenforce 0 #临时关闭selinux

2.2配置ansible源

2.2.1配置阿里网络源

参考地址:http://mirrors.aliyun.com

[root@cong11 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

2.2.2配置epel源

Ansible软件默认不在centos的光盘yum仓库中,因此我们需要配置 epel仓库

[root@cong11 ~]# yum install -y epel-release

2.3安装ansible

对于安装Ansible来说,我们只需要在管理节点上安装即可,被管理节点除了保证有python和开启了sshd服务以外,不需要任何操作。

[root@cong11 ~]# yum install -y ansible

2.4配置文件及说明

2.4.1配置与执行文件说明

ansible 的主配置文件: /etc/ansible/ansible.cfg

这个文件主要定义了roles_path路径,主机清单路径,连接清单中的主机方式等配置,这些大部的默认配置已经足够我们平时使用,如需要特别配置可以自行去修改

主机清单文件:/etc/ansible/hosts

这个配置文件就是默认主机清单配置文件,可通过ansible.cfg重新定义的;
如定义一组主机:[web_servers] 其中不能包含特殊字符下划线可以,其他特殊字符都不可以使用。

除了以上两个重要的配置文件还有三个重要的可执行文件分别是

ansible 主执行程序,一般用于命令行下执行
ansible-playbook 执行playbook中的任务
ansible-doc 获取各模块的帮助信息

2.5定义主机清单

在前面了解了ansible的两种运行方式后,我们来看下使用命令行方式怎么测下主机的运行,如果想要进行测试,需要将被管理的主机添加到/etc/ansible/hosts里。

2.5.1配置主机清单

[root@cong11 ~]# vim /etc/ansible/hosts

文件 /etc/ansible/hosts 维护着Ansible中被管理服务器的清单。书写格式可以参考/etc/ansible/hosts文件的注释说明。在文件最后追加以下内容

[web_servers]
192.168.1.12  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456
192.168.1.13  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456

其中,中括号里的web_servers是组名,组名下方为该组包括的主机,每一行定义一个主机,组名需要唯一,而组中的一台主机则可以同时属于几个不同的组。

ansible_ssh_port:指定ssh端口(如果是默认端口22,此参数可以省略)

ansible_ssh_user:指定 ssh 用户

ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)

ansible_sudo_pass:指明 sudo 时候的密码

2.5.2执行测试命令

[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping

 -i    #  指定 host 文件的路径,默认是在 /etc/ansible/hosts

 -m    #   指定使用的ping模块

web_servers #在主机清单文件中定义的组名(组名建议不要包括特殊字符)

自动化运维工具Ansible_第4张图片

报错:

 192.168.1.13  ansible_ssh_port=22 | UNREACHABLE! => {
    "changed": false, 
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname 192.168.1.13\\302\\240\\302\\240ansible_ssh_port=22: Name or service not known", 
    "unreachable": true
}

错误原因:

 出现上述错误原因很简单,我们第一次ssh登录一台机器都需要在ansible服务器上保存目标主机的fingerprint指纹,也就是我们看到的这个页面

解决方法:

想要解决刚才的问题:

只需要简单的配置下Ansible服务即可,对于ansible来说我们是可以通过ansible.cfg进行配置调整,一般情况下,ansible配置文件存放在/etc/ansible/ansible.cfg

注:/etc/ansible/ansible.cfg:ansible的主配置文件

[root@cong11 ~]# vim /etc/ansible/ansible.cfg 

自动化运维工具Ansible_第5张图片

需要添加的就是我们图中红箭头指的配置,意思是将公钥认证检查关闭,这样我们就可以正常的访问被管理节点了 

自动化运维工具Ansible_第6张图片

我们可以为/etc/ansible/hosts中的主机起别名,类似于这样

[web_servers]

nginx01 ansible_ssh_host=192.168.1.12  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123456

自动化运维工具Ansible_第7张图片

 2.5.3基于ssh密钥来访问定义的主机清单

[root@cong11 ~]# ssh-keygen

自动化运维工具Ansible_第8张图片

[root@localhost ~]# for ip in 12 13 ; do ssh-copy-id [email protected].$ip ; done #把公钥复制到到12 13服务器

2.5.3.1配置主机清单

[root@cong11 ~]# vim /etc/ansible/hosts #修改以下内容

[web_servers]
nginx01 ansible_ssh_host=192.168.1.12 ansible_ssh_port=22 ansible_ssh_user=root
nginx02 ansible_ssh_host=192.168.1.13 ansible_ssh_port=22 ansible_ssh_user=root

2.5.3.2 执行命令测试

[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -m ping

自动化运维工具Ansible_第9张图片

 [root@cong11 ~]# ansible  web_servers -m ping

#不指定配置文件,默认使用/etc/ansible/hosts文件

自动化运维工具Ansible_第10张图片

 2.6ansible命令参数

[root@cong11 ~]# ansible --help #查看帮助

Usage:  ansible [options]    #使用方法,ansible+主机+选项

例如:ansible [组名] [-i 主机文件] [-m 模块名称] [-a 模块参数]

自动化运维工具Ansible_第11张图片

ansible详细参数:

 -v   #详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)

 -i   #指定清单文件(hosts)的路径,默认是在 /etc/ansible/hosts

 -m  #指定使用的module名称,默认使用 command模块

 -a   #指定module模块的参数

 -u   #ssh连接的用户名,默认用root,ansible.cfg中可以配置

 -k   #提示输入ssh登录密码,当使用密码验证的时候用

-s,--sudo:远程执行命令时使用sudo方式,相当于Linux系统下的sudo命令。

-U  SUDO_USERNAME,sudo到哪个用户,默认为root

注意:上述的-s和-U选项在新版中已经失效。新版本选项如下两项:

-s,--sudo 被改成 -b,--become

-U,--sudo-user被改成  --become-user

-K, --ask-become-pass:使用--become或者--become-user时使用的密码认证(即提示输入sudo密码,当不是NOPASSWD模式时使用)。

-C   #测试此命令执行会改变什么内容,不会真正的去执行

 -f FORKS, --forks=FORKS:并行线程数量,当有数量巨大的机器需要配置,可以使用高并发线程,默认是5个。

 --list-host:只打印有哪些主机会执行这个命令,不会实际执行

 ansible-doc详细参数:

       ansible-doc -l           #列出所有的模块列表

       ansible-doc -s 模块名    #查看指定模块的参数 -s, --snippet   # [ˈsnɪpɪt]   片断

 2.6.1测试-m -a 选项

检查ansibel被管理节点的cpu负载

[root@cong11 ~]# ansible web_servers -m command -a "uptime"

自动化运维工具Ansible_第12张图片

给ansible被管理节点增加用户

[root@cong11 ~]# ansible -m command -a "useradd user1" web_servers

自动化运维工具Ansible_第13张图片

[root@cong11 ~]# ansible -m command -a "grep user1 /etc/passwd" web_servers 

 [root@cong11 ~]# ansible web_servers -m shell -a "echo "user1:123456" | chpasswd"

2.6.2 测试 -b  -K -m --become-user

用user1创建admin用户

[root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -u user1 -k -b --become-user root -K -m command -a "useradd admin"

自动化运维工具Ansible_第14张图片

 [root@cong11 ~]# ansible -i /etc/ansible/hosts web_servers -u user1 -k -b --become-user root -K -m command -a "grep admin /etc/passwd"

自动化运维工具Ansible_第15张图片

2.6.2列出将执行该命令的主机

[root@cong11 ~]# ansible all -a "ls" --list-hosts

  hosts (2):

    nginx01

nginx02

总结:ansible指定要执行操作的被管理节点或组

1、指定执行机器

注意:ip需要在/etc/ansible/hosts提前里面配置

#指定192.168.1/24段的所有机器

ansible 192.168.1.* -m ping

#指定one、 two两台机器

ansible one.example.com:two.example.com -m ping

2、使用分组过滤

#指定A组

A

#指定A和B两个组

A:B

#指定在A组但不在B组

A:\!B   #\表示转义符

#指定同时在A组和B组

A:\&B

下一篇写模块

你可能感兴趣的:(运维,自动化)