使用自动化运维工具Ansible集中化管理服务器

ansible概述

  • Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具。
  • 它用Python成,类似于saltstackPuppet,但是有一个不同和优点是我们不需要在节点中安装任何客户端。
  • 它使用SSH来和节点进行通信。
  • Ansible基于 Python paramiko 开发,分布式,无需客户端,轻量级,配置语法使用 YMAL 及 Jinja2模板语言,更强的远程命令执行操作

官方网站:

https://www.ansible.com/

技术背景

  • 2015年10月,红帽(Red Hat)宣布收购软件开发公司 Ansible,消息称此次收购耗资逾 1亿美元,也有消息称接近 1.5亿美元。
  • Ansible 成立于 2013年,总部设在北卡罗来纳州达勒姆,联合创始人 aïd Ziouani高级副总裁 Todd Barr 都是红帽的老员工。
  • Ansible 旗下的开源软件 Ansible 十分流行。这家公司还提供 Tower 软件和咨询服务,这个款软件能使开发者轻松地建立和管理规模化应用程序的 IT 基础架构

ansible 可以做什么

  • 系统初始化

  • 中间件部署

  • 应用发布

  • 日常维护

ansiblle特点

1.部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
2. 默认使用SSH协议对设备进行管理
3. 主从集中化管理
4. 配置简单、功能强大、扩展性强;
5. 支持API及自定义模块,可通过Python轻松扩展;
6. 通过Playbooks来定制强大的配置、状态管理
7. 对云计算平台、大数据都有很好的支持;

Ansible 工作机制

Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。
在这里插入图片描述

在这里插入图片描述

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

安装ansible服务

  1. 设置EPEL仓库
    Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。
    [root@ansible ~]# yum install epel-release -y

  2. 使用yum安装Ansible
    [root@ansible ~]# yum -y install ansible -y

  3. 查看ansible 版本
    [root@ansible ~]# ansible --version

  • 实验拓扑
    在这里插入图片描述
  • ansible 服务端 192.168.43.121
  • ansible节点1 192.168.43.167
  • ansible节点2 192.168.43.168

ansible命令参数

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

  • ansible详细参数:

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

-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在/etc/ansible/hosts
inventory [ˈɪnvəntri] 库存

-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。

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

-a,MODULE_ARGS #指定 module 模块的参数

-k, ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证

-sudo # 指定使用 sudo 获得 root 权限

-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用

-u USERNAME,-user=USERNAME # 指定移动端的执行用户

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

ansible-doc详细参数
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数 -s, snippet 片断

定义主机清单

  1. 基于端口,用户,密码定义主机清单
    ansible基于ssh连接-i (inventory)参数后指定的远程主机时,也可以写端口,用户,密码。
  2. 格式:
  3. ansible_ssh_port:指定ssh端口
  4. ansible_ssh_user:指定 ssh 用户
  5. ansible_ssh_pass:指定 ssh 用户登录是认证密码(明文密码不安全)
  6. ansible_sudo_pass:指明 sudo 时候的密码
  7. eg:
    [root@ansible ~]# vim /etc/ansible/hosts #文件 /etc/ansible/hosts 维护着Ansible中服务器的清单。在文件最后追加以下内容(或者主机组下面添加,默认是被注释掉的)
    [webservers] #主机组名
    192.168.43.121 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
  • 简单测试下主机的连通性
  • [root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m ping
    -i # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
    -m # 指定使用的ping模块

报错:
192.168.43.167 | FAILED! => {
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host." }

  • 解决[root@ansible ~]# ssh [email protected] #手动连接一下/etc/ansible/hosts主机清单中的主机,这样就可以在ansible服务器上保存目标主机的fingerprint指纹。后期可以正常连接了

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping #测试成功

192.168.43.167 | SUCCESS=> { #表示成测试。通信成功
“ansible_facts”: {
“discovered_interpreter_python”: “/usr/bin/python”
},
“changed”:false, , #因为ping命令不会改变被管理的服务器的状态。所以是false正常
“ping”: “pong”
}
[root@ansible ~]#

  • 基于ssh密钥来访问定义主机清单
    一般来说,使用明文密码不安全,所以增加主机无密码访问。
    在Ansible服务端生成密钥,并且复制公钥到节点中。

[root@ansible .ssh]#ssh-keygen #一直往下回车

使用ssh-copy-id命令来复制Ansible公钥到节点:43.167和43.168

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   #直接回车
Enter passphrase (empty for no passphrase):   #直接回车
Enter same passphrase again:  #直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TeGAs3mkAh3sdu9A6B1Ia+/Pze9slz+JbTUdy1dR4Nw root@ansible
The key's randomart image is:
+---[RSA 2048]----+
|   o.. .. .   ..o|
|  . + o .o . o o |
|   + + *  o   o E|
|    O B .o     ..|
|   + * +S .   . =|
|    . + .      ++|
|     . o      o.=|
|      ...o ...o= |
|       .o o++...o|
+----[SHA256]-----+

[root@ansible .ssh]# ssh-copy-id [email protected]

在Ansible服务端运行命令

ping模块检查网络连通性

command模块执行shell命令,command:作为ansible的默认模块,可以运行远程权限范围内的所有shell命令

例1:使用ping检查‘webservers’或者ansible节点的连通性。
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m ping
或:
[root@ansible ~]#ansible 'web-servers' -m ping#不指定,默认使用/etc/ansible/hosts文件

检查Ansible节点的运行时间(uptime)

[root@ansible ~]# ansible -m command -a "uptime" webservers #在所以机器上执行uptime命令

检查节点的内核版本

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uname -r" webservers

给节点增加用户

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "useradd wyh123" webservers #给所以节点增加一个用户 wyh123

过滤下创建的用户 wyh123

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "grep wyh123 /etc/passwd" webservers

将df命令在所有节点执行后,重定向输出到本机的/tmp/wyh-output.txt文件中

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command - "df -Th" webservers >/tmp/wyh-output.txt

ansible常见模块高级使用方法

- command模块为ansible默认模块,不指定-m参数时,使用的就是command模块; comand模块比较简单,常见的命令都可以使用,但其命令的执行不是通过shell执行的,所以,像这些"<", ">", "|", and "&"操作都不可以,当然,也就不支持管道; 缺点:不支持管道,没法批量执行命令;
  • shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。
  • 对shell模块的使用可以分成两块:shell 命令少,命令多

运行free -m 命令

[root@ansible ~]# ansible -i /etc/ansible/hosts -m shell -a "free -m" webservers

注:但是我们自己定义在/.bashrc或/.bash_profile中的环境变量shell模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;
[root@ansible ~]# source ~/.bash_profile

  1. 如果待执行的语句少,可以直接写在一句话中:
    [root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "source ~/.bash_profile && df -h | grep sda3"

  2. 如果在远程待执行的语句比较多,可写成一个脚本,通过copy模块传到远端,然后再执行;但这样就又涉及到两次ansible调用;对于这种需求,ansible已经为我们考虑到了,script模块就是干这事的;

3)、scripts模块
使用scripts模块可以在本地写一个脚本,在远程服务器上执行:

[root@ansible ~]# cat net.sh
#!bin/bash
date
hostname

[root@ansible ~]# mkdir /opt/script
[root@ansible ~]# mv net.sh /opt/script/
[root@ansible ~]# cd /opt/script/
[root@ansible script]# ls
net.sh

[root@ansible ~]# bash /opt/script/net.sh
Sun Feb 23 13:11:46 CST 2020
ansible
[root@ansible ~]#

[root@ansible ~]# ansible -i /etc/ansible/hosts -m script -a "/opt/script/net.sh" webservers

copy模块:实现主控端向目标主机拷贝文件,类似scp功能

例1:把ansible主机上的/etc/hosts文件复制到主机组中机器的/tmp目录下
root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m copy -a "src=/etc/hosts dest=/tmp/ owner=root group=root mode=755" #属性是可以不加的

file模块设置文件属性。

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m file -a "path=/opt/c.txt mode=0444"

区分:

黄色:发生改变,绿色:执行成功,但没改变

stat模块获取远程文件信息(在修改之前,先看下状态)

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m stat -a "path=/opt/c.txt"

get_url模块实现远程主机下载指定url到本地,支持sha256sum文件校验

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes" #下载epel-release-latest-7.noarch.rpm到主机清单中的/tmp/目录下

扩展:查看force=yes的作用
[root@ansible ~]# ansible-doc -s get_url #在弹出的信息中找到force
如果force=yes,当下载文件时,如果所下的内容和原目录下的文件内容不一样,则替换原文件,如果一样,就不下载了。
如果为“否”,则仅在目标不存在时才下载文件。 一般来说,只有小型本地文件才应该为“是”。 在0.6之前,该模块表现为默认为“是”。

yum模块linux平台软件包管理。

yum模块可以提供的status状态: latestpresentinstalled #这3个代表安装;removed,absent #后面2个是卸载

例子:安装httpd软件
[root@ansible]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=latest"

cron模块远程主机crontab配置。
例如:增加每30分钟执行ls /tmp

*/30 * * * * (分 时 日 月 周 )
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"

name #注释,计划任务的名字
minute #分钟这一块你怎么写
job 就是你具体执行的命令

service模块远程主机系统服务管理。(起服务的)

service模块常用参数:
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded。
enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭

例如:远程启动Apache服务
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m service -a "name=httpd state=restarted"

sysctl模块远程主机sysctl配置。

例:开启路由转发功能
[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"

总结:

ansible语法:

ansible -i 主机清单 主机组 -m 模块名 -a 模块参数

[root@ansible ~]# ansible -i /etc/ansible/hosts -m command -a "uptime" webservers

  • shell模块:使用shell模块,在远程命令通过/bin/sh来执行;所以,我们在终端输入的各种命令方式,都可以使用。

  • 对shell模块的使用可以分成两块:

  • shell:如果待执行的语句少,可以直接写在一句话中:

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m shell -a "free -m"

  • script:果在远程待执行的语句比较多,可写成一个脚本

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m script -a "/opt/script/net.sh"

ansible -i /etc/ansible/hosts 主机清单 -m script -a "脚本路径"

copy模块:实现主控端向目标主机拷贝文件,类似scp功能

-a "src=/源路径 dest=/目标路径 +(属性)"

[root@ansible opt]# ansible webservers -m copy -a "src=/opt/a.txt dest=/opt/wyh.txt owner=root group=root mode=0444"

file模块设置文件属性。

path=/路径 mode =属性

[root@ansible opt]# ansible webservers -m file -a "path=/opt/wyh.txt mode=0777"

stat模块获取远程文件信息

[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/tmp/hosts"

**get_url模块实现远程主机下载指定url到本地,**支持sha256sum文件校验。

get_url -a "url=xx dest=/下载到哪里 mode 权限 force=yes|on"

  • eg:
    [root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp mode=0404 force=yes"

yum模块linux平台软件包管理

  • yum模块可以提供的status状态:
    latest ,present,installed #这3个代表安装;
    removed, absent #后面2个是卸载

yum -a "name=包名 state=安装|删除"

[root@ansible ~]# ansible -i /etc/ansible/hosts webservers -m yum -a "name=httpd state=removed"

**cron模块远程主机crontab配置 **#配置计划任务

corn -a "name=注释 minute='计划' job='执行命令'"

eg:
[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='ls /tmp'"

service模块远程主机系统服务管理。

service模块常用参数
(1)、name参数:此参数用于指定需要操作的服务名称,比如 nginx,httpd。
(2)、state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的httpd,则可以将 state 的值设置为started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted(重启)、reloaded
(3)、enabled参数:此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
注:想使用service模块启动服务,被启动的服务,必须可以使用service 命令启动或关闭

[root@ansible ~]# ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=restarted"

发布了60 篇原创文章 · 获赞 3 · 访问量 2058

猜你喜欢

转载自blog.csdn.net/weixin_42313749/article/details/104523458