自动化运维工具Ansible,保姆级讲解

一、ansible的概述和运行机制

1、ansible概述

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

2、ansible基本架构

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

自动化运维工具Ansible,保姆级讲解_第1张图片

由上面的图可以看到 Ansible 的组成由一下几个部分组成:

Ansible: ansible的核心模块
Host Inventory:主机清单,也就是被管理的主机列表
Playbooks:ansible的剧本,可想象为将多个任务放置在一起,一块执行
Core Modules:ansible的核心模块
Custom Modules:自定义模块
Connection Plugins:连接插件,用于与被管控主机之间基于SSH建立连接关系
Plugins:其他插件,包括记录日志等

 3、ansible任务执行方式

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

  1. ad-hoc:即ansible命令,命令行界面,单条命令的批量执行
  2. playbook:Playbook方式(剧本方式)

 4、ansible的特点

  1. 部署简单,没有客户端,只需在主控端部署Ansible环境,被控端无需做任何操作;
  2. 模块化:调用特定的模块,完成特定任务
  3. 默认使用SSH协议对设备进行管理;
  4. 主从集中化管理;
  5. 配置简单、功能强大、扩展性强;
  6. 支持API及自定义模块,可通过Python轻松扩展;
  7. 通过Playbooks来定制强大的配置、状态管理
  8. 对云计算平台、大数据都有很好的支持;
  9. 具有幂等性:一个操作在一个主机上执行一遍和执行N遍的结果是一样的

 二、安装并配置Ansible管理两个节点

1、环境拓扑

主机 IP 角色 安装软件
cong11 192.168.121.11 ansible管理服务器 ansible
cong12 192.168.121.12 clent
cong13 192.168.121.13 clent

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

 2、设置EPEL源

Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库

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

3、安装absible

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

4、配置文件及说明

通过rpm -ql ansible可以看到有很多文件,主要是配置文件和和可执行文件,以及所依赖的python库文件。

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

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

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

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

[web_servers]
192.168.121.12
192.168.121.13

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

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

5、定义主机清单(inventory)

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

基于端口,用户,密码定义主机清单

ansible基于ssh连接指定的远程主机,可以写端口,用户,密码。

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

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

[web_servers]
192.168.121.12  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123

192.168.121.13  ansible_ssh_port=22  ansible_ssh_user=root  ansible_ssh_pass=123

     其中,中括号里的web_servers是组名,组名下方为该组包括的主机,每一行定义一个主机,组名需要唯一,而组中的一台主机则可以同时属于几个不同的组。
    ansible_ssh_port:指定ssh端口(如果是默认端口22,此参数可以省略) 
    ansible_ssh_user:指定 ssh 用户 
    ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)
    ansible_sudo_pass:指明 sudo 时候的密码

执行测试命令

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

 -i    #  指定 host 文件的路径,默认是在 /etc/ansible/hosts 
 -m    #   指定使用的ping模块
web_servers #在主机清单文件中定义的组名(组名建议不要包括特殊字符)

 报错:

自动化运维工具Ansible,保姆级讲解_第2张图片

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

解决方法:

方法1:
   修改/etc/ansible/ansible.cfg文件

自动化运维工具Ansible,保姆级讲解_第3张图片

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

自动化运维工具Ansible,保姆级讲解_第4张图片

 方法2:

手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。后期可以正常连接了

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

自动化运维工具Ansible,保姆级讲解_第5张图片

 6、基于ssh密钥来访问定义主机清单

配置ssh无密码访问

一般来说,在/etc/ansible/hosts中使用明文密码不安全,所以增加主机无密码访问(基于密钥对验证)。在Ansible服务端生成密钥,并且复制公钥到节点中。

[root@cong11 ~]# ssh-keygen

自动化运维工具Ansible,保姆级讲解_第6张图片

将公钥传到两个节点服务器里

[root@cong11 ~]# for ip in 12 13 ; do ssh-copy-id [email protected].$ip ; doneAnsible

修改主机清单

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

[web_servers]
nginx01 ansible_ssh_host=192.168.121.12 ansible_ssh_port=22 ansible_ssh_user=root
nginx02 ansible_ssh_host=192.168.121.13 ansible_ssh_port=22 ansible_ssh_user=root

ping模块检测网络连同性

自动化运维工具Ansible,保姆级讲解_第7张图片

 7、ansible命令参数

anisble命令语法: ansible [-i 主机文件] [-f 批次] [组名] [-m 模块名称] [-a 模块参数]

ansible详细参数:
-v   #详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i   #指定清单文件(hosts)的路径,默认是在 /etc/ansible/hosts 
-m  #指定使用的module名称,默认使用 command模块
-a   #指定module模块的参数
-u   #ssh连接的用户名,默认用root,ansible.cfg中可以配置
-k   #提示输入ssh登录密码,当使用密码验证的时候用
-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]   片断

 8、选项测试

测试-m和-a选项

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

     说明:-m:指定ansible要调用的模块;-a:指定具体命令。省略-m选项,默认使用command模块。

给Ansible被管理节点增加用户

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

给Ansible被管理节点中的user1用户添加密码

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

 

 

 测试 -m、-u、-k选项

修改/etc/ansible/hosts文件,内容如下

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

 [web_servers]
192.168.121.12
192.168.121.13

 -m指定ping模块,以user1用户执行ping存活检测。如果不指定用户,在远程机器上默认是以root用户执行。

[root@cong11 ~]# ansible 192.168.1.12 -m ping -u user1 -k

自动化运维工具Ansible,保姆级讲解_第8张图片

 测试-b

以user1用户sudo到root执行ping存活检测。这种方式需要在远程主机的/etc/sudoers文件中配置user1用户,如果没有配置NOPASSWD,则需要加上-K选项。

远程主机/etc/sudoers文件添加如下:

user1 ALL=(root)NOPASSWD: ALL

[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b

自动化运维工具Ansible,保姆级讲解_第9张图片

把上述的user1 ALL=(root)NOPASSWD: ALL换成user1 ALL=(root) ALL,再次执行

[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b

发现报错了,这个时候由于远程机器的user1用户不能免密到root用户,所以,执行方式改成如下,加-K(大写)选项

[root@cong11 ~]# ansible 192.168.121.12 -m ping -u user1 -k -b -K

自动化运维工具Ansible,保姆级讲解_第10张图片

 列出将执行该命令的主机

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

    总结: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

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