热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ansible安装及部分模块初步使用

Ansible安装及初步使用Ansible概述由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统的方式进行维护工作会使得工作效率低下
Ansible安装及初步使用

Ansible概述

由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统的方式进行维护工作会使得工作效率低下。这时,部署自动化运维就可以尽可能安全、高效地完成这些工作。

一般会把自动化运维工具划分为两类:一类是使用代理工具,与就是基于专用的Agent程序完成管理功能,如:Puppet、Func、Zabbix等;另外一类是不需要配置代理工具的,可以基于SSH服务来完成管理功能,如:Ansible、Fabric等。

Ansible基于Python开发,集合了众多的优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可以同时支持多台主机并行管理,使得管理主机更加便捷。

部署环境

角色 主机名 IP地址 组名
控制主机 rabbitmq01 192.168.58.142
被管理主机 rabbitmq02 192.168.58.132 webserver
被管理主机 rabbitmq03 192.168.58.143 dbserver

部署实施

安装Ansible

可以使用源码安装也可以使用rpm包安装,这里直接使用yum仓库安装,需要依赖第三方的EPEL源。

[root@rabbitmq01 ~]# yum install -y epel-release
#安装epel源
[root@rabbitmq01 ~]# yum install ansible -y
#安装ansible软件包
[root@rabbitmq01 ~]# ansible --version
ansible 2.6.2
  config file = /etc/ansible/ansible.cfg
#安装好后,可以查看版本信息

配置主机清单

Ansible通过默认主机清单/etc/ansible/hosts文件,修改主机与组配置后,可以连接到多个被管理主机上执行任务。

[root@rabbitmq01 ~]# vim /etc/ansible/hosts 
# This is the default ansible ‘hosts‘ file.
#
# It should live in /etc/ansible/hosts
#
#   - Comments begin with the ‘#‘ character
#   - Blank lines are ignored
#   - Groups of hosts are delimited by [header] elements
#   - You can enter hostnames or ip addresses
#   - A hostname/ip can be a member of multiple groups
[webserver]         #设计主机清单
192.168.58.132
[dbserver]
192.168.58.143

设置SSH密码登录

使用ssh-keygen产生一对密钥(公钥和私钥),使用ssh-copy-id来下发生成的公钥。

[root@rabbitmq01 ~]# ssh-keygen -t rsa  #产生密钥
[root@rabbitmq01 ~]# cd /root/.ssh/
[root@rabbitmq01 .ssh]# ls
id_rsa  id_rsa.pub               #这就是产生的密钥

技术分享图片
下面将id_rsa.pub公钥分发给被管理主机。

[root@rabbitmq01 .ssh]# ssh-copy-id root@192.168.58.132
#分发给被管理主机
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host ‘192.168.58.132 (192.168.58.132)‘ can‘t be established.
ECDSA key fingerprint is SHA256:H7QKvUWPKe+VutgnWibgRHM/knIJq5CCZ7MEvSgiHXA.
ECDSA key fingerprint is MD5:8b:26:28:97:7a:d1:84:62:6f:f6:8d:2e:06:09:5e:5f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.58.132‘s password:                  #这里输入的是被管理主机的root密码,不是生成的密钥

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘root@192.168.58.132‘"
and check to make sure that only the key(s) you wanted were added.
[root@rabbitmq01 .ssh]# ssh-copy-id root@192.168.58.143
#分发给另外一台被管理主机

完成上述操作后,就可以进行ansible操作

[root@rabbitmq01 .ssh]# ansible webserver -a ‘ifconfig‘
Enter passphrase for key ‘/root/.ssh/id_rsa‘: 
ens33: flags=4163  mtu 1500
        inet 192.168.58.132  netmask 255.255.255.0  broadcast 192.168.58.255
        inet6 fe80::f017:cc4f:7b2b:3652  prefixlen 64  scopeid 0x20
        ether 00:0c:29:e7:34:3b  txqueuelen 1000  (Ethernet)
        RX packets 18857  bytes 20093953 (19.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7340  bytes 584633 (570.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        RX packets 790  bytes 52247 (51.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 790  bytes 52247 (51.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

设置SSH免交户代理

但是每次操作都会被要求输入ssh密码,这里设置免交户代理。

[root@rabbitmq01 .ssh]# ssh-agent bash
[root@rabbitmq01 .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:        #输入ssh密码
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

这个时候我们再进行操作的时候,就不会再要求输入密码了。

[root@rabbitmq01 .ssh]# ansible webserver -a ‘ifconfig‘
192.168.58.132 | SUCCESS | rc=0 >>
ens33: flags=4163  mtu 1500
        inet 192.168.58.132  netmask 255.255.255.0  broadcast 192.168.58.255
        inet6 fe80::f017:cc4f:7b2b:3652  prefixlen 64  scopeid 0x20
        ether 00:0c:29:e7:34:3b  txqueuelen 1000  (Ethernet)
        RX packets 19025  bytes 20210670 (19.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7451  bytes 599404 (585.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        RX packets 790  bytes 52247 (51.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 790  bytes 52247 (51.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ansible命令应用

Ansible可以使用命令行方式进行自动化管理,管理工具是由一系列模块、参数支持的,可以在命令后面加上-h或者--help获取帮助,如使用ansible-doc工具可以通过ansible-doc -h或者ansible --help获取帮助信息。

ansible-doc是也用来查看模块帮助信息的工具,最主要的选项-l用来列出可使用的模块,-s用来列出某个模块的描述信息和使用示例。
技术分享图片

command模块

Ansible管理工具使用-m选项指定使用模块,默认使用command模块,-m选项省略也会运行此模块,用于在被管理主机上运行命令。

[root@rabbitmq01 ~]# ansible webserver -m command -a ‘date‘  
#使用ansible查看被管理主机日期信息
192.168.58.132 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 14:47:26 CST

[root@rabbitmq01 ~]# ansible dbserver -a ‘date‘   #不使用-m时,默认就是command模块。
192.168.58.143 | SUCCESS | rc=0 >>
2018年 08月 01日 星期三 14:47:47 CST

cron模块

Ansible中cron模块用于定义计划性任务。其中有两种状态(state):present表示添加,absent表示移除。下面演示添加计划性任务:

[root@rabbitmq01 ~]# ansible webserver -m cron -a ‘minute="*/10" job="/usr/bin/echo hello" name="test"‘
#这句话表示添加一个名称为test的计划性任务,完成每十分钟输出hello字符串的任务
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": [
        "test"
    ]
}

我们到webserver这台被管理主机上查看是否生成了这个计划性任务。

[root@rabbitmq02 ~]# crontab -l  #查看计划性任务,可以看到已经生成
#Ansible: test
*/10 * * * * /usr/bin/echo hello

移除计划性任务

[root@rabbitmq01 ~]# ansible webserver -m cron -a ‘name="test" state=absent‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "envs": [], 
    "jobs": []
}

[root@rabbitmq02 ~]# crontab -l
[root@rabbitmq02 ~]# 
#可以看到计划性任务已经被移除了

user模块

Ansible中的user模块用于创建新用户和更改、删除已经存在的用户。其中name选项用来指明创建的用户名称。

[root@rabbitmq01 ~]# ansible webserver -m user -a ‘name="user1"‘
#创建一个user1的用户
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 1000, 
    "home": "/home/user1", 
    "name": "user1", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": false, 
    "uid": 1000
}

[root@rabbitmq02 ~]# id user1
uid=1000(user1) gid=1000(user1) 组=1000(user1)
#到webserver查看user1用户

移除用户

[root@rabbitmq01 ~]# ansible webserver -m user -a ‘name="user1" state=absent‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "force": false, 
    "name": "user1", 
    "remove": false, 
    "state": "absent"
}

[root@rabbitmq02 ~]# id user1
id: user1: no such user

group模块

Ansible中的group模块用于对用户组进行管理。

[root@rabbitmq01 ~]# ansible webserver -m group -a ‘name=yx gid=400 system=yes‘
#添加一个叫yx的系统组。指定gid=400
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "gid": 400, 
    "name": "yx", 
    "state": "present", 
    "system": true
}

[root@rabbitmq02 ~]# tail -2 /etc/group
rabbitmq:x:986:
yx:x:400:
#可以看到创建成功

[root@rabbitmq01 ~]# ansible webserver -m user -a ‘name="user2" uid=300 group=yx system=yes‘
#创建一个叫test02的系统用户,指定uid=300,所属组是yx
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "comment": "", 
    "create_home": true, 
    "group": 400, 
    "home": "/home/user2", 
    "name": "user2", 
    "shell": "/bin/bash", 
    "state": "present", 
    "system": true, 
    "uid": 300
}

[root@rabbitmq02 ~]# id user2
uid=300(user2) gid=400(yx) 组=400(yx)

移除组和移除用户方法一样

copy模块

Ansible中的copy模块用于实现文件复制和批量下发文件。其中使用src来定义本地文件路径,使用dest定义被管理主机文件路径。使用content则是通过指定信息内容来生成目标文件。

[root@rabbitmq01 ~]# ansible webserver -m copy -a ‘src=/etc/fstab dest=/opt/fstab.bk owner=root mode=600‘
#将本地/etc/fstab文件复制到被管理主机webserver中的/opt/fstab.bk,属主为root,权限为600
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "checksum": "317728dfdd657138fa15180e7c4318414c3d5774", 
    "dest": "/opt/fstab.bk", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "b8d938e54772dcb1d95b3d5054d1f0a9", 
    "mode": "0600", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 595, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533107605.28-118537359554274/source", 
    "state": "file", 
    "uid": 0
}

[root@rabbitmq02 ~]# cd /opt/
[root@rabbitmq02 opt]# ll
总用量 4
-rw-------. 1 root root 595 8月   1 15:13 fstab.bk
drwxr-xr-x. 2 root root   6 3月  26 2015 rh
#可以看到已经生成了/opt/fstab.bk文件
[root@rabbitmq01 ~]# ansible webserver -m copy -a ‘cOntent="this is test" dest=/opt/test.txt‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "checksum": "b6794b2000d94d348203d0279c2e7322b922cb16", 
    "dest": "/opt/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "8c6d115258631625b625486f81b09532", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1533107768.16-134608628410659/source", 
    "state": "file", 
    "uid": 0
}

[root@rabbitmq02 opt]# cat test.txt 
this is test 
#生成了test.txt这个文件

file模块

在Ansible中使用file模块用于设置文件属性,其中path指定文件路径,使用src定义源文件路径,使用name或者dest替换创建文件的符号链接。

[root@rabbitmq01 ~]# ansible webserver -m file -a ‘owner=mysql group=root mode=644 path=/opt/fstab.bk‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "mysql", 
    "path": "/opt/fstab.bk", 
    "secontext": "system_u:object_r:usr_t:s0", 
    "size": 595, 
    "state": "file", 
    "uid": 27
}

this is test[root@rabbitmq02 opt]# ll
总用量 8
-rw-r--r--. 1 mysql root 595 8月   1 15:13 fstab.bk
drwxr-xr-x. 2 root  root   6 3月  26 2015 rh
#可以看到/opt/test.txt文件属性已经修改成功
[root@rabbitmq01 ~]# ansible webserver -m file -a ‘path=/opt/test.link src=/etc/passwd state=link‘ 
#将在被管理主机上,设置/opt/test.link为/etc/passwd文件的链接文件
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "dest": "/opt/test.link", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 11, 
    "src": "/etc/passwd", 
    "state": "link", 
    "uid": 0
}

[root@rabbitmq02 opt]# ll
总用量 8
-rw-r--r--. 1 mysql root 595 8月   1 15:13 fstab.bk
drwxr-xr-x. 2 root  root   6 3月  26 2015 rh
lrwxrwxrwx. 1 root  root  11 8月   1 15:21 test.link -> /etc/passwd
#生成成功

ping模块

在Ansible中使用ping模块检测指定主机的连通性。

[root@rabbitmq01 ~]# ansible dbserver -m ping
192.168.58.143 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
#连接正常

yum模块

在Ansible中的yum模块负责在被管理主机上安装卸载软件包,但是要每个节点部署yum仓库。name指定安装的软件包,不带版本号默认安装最新版本,state指定软件包状态,present、latest用于安装,absent表示卸载。

[root@rabbitmq02 opt]# rpm -q httpd
未安装软件包 httpd 
#在webserver上,未安装httpd

[root@rabbitmq01 ~]# ansible webserver -m yum -a ‘name=httpd‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    .....
[root@rabbitmq02 ~]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
#安装成功

service模块

在Ansible中使用service模块来控制管理服务器的运行状态。其中使用enabled表示是否开机启动,取值true或者false;只用name定义服务名称;使用state指定服务状态,取值为started、stoped、restarted。

[root@rabbitmq02 ~]# netstat -ntap | grep 80

[root@rabbitmq01 ~]# ansible webserver -m service -a ‘name=httpd enabled=true state=started‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "enabled": true, 
    "name": "httpd", 
    "state": "started", 

[root@rabbitmq02 ~]# netstat -ntap | grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      7110/httpd 

shell模块

Ansible中的shell模块可以在管理主机上运行命令,并支持像管道符号等功能的复杂命令。

[root@rabbitmq01 ~]# ansible webserver -m shell -a ‘echo "abc123"|passwd --stdin user2‘
#这就是使用无交互模式给用户设置密码
192.168.58.132 | SUCCESS | rc=0 >>
更改用户 user2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

script模块

Ansible中的script模块可以将本地的脚本复制到管理主机上运行。

#在本地创建一个脚本
[root@rabbitmq01 ~]# vim test.sh
[root@rabbitmq01 ~]# chmod +x test.sh 
[root@rabbitmq01 ~]# cat test.sh 
#!/bin/bash
echo "this is a test" > /opt/script.txt
[root@rabbitmq01 ~]# ansible webserver -m script -a ‘/root/test.sh‘
192.168.58.132 | SUCCESS => {
    "changed": true, 
    "rc": 0, 
    "stderr": "Shared connection to 192.168.58.132 closed.\r\n", 
    "stderr_lines": [
        "Shared connection to 192.168.58.132 closed."
    ], 
    "stdout": "", 
    "stdout_lines": []
}

[root@rabbitmq02 opt]# ls
fstab.bk  rh  script.txt  test.link  test.txt
[root@rabbitmq02 opt]# cat script.txt 
this is a test
#脚本执行成功

setup模块

在Ansible中使用setup模块收集、查看被管理主机的facts(facts是Ansible采集被管理主机设备信息的一个功能)。每个被管理主机在接受并运行管理命令之前,都会将自己的相关信息发送给控制主机。

[root@rabbitmq01 ~]# ansible webserver -m setup
192.168.58.132 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.58.132"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::f017:cc4f:7b2b:3652"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
....省略,信息很多

Ansible安装及部分模块初步使用


推荐阅读
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 项目风险管理策略与实践
    本文探讨了项目风险管理的关键环节,包括风险管理规划、风险识别、风险分析(定性和定量)、风险应对策略规划及风险控制。旨在通过系统的方法提升项目成功率,减少不确定因素对项目的影响。 ... [详细]
  • 探索AI智能机器人自动盈利系统的构建
    用户可通过支付198元押金及30元设备维护费租赁AI智能机器人,推荐他人加入可获得相应佣金。随着推荐人数的增加,用户将逐步解锁更高版本,享受更多收益。 ... [详细]
  • 本文通过一个具体的实例,介绍如何利用TensorFlow框架来计算神经网络模型在多分类任务中的Top-K准确率。代码中包含了随机种子设置、模拟预测结果生成、真实标签生成以及准确率计算等步骤。 ... [详细]
  • 嵌套列表的扁平化处理
    本文介绍了一种方法,用于遍历嵌套列表中的每个元素。如果元素是整数,则将其添加到结果数组中;如果元素是一个列表,则递归地遍历这个列表。此方法特别适用于处理复杂数据结构中的嵌套列表。 ... [详细]
author-avatar
Q小泓别_431
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有