ansible快速入门手册

安装

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

yum install epel-release -y

  1. 使用yum安装Ansible

yum install ansible

  1. 查看ansible的版本

ansible --version

ansible 2.9.27

第一个ansible命令尝鲜

说到底,ansible的作用就是连接远端客户机,执行命令。

所以第一步就是连接。

配置ssh鉴权

ansible通过ssh登录客户机。所以,第一步先配置好ssh登录。

客户机要允许我们进行ssh登录,需要提前配置好防火墙
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='10.135.6.xx' service name='ssh' accept"
firewall-cmd --reload

echo sshd: 10.135.6.xx >> /etc/hosts.allow

  1. 生成密钥

    ssh-keygen

    默认情况下,在/root/.ssh下生成id_rsa.pub就是公钥,一会要copy到客户机

  2. 把密钥拷贝到客户机

    把第一步生成的公钥追加到客户机的/root/.ssh/authorized_keys文件里

或者
ssh-copy-id -i .ssh/id_rsa.pub redis@10.250.5.6 # 将公钥文件copy到远程主机上
ssh-agent bash # 通过ssh-agent来管理密钥
ssh-add ~/.ssh/id_rsa # 将私钥交给ssh-agent管理,避免每次连接都需要输入密钥密码

ssh-copy-id这种方式要求你提前知道密码。

通常公司里是不会root密码的,只能通过堡垒机登录,使用第一种方式手动copy

如果报ssh-copy-id: command not found,安装一下
yum -y install openssh-clientsansible

ping一下

我们先创建一个hosts文件,在hosts文件里写上客户机ip。(ansible默认是找/etc/ansible/hosts)
root@paas-m-k8s-master-1 demo# pwd
/root/ansible/demo
root@paas-m-k8s-master-1 demo# cat hosts

demo

10.178.151.21
10.178.151.22
10.178.151.23

demo是我对这组ip的一个命名,用\[\]括起来,这是andible的规范。
root@paas-m-k8s-master-1 demo# ansible -i hosts demo -m ping
10.178.151.21 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.178.151.22 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.178.151.23 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}

这是ansible的命令,-i 指定客户机清单文件,不写的话就是找默认的/etc/ansible/hosts文件,

-m 指定要执行的命令

基础命令

anisble命令语法: ansible -i 主机文件 -f 并发数量 组名 -m 模块名称 -a 模块参数
参数功能-v详细模式,如果执行成功,输出详细结果-i指定host文件路径,默认在/etc/ansible/hosts-f,-forks=NUMNUM默认是整数5,指定fork开启同步进程的个数-m指定使用的module名称,默认command模块-a指定模块的参数-k提示输入SSH密码,而不是使用基于ssh密钥认证-sudo指定使用sudo获取root权限-K提示输入sudo密码-u指定客户端的执行用户-C测试命令执行会改变什么内容,不会真正的去执行

最常用的就是-i和-m, -a

-m后面指定的是模块,默认是command模块,即执行命令。

比如查看磁盘:

ansible -i /root/ansible/demo/hosts demo -m command -a "df -h"

高级用法

执行模块

上面说到使用command模块执行常见的shell命令。

但是需要明白的一点是,command模块执行命令并不是通过shell来执行。所以常见的命令都可以使用,但是像>> < > | 和 & 这些操作都不可以,不支持管道,没法批量执行命令

那要怎么办呢?

这就说到ansible的有三个远程执行模块:command,shell和scripts command :就是前面测试用的这个,你已经熟悉了。

shell模块: 使用shell模块的时候默认是通过/bin/sh来执行的,所以在终端输入的各种命令都可以使用

scripts模块:可以在本地写一个脚本,在远程服务器上执行这个脚本

shell模块示例

ansible -i hosts demo -m shell -a "ps -ef | grep java"

10.178.151.211 | CHANGED | rc=0 >>
root 1477 1 0 2021 ? 04:37:28 .......

你可以换成command模块看看效果

script模块示例

root@paas-m-k8s-master-1 demo# cat > demo.sh << EOF
> date
> echo "hello devops"
> EOF
root@paas-m-k8s-master-1 demo# ansible -i hosts demo -m script -a "demo.sh"
10.178.151.211 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.178.151.211 closed.\r\n",
"stderr_lines": "Shared connection to 10.178.151.211 closed." ,
"stdout": "2023年 03月 01日 星期三 15:22:10 CST\r\nhello devops\r\n",
"stdout_lines": "2023年 03月 01日 星期三 15:22:10 CST", "hello devops"
}

除了执行模块,ansible还自带很多其他有用的模块,不做演示了。

其他模块

copy:把主机的文件copy到客户机上,功能类似scp

file:设置文件权限

stat:获取客户机的文件的信息

get_url: 让客户机执行url的get下载

yum:客户机上执行yum安装软件

cron:客户机上配置定时任务,就是crontab

service:客户机管理服务。如关闭开启防火墙

user:管理用户

fetch: 从远程某主机获取(复制)文件到本地

setup: 主要用于收集客户端主机信息。是通过调用facts组件来实现的。   facts组件是Ansible用于采集被管机器设备信息的一个功能,我们可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息。整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最上层的值。

先了解ansible的能力,深入学习靠自己。这些模块的功能其实靠command,shell,script等也可以实现。

查看模块用法

列出都有哪些模块
ansible-doc -l

查看你具体想要了解的模块
ansible-doc -l | grep shell
ansible-doc shell

常用功能命令

平常大部分工作我都习惯直接用shell模块。

但是很多内置模块的合理使用,可以极大的提高效率。

修改文件

使用lineinfile模块。path指定文件路径,line指定内容。

该命令会先检查文件种是否有这行,有的话不做任何操作。没有的话就插入一行
ansible -i es-host es -m lineinfile -a 'path=/usr/local/elasticsearch/config/elasticsearch.yml line="cluster.initial_master_nodes: \\"{{host_name}}\\""'

其实也就是保证这一行存在。

那如果要删除这一行,用下面的语句
ansible -i es-host es -m lineinfile -a 'path=/usr/local/elasticsearch/config/elasticsearch.yml line="cluster.initial_master_nodes: \\"{{host_name}}\\"" state=absent'

就是加了一个state=absent。就是保证这一行不存在。

所以其实所谓插入的语句,隐含了一个state=present

相关推荐
乘云数字DATABUFF21 小时前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--3 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森3 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜3 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB4 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode6 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220707 天前
如何搭建本地yum源(上)
运维
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠9 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质10 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务