Linux的Ansible软件基础使用讲解和ssh远程连接

一、使用讲解

1.1 运行原理

工作原理:

1、用户登录管理机器:通过ansible剧本或者单行命令针对业务机器组或者单个机器部署任务

2、管理机器读取用户的部署任务:根据自己hosts文件中定义的业务机器组查找对应的机器地址(ip或者域名)

3、管理机下发任务:管理机通过ssh免密连接业务机器,下发任务给业务机器

4、业务机器执行任务

5、业务机器将执行结果发送给ansible管理机器

反馈字体颜色

绿色 未发生变化

黄色 更改生效

红色 执行错误

1.2 部署前准备

约定事项:

  1. 所有服务器全部采用静态ip
主机名称 IP地址
manage01 192.168.66.200/24
node1 192.168.66.201/24
node2 192.168.66.202/24
node3 192.168.66.203/24
  1. 主机名及主机名互相绑定

    [root@manage01 ~]# vim /etc/hosts
    127.0.0.1 localhost
    ::1 localhost
    192.168.66.200 manage01
    192.168.66.201 node1
    192.168.66.202 node2
    192.168.66.203 node3

    其他机器同理

  2. 关闭防火墙, selinux

    [root@manage01 ~]# systemctl disable firewalld
    [root@manage01 ~]# sed -i -r '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
    [root@manage01 ~]# reboot

    其他机器同理

  3. 采用时间服务器,时间同步

    1、修改配置文件,配置时间服务器为阿里云的时间服务器
    [root@manage01 ~]# egrep "^server" /etc/chrony.conf
    server ntp1.aliyun.com
    server ntp2.aliyun.com
    server ntp3.aliyun.com
    server ntp4.aliyun.com

    2、重启服务chronyd
    [root@manage01 ~]# systemctl restart chronyd.service

    3、查看源信息
    #chronyc chrony的命令行客户端
    [root@manage01 ~]# chronyc sources -v
    210 Number of sources = 2

    .-- Source mode '^' = server, '=' = peer, '#' = local clock.
    / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
    | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
    || .- xxxx [ yyyy ] +/- zzzz
    || Reachability register (octal) -. | xxxx = adjusted offset,
    || Log2(Polling interval) --. | | yyyy = measured offset,
    || \ | | zzzz = estimated error.
    || | |
    MS Name/IP address Stratum Poll Reach LastRx Last sample

    ^? 116.62.13.223 2 6 1 7 -1647us[-1647us] +/- 27ms
    ^? 203.107.6.88 2 6 1 9 -8206us[-8206us] +/- 30ms

  4. 确认和配置yum源(需要epel源)

    yum -y install epel-*

1.3 安装ansible

复制代码
-- 下载
yum -y install ansible

-- 检查下载版本
ansible --version

-- 记的检查一下Linux中有不有python
python -V

无网络状态下载:

复制代码
1、官网下载地址:https://releases.ansible.com/ansible
[root@manage01 ~]# wget https://releases.ansible.com/ansible/ansible-2.9.3.tar.gz

2、安装ansible
[root@manage01 ~]# tar xf ansible-2.9.3.tar.gz 
[root@manage01 ~]# mv ansible-2.9.3 /opt/ansible
[root@manage01 ~]# cd /opt/ansible

# python目前的版本 python2 python3
# pip是python中的下载工具,python2已经不支持的,早就停止更新了
# 如果是python3,pip的名字叫pip3

#python软件包安装--1、安装依赖
[root@manage01 ansible]python get-pip.py
[root@manage01 ansible-2.9.0rc3]# 
# install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

#python软件包安装--2、安装软件
[root@manage01 ansible-2.9.0rc3]# pip install --user ansible -i https://pypi.tuna.tsinghua.edu.cn/simple/

#安装后设置
[root@manage01 ~]# ln -s /opt/ansible/bin/* /usr/bin/
[root@manage01 ~]# cp /opt/ansible/examples/ansible.cfg /etc/ansible/
[root@manage01 ~]# cp /opt/ansible/examples/hosts /etc/ansible/

1.4 修改配置文件

复制代码
vim /etc/ansible/ansible.cfg    主配置文件,配置ansible工作特性(一般无需修改)
    

-- 找到下面的语句,取消注释
host_key_checking = False                   # 检查对应服务器的host_key
#log_path=/var/log/ansible.log              # 日志文件,建议启用
#module_name = command                      # 默认模块,可以修改为shell模块

vim /etc/ansible/hosts

[组名]
写入要控制的主机ip

Inventory 主机清单

1> ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory file中将其分组命名

2> 默认的inventory file为/etc/ansible/hosts

3> inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

/etc/ansible/hosts文件格式

inventory文件遵循INI文件风格,中括号中的字符为组名。

可以将同一个主机同时归并到多个不同的组中;

此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明

ntp.zking.com 不分组,直接加

webservers\] webservers组 www1.zking.com:2222 可以指定端口 www2.zking.com \[dbservers

db1.zking.com

db2.zking.com

db3.zking.com

如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

示例:

websrvs

www[1:100].example.com ip: 1-100

dbsrvs

db-[a:f].example.com dba-dbff

1.5 ansible系列命令

Ansible系列命令

ansible ansible-doc ansible-playbook ansible-vault ansible-console

ansible-galaxy ansible-pull

ansible-doc: 显示模块帮助

ansible-doc [options] [module...]

-a 显示所有模块的文档

-l, --list 列出可用模块

-s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)

示例:

ansible-doc -l 列出所有模块

ansible-doc ping 查看指定模块帮助用法

ansible-doc -s ping 查看指定模块帮助用法

复制代码
ansible通过ssh实现配置管理、应用部署、任务执行等功能,
建议配置ansible端能基于密钥认证的方式联系各被管理节点

ansible <host-pattern> [-m module_name] [-a args]

ansible +被管理的主机(ALL) +模块  +参数

    --version              显示版本
    -m module              指定模块,默认为command
    -v                     详细过程 --vv -vvv更详细
    --list-hosts           显示主机列表,可简写 --list
    -k, --ask-pass         提示输入ssh连接密码,默认Key验证
    -C, --check            检查,并不执行
    -T, --timeout=TIMEOUT  执行命令的超时时间,默认10s
    -u, --user=REMOTE_USER 执行远程执行的用户
    -b, --become           代替旧版的sudo切换
        --become-user=USERNAME 指定sudo的runas用户,默认为root
    -K, --ask-become-pass  提示输入sudo时的口令

1.6 ssh远程连接

第一步:生成ssh公私钥

复制代码
ssh-keygen

后面操作回车就行

第二步:将公钥传给node1

复制代码
cd ~

ssh-copy-id -i .ssh/id_rsa.pub [email protected]
后面跟要连接的主机ip

-- 这里需要输入对面连接主机的用户密码

第三步:测试连接

复制代码
ssh root@[ip]

不需要自己输入密码,就可以登录到其他主机

1.7 ssh连接脚本

复制代码
#!/bin/bash

# 定义变量
USER="root"
PASSWORD="123456"
PUBLIC_KEY_FILE="/root/.ssh/id_rsa.pub"
BASE_IP="192.168.66.1"

ssh-keygen -f /root/.ssh/id_rsa -N ""

# 循环遍历 IP 地址范围 1 到 10
for i in {1..10}
do
    HOST="${BASE_IP}${i}"
    echo "设置免密 SSH for $USER@$HOST..."

    # 使用 sshpass 和 ssh-copy-id 命令来设置免密登录
    sshpass -p "$PASSWORD" ssh-copy-id -o StrictHostKeyChecking=no -i "$PUBLIC_KEY_FILE" "$USER@$HOST"

    if [ $? -eq 0 ]; then
        echo "设置成功 for $USER@$HOST."
    else
        echo "设置失败 SSH for $USER@$HOST."
    fi
done

1.8 ansible的Host-pattern

复制代码
ansible的Host-pattern

匹配主机的列表
    All :表示所有Inventory中的所有主机
        ansible all --list
    * :通配符
        ansible "*" --list  (*表示所有主机)
        ansible 192.168.66.* --list
        ansible "*srvs" --list
    或关系 ":"
        ansible "websrvs:appsrvs" --list
        ansible "192.168.66.10:192.168.66.20" --list
    逻辑与 ":&"
        ansible "websrvs:&dbsrvs" --list
        在websrvs组并且在dbsrvs组中的主机
    逻辑非 ":!"
        ansible 'websrvs:!dbsrvs' --list
        在websrvs组,但不在dbsrvs组中的主机
        注意:此处为单引号
    综合逻辑
        ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' --list
    正则表达式
        ansible "websrvs:&dbsrvs" --list
        ansible "~(web|db).*\.zking\.com" --m ping

[websrvs]
web1.zking.com ansible_host=192.168.66.10
web2.zking.com ansible_host=192.168.66.11

[appsrvs]
app1.zking.com ansible_host=192.168.66.20
app2.zking.com ansible_host=192.168.66.21

[dbsrvs]
db1.zking.com ansible_host=192.168.66.30
db2.zking.com ansible_host=192.168.66.31

[ftpsrvs]
ftp1.zking.com ansible_host=192.168.66.40
ftp2.zking.com ansible_host=192.168.66.41

# 定义一个组合组,包含所有服务器
[servers:children]
websrvs
appsrvs
dbsrvs
ftpsrvs

# 使用别名
[aliases]
alias_web1 ansible_host=192.168.66.10
alias_app1 ansible_host=192.168.66.20

1.9 ansible命令执行过程

ansible命令执行过程

  1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg

  2. 加载自己对应的模块文件,如command

  3. 通过ansible将模块或命令生成对应的临时py文件,

并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件

  1. 给文件+x执行

  2. 执行并返回结果

  3. 删除临时py文件,sleep 0退出

执行状态:

绿色:执行成功并且不需要做改变的操作

黄色:执行成功并且对目标主机做变更

红色:执行失败
可以通过添加-v观察执行过程

示例:

复制代码
以wang用户执行ping存活检测
        ansible all -m ping -u wang -k
    以wang sudo至root执行ping存活检测
        ansible all -m ping -u wang -k -b
    以wang sudo至mage用户执行ping存活检测
        ansible all -m ping -u wang -k -b --become-user=mage
    以wang sudo至root用户执行ls
        ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K

ansible ping模块测试连接
    ansible 192.168.66.126,192.168.66.127 -m ping -k 
相关推荐
遇见火星8 小时前
如何使用Ansible一键部署MinIO集群?
ansible
粥周粥8 小时前
ANSIBLE
ansible
码农101号8 小时前
Linux中ansible模块补充和playbook讲解
linux·运维·ansible
烟雨书信2 天前
ANSIBLE运维自动化管理端部署
运维·自动化·ansible
碎碎-li2 天前
ANSIBLE(运维自动化)
运维·自动化·ansible
@donshu@5 天前
Linux运维-ansible-python开发-获取inventroy信息
linux·运维·ansible
Kendra9198 天前
Ansible
ansible
꧁༺朝花夕逝༻꧂11 天前
Ansible小试牛刀
ansible
꧁༺朝花夕逝༻꧂11 天前
Ansible+Zabbix-agent2快速实现对多主机监控
运维·ansible