Ansible 基础入门

news2024/12/26 20:40:39

2)Ansible 介绍

Ansible 基本概念

Ansible 是一种自动化运维工具,基于 Paramiko 开发的,并且基于模块化工作,Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,它是基于 Python 语言,由 Paramiko 和 PyYAML 两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

Ansible 是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是 Ansible 所运行的模块,Ansible 只是提供一种框架。Ansible 不需要在远程主机上安装 Client、Agents,因为它们是基于 SSH 来和远程主机通讯的。

Ansible 优势

  • Ansible 不需要单独安装客户端,也不需要启动任何服务
  • Ansible 是 Python 中的一套完整的自动化执行任务模块
  • Ansible PlayBook,采用 yaml 配置,对于自动化任务执行一目了然
  • Ansible 模块较多,对于自动化的场景支持较丰富

2.1)Ansible 发展史

官网:https://www.ansible.com/
作者: Michael DeHaan( Cobbler 与 Func 作者)

Ansible 的名称来自科幻小说《 安德的游戏 》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗。
2012-03-09,发布 0.0.1 版
2015-10-17,Red Hat 宣布 1.5 亿美元收购

官方文档:https://docs.ansible.com/

2.2)Ansible 功能

Ansible 功能介绍

  • 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
  • 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂的 IT 架构任务,Ansible 的 PlayBook 和 Role 可以轻松实现大型的 IT 复杂架构
  • **提供自动化运维工具的 开发 API,**有很多运维工具,如 JumpServer 就是基于 Ansible 实现自动化管理功能

2.3)Ansible 特性

Ansible 特性

  • 模块化: 调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块
  • Paramiko( Python 对 SSH 的实现),PyYAML,Jinja2(模板语言)三个关键模块
  • 基于 Python 语言实现
  • 部署简单,基于 Python 和 SSH (默认已安装),agentless,无需代理不依赖 PKI( 无需 SSL )
  • 安全, 基于 OpenSSH
  • 幂等性: 一个任务执行 1 遍和执行 n 遍效果一样,不因重复执行带来意外情况,此特性非绝对。( Shell 脚本想实现幂等性很困难 )
  • 支持 PlayBook 编排任务,YAML 格式,编排任务,支持丰富的数据结构( 存在 分支,循环,判断,变量 等功能 )
  • 较强大的 多层解决方案 role( Role 角色管理 )

2.4)Ansible 架构

Ansible 是 基于模块工作 的,本身没有批量部署的能力。真正具有批量部署的是 Ansible 所运行的模块,Ansible 只是提供一种框架。

上图为 Ansible 的基本架构,从上图可以了解到其由以下部分组成:

  • 核心: Ansible
  • 核心模块(Core Modules):这些都是 Ansible 自带的模块
  • 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
  • 插件(Plugins):完成模块功能的补充
  • 剧本(Playbooks):Ansible 的任务配置文件,将多个任务定义在剧本中,由 Ansible 完成执行
  • 连接插件(Connectior Plugins):Ansible 基于连接插件连接到各个主机上,虽然 Ansible 是使用 SSH 连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
  • 主机清单(Host Inventory):定义 Ansible 管理的主机

Ansible 工作逻辑

  1. 用户请求
  2. 寻找要运行的主机清单
  3. 通过模块连接远程主机发送要执行的命令
  4. 被控节点执行命令

2.4.1)Ansible 组成

组合 INVENTORY、API、MODULES、PLUGINS 的绿框
为 Ansible 命令工具,其为 核心执行工具
INVENTORY:Ansible 管理主机的清单 /etc/anaible/hosts ( 主机清单 )
MODULES:Ansible 执行命令的 功能模块,多数为内置核心模块,也可自定义( 功能模块 )
PLUGINS:模块功能的补充,如 连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用( 扩展插件 )
API:**供第三方程序调用 **的应用程序编程接口( 开发接口 )

2.4.2)Ansible 命令执行来源

USER 用户,即 SYSTEM ADMINISTRATOR
PLAYBOOKS:任务剧本(任务集),编排定义 Ansible 任务集的配置文件,由 Ansible 顺序依次执行,通常是 JSON 格式的 YML 文件
CMDB(配置管理数据库) API 调用
PUBLIC/PRIVATE CLOUD( 共有云\私有云 )API 调用
USER -> Ansible Playbook -> Ansibile

2.4.3)注意事项

执行 Ansible 的主机 一般称为:管理端,主控端,中控,Master堡垒机
主控端 Python 版本需要 2.6 或以上
被控端 Python 版本小于 **2.4 **时,需要安装 Python-simplejson
被控端 如开启 SELinux 需要安装 libselinux-python
Windows 不能做为主控端( 可以做被控端 )

3)Ansible 入门

3.1)Ansible 安装

官方文档:https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html

Ansible 的安装方法有多种

  1. Yum 源安装
  2. 编译安装
  3. Git 方式
  4. PIP 安装

3.1.1)Yum 源安装

**注意:**Ansible 软件包默认不在 Yum 仓库中,需配置 EPEL 源安装。
https://blog.csdn.net/weixin_74962223/article/details/134573366

// CentOS 的 EPEL 源的 rpm 包安装
[root@centos7 ~] yum repolist | grep epel
[root@centos7 ~] yum install ansible -y

// Ubuntu 安装
[root@ubuntu ~] apt install ansible -y

**范例:**查看 Ansible 版本

[root@centos7 ~] yum info ansible
[root@centos8 ~] yum info ansible

[root@ubuntu1804 ~] apt show ansible

**范例:**Ubuntu18.04 安装最新版的 Ansible

[root@ubuntu1804 ~] apt update
[root@ubuntu1804 ~] apt install software-properties-common
[root@ubuntu1804 ~] apt-add-repository --yes --update ppa:ansible/ansible
[root@ubuntu1804 ~] apt install ansible
[root@ubuntu1804 ~] ansible --version

范例: CentOS 安装 Ansible

# 需要存在 EPEL 源
# 参考: https://blog.csdn.net/weixin_74962223/article/details/134573366
[root@centos7 ~] yum repolist
[root@centos7 ~] yum install ansible -y
[root@centos7 ~] ansible --version

3.1.2)编译安装

yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto

wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz

tar xf ansible-1.5.4.tar.gz
 && cd ansible-1.5.4

python setup.py build
python setup.py install

mkdir /etc/ansible
cp -r examples/* /etc/ansible

3.1.3)Git 方式

git clone git://github.com/ansible/ansible.git --recursive

cd ./ansible

source ./hacking/env-setup

3.1.4)PIP 安装

# PIP 是安装 Python 包的管理器, 类似 Yum
[root@centos7 ~] yum install python-pip 
[root@centos7 ~] pip install --upgrade pip
[root@centos7 ~] pip install ansible --upgrade
[root@centos7 ~] ansible --version

3.1.5)验证安装

[root@ansible ~] ansible --version
ansible 2.9.27    # 版本信息
  config file = /etc/ansible/ansible.cfg    # 配置文件
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']      # 模块路径
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible    # ansible 可执行程序 ( 基于 Python 编写 )
  python version = 2.7.5 (default, Oct 14 2020, 14:45:30) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]

3.2)Ansible 相关文件

3.2.1)配置文件

Ansible 是一款自动化运维工具,它并不是一个服务。
因此,它没有对应的 Service 文件。Ansible 无需长期运行,只在需要使用时运行其二进制文件即可。( 安装完成后,直接使用即可 )

/etc/ansible/ansible.cfg 主配置文件
配置 ansible 工作特性,也可以在项目的目录中创建此文件,
当前目录下如果也有 ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的 ansible.cfg 文件
/etc/ansible/hosts 主机清单
/etc/ansible/roles 存放角色的目录

3.2.2)Ansible 主配置文件

Ansible 的配置文件 可以放在多个不同地方
优先级从高到低顺序如下

ansible will read ANSIBLE_CONFIG,ansible.cfg in the current working directory, .ansible.cfg in the home directory or /etc/ansible/ansible.cfg, whichever it finds first

a. $ANSIBLE_CONFIG 变量
b. 项目目录下的配置文件
c. 当前用户家目录下的配置文件
d. /etc/ansible/ansible.cfg (默认)
# 验证 Ansible 默认调用的主配置文件路径
ansible --version    # 当前目录的 ansible 配置文件调用优先级高于 /etc/ansible/xxx

Ansible 的 默认配置文件 /etc/ansible/ansible.cfg
其中大部分的配置内容无需进行修改( 下图:RHCE 考试默认使用的 ansible.cfg )

[defaults]
# inventory     = /etc/ansible/hosts    // 主机列表配置文件
# library = /usr/share/my_modules       // 库文件存放目录
# remote_tmp = $HOME/.ansible/tmp       // 临时py命令文件存放在远程主机目录
# local_tmp     = $HOME/.ansible/tmp    // 本机的临时命令执行目录
# forks         = 5                     // 默认并发数
# sudo_user     = root                  // 默认 sudo 用户
# ask_sudo_pass = True                  // 每次执行 ansible 命令是否询问 ssh 密码
# ask_pass     = True   
# remote_port   = 22
# host_key_checking = False            // 检查对应服务器的 host_key, 建议取消此行注释, 实现第一次连接自动信任目标主机
# log_path=/var/log/ansible.log        // 日志文件, 建议启用
# module_name = command                // 默认模块, 可以修改为 shell 模块

[privilege_escalation]                 # 如果是普通用户则需要配置提权
# become=True
# become_method=sudo
# become_user=root
# become_ask_pass=False

**小技巧:**当前目录下的 Ansible 的配置文件 优先生效

// 验证 Ansible
[root@ansible ~] ansible --version

// 复制 Ansible 配置文件至当前目录
[root@ansible ~] cp /etc/ansible/ansible.cfg .

// 再次验证
[root@ansible ~] ansible --version
ansible 2.9.17
    config file = /root/ansible.cfg        # 注意配置文件路径优先级为当前目录的 ansible.cfg 啦
    configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
    ansible python module location = /usr/lib/python3.6/site-packages/ansible
    executable location = /usr/bin/ansible
    python version = 3.6.8 (default, Apr 16 2020, 01:36:27) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

3.2.3)inventory 主机清单

官方文档:https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html
Ansible 的主要功能 在于批量主机操作,为了便捷地使用其中的部分主机,可以在 Inventory 主机清单文件中将其分组组织。

默认的 inventory file 为 /etc/ansible/hosts
当然也可以自定义,然后使用 -i 指定 inventory 文件位置
注意: 生产环境建议在每个项目目录下创建项目独立的 hosts 文件

主机清单 文件格式
inventory 文件遵循 INI 文件风格
中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中
此外,当如若目标主机使用了非默认的 SSH 端口,还可以在主机名称之后使用冒号加端口号来标明
如果主机名称遵循相似的命名模式,还可以使用列表的方式标识各主机

Inventory 参数说明

ansible_ssh_host                // 将要连接的远程主机名. 与你想要设定的主机的别名不同的话, 可通过此变量设置.
ansible_ssh_port                // ssh 端口号. 如果不是默认的端口号, 通过此变量设置. 这种可以使用 ip:端口 192.168.1.100:2222
ansible_ssh_user                // 默认的 ssh 用户名
ansible_ssh_pass                // ssh 密码 ( 这种方式并不安全, 我们强烈建议使用 --ask-pass 或 SSH 密钥 )
ansible_sudo_pass               // sudo 密码 (这种方式并不安全, 我们强烈建议使用 --ask-sudo-pass )
ansible_sudo_exe (new in version 1.8)    // sudo 命令路径 ( 适用于1.8及以上版本 )
ansible_connection                      // 与主机的连接类型. 比如: local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart', 'smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file            // ssh 使用的私钥文件. 适用于有多个密钥, 而你不想使用 SSH 代理的情况.
ansible_shell_type                      // 目标系统的 shell 类型. 默认情况下, 命令的执行使用 'sh' 语法, 可设置为 'csh''fish'.
ansible_python_interpreter              // 目标主机的 python 路径.

范例:列表形式

# vim /etc/ansible/hosts ( 默认主机清单文件 )

ntp.magedu.com            # 1) 被管理主机名或 IP 地址
[webservers]              # 2) 将被管理主机分类
www1.magedu.com:2222      # 3) 目标主机使用了非默认的 SSH 端口
www2.magedu.com

[dbservers]
db1.magedu.com
db2.magedu.com
db3.magedu.com

或者
db[1:3].magedu.com        # 4) 可以使用列表的方式标识主机

范例:组嵌套

# vim /etc/ansible/hosts ( 默认主机清单文件 )
[webservers]
www[1:100].example.com

[dbservers]
db-[a:f].example.com

[appservers]
10.0.0.[1:100]            # 列表形式: 10.0.0.1 - 10.0.0.100

// 定义 testsrvs 组包括两个其它分组, "实现组嵌套"
[testsrvs:children] 
webservers
dbservers

范例:

本机地址: 10.0.0.8
# vim /etc/ansible/hosts ( 默认主机清单文件 )
[local]
10.0.0.8 ansible_connection=local        # 指定本地连接, 无需 ssh 配置
# 注意: ansible_connection=ssh 时
# 配置文件需要 StrictHostKeyChecking no
[websrvs]    # 也可以在被控主机行添加如下信息 ( 不推荐, 会暴露主机安全 )
10.0.0.7 ansible_connection=ssh ansible_ssh_port=2222 ansible_ssh_user=wang ansible_ssh_password=magedu
10.0.0.6 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_password=123456
# 执行 ansible 命令时显示别名, 如 web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102

# 仅填写主机 IP 地址也可以
[websrvs]
10.0.0.7
10.0.0.17

---   
[websrvs:vars]
ansible_ssh_password=magedu

some_host         ansible_ssh_port=2222    ansible_ssh_user=manager
aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host      ansible_python_interpreter=/usr/local/bin/python
ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

总结:

  • 主机支持主机名通配以及正则表达式,例如 web[1:3].magedu.com 代表三台主机
  • 主机支持基于非标准的 SSH 端口,例如 web1.magedu.com:6666
  • 主机支持指定变量,可对个别主机的特殊配置,如登陆用户,密码
  • 主机组支持指定变量 [group_name:vars],同时支持嵌套组 [game:children]

3.3)Ansible 相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于 man
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具( RHCE 有考该工具的使用 )
  • /usr/bin/ansible-console 基于 Console 界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或 Roles 模块的官网平台

利用 Ansible 实现管理的主要方式:

Ansible Ad-Hoc:即利用 ansible 命令,主要用于临时命令使用场景
Ansible **PlayBook:**主要用于长期规划好的,大型项目的场景,需要有前期的规划过程

ansible 使用前 准备工作( 建议 )

Ansible 相关工具大多数是 通过 SSH 协议,实现对远程主机的配置管理、应用部署、任务执行等功能

建议: 使用此工具前,先配置 ansible 主控端能基于密钥认证的方式联系各个被管理节点

# 解决: 远程被控端主机是, 自动回复 yes 选项
# 第一次远程连接某个主机时, 对方主机会默认询问你是否 xxx, 输入 yes 后, 默认会将远程主机公钥写入本机 known_hosts
1) 修改 SSH 客户端配置文件
vim /etc/ssh/ssh_config
StrictHostKeyChecking no        // "自动回复 yes 选项"

# 验证 known_hosts 文件
cat ~/.ssh/known_hosts

2) 或者, 修改 Ansible 配置文件
vim /etc/ansible/ansible.cfg
host_key_checking = False        // "建议取消该行注释"

// 基于密码认证 ( "不常用" )
# 注意: websrvs 组的所有主机密码 必须都是 redhat
# 如果 websrvs 组的某个主机密码不是 redhat, 则无法连接成功
# 因此推荐使用 Key 认证 !!!
ansible websrvs -m ping -k
SSH password: redhat

范例: 利用 sshpass 批量实现基于 key 验证脚本 1

这个脚本的作用是批量向指定的 IP 地址列表传送 SSH 公钥,并且在执行过程中忽略对远程主机主机密钥的严格检查。

// 修改下面一行 ( 允许连接新的主机时,不需要手动确认密钥 )
[root@centos8 ~] vim /etc/ssh/ssh_config
StrictHostKeyChecking no


[root@centos8 ~] vim push_ssh_key.sh
#!/bin/bash
IPLIST="
192.168.80.8
192.168.80.18
192.168.80.28"
rpm -q sshpass &> /dev/null || yum -y install sshpass  
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P '' export SSHPASS=redhat    # 主机密码
for IP in $IPLIST;do
    {
    sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP 
    }&
done 
wait

范例: 实现基于 key 验证的脚本 2

这段脚本主要用于 在局域网中扫描活动的主机,然后通过 SSH 在这些主机之间传递 SSH 密钥 以便后续相互访问时不需要手动确认密钥

注意: 该脚本会实现主机之间相互免密认证

#!/bin/bash
PASS=redhat        # 主机密码
# 设置网段最后的地址, 4-255 之间, 越小扫描越快
END=254

IP=`ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'`    # 注意网卡名称
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP 

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

# 把 .ssh/known_hosts 拷贝到所有主机, 使它们第一次互相访问时不需要输入回车
for n in ${AliveIP[*]};do
scp /root/.ssh/known_hosts ${n}:.ssh/
done

[root@centos7 ~] bash push_ssh_key.sh

推荐:使用该脚本

< '批量部署多台主机 基于 key 验证脚本' >
[root@ansible ~] vim push_ssh_key.sh
#!/bin/bash
HOSTS="
192.168.80.8
192.168.80.18
192.168.80.28                                                                            
"
PASS=redhat	# 注意: 密码
[ -f /root/.ssh/id_rsa ] ||
ssh-keygen -P ""  -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in $HOSTS;do
        {
            sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i &> /dev/null
        }&
done
wait

Ansible 命令 参数示范

# 列出 Ansible 可控制的所有主机
ansible all --list-hosts

# 列出 Ansible 可控制的 websrvs 组主机
ansible websrvs --list-hosts

// 演示: 通配符
ansible "*" -m ping 

ansible 192.168.80.* -m ping

ansible "192.168.80.8 192.168.80.18" -m ping
# Ping 模块: 测试与目标主机的连通性 ( 注意: 该 Ping 模块并没有走 ICMP 协议 )
# -m 指定模块
# ping 模块
ansible all -m ping

3.3.1)ansible-doc

此工具用来 显示模块的帮助,相当于 man

// 格式
ansible-doc [options] [module...]
-l, --list        // 列出可用模块
-s, --snippet     // 显示指定模块的 playbook 片段

// 查看帮助
[root@ansible ~] ansible-doc --help

image.png

范例:

// 列出所有模块
ansible-doc -l

// 查看指定模块帮助用法 ( 详细说明 )
ansible-doc ping

// 查看指定模块帮助用法 ( 简单说明 )
ansible-doc -s ping
ansible-doc -l | grep ^ping

// "重要"
// 查看模块的 "使用案例"
ansible-doc ping | grep -A 100 EXA
ansible-doc file | grep -A 100 EXA

注意点

ansible-doc file
ansible-doc file | grep ^=


眼尖的小伙伴们可能会发现,上述操作其实可以通过 Linux 的 chown 命令来实现。但为什么我们不直接使用 chown,而要借助 Ansible 的 file 模块呢?这主要是因为 Shell 命令不具备幂等性,而 Ansible 的大部分模块都支持幂等性。这使得使用 Ansible 的 file 模块更加安全可靠。

范例: 查看指定的插件

[root@ansible ~] ansible-doc -t connection -l
[root@ansible ~] ansible-doc -t lookup -l

3.3.2)ansible Ad-Hoc

Ansible 的执行方式的主要工具就是 ansible( 专业名词:Ad-Hoc

用于执行一次性的任务,临时任务。

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

# 特殊案例 ( localhost: 代表本机)
ansible localhost -m ping

# 常规案例 ( websrvs: 主机清单中的分组信息 )
ansible websrvs -m ping

**

选项说明:
ansible ‘oldboy’ -m command -a ‘df -h’ 含义如下图
image.png

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

显示详细过程

ansible websrvs -m ping -v
ansible websrvs -m ping -vv
ansible websrvs -m ping -vvv

案例: 使用 普通用户 身份 提升权限 操作 远程主机

# 先在被控制端 授权普通用户 sudo 权限
[root@centos8 ~] useradd wangj
[root@centos8 ~] echo 123456 | passwd --stdin wangj
[root@centos8 ~] vim /etc/sudoers
wangj    ALL=(ALL) NOPASSWD: ALL

# 以 wangj 普通用户身份连接主机, 并利用 sudo 授权 root 权限执行 whoami 命令
[root@ansible ~] ansible 192.168.80.8 -m shell -a 'whoami' -u wangj -k -b --become-user=root
SSH password:        // 输入远程主机 wangj 用户 ssh 连接密码
10.0.0.8 | CHANGED | rc=0 >>
root

Ansible 的 Host-pattern
用于匹配被控制的主机列表
All:表示所有 Inventory 中的所有主机

ansible all -m ping

*:通配符

ansible "*" -m ping
ansible 192.168.1.* -m ping

或 关系

# websrvs 或 dbsrvs 主机
ansible "websrvs:dbsrvs" -m ping

# 192.168.80.18 或 192.168.80.28 主机
ansible "192.168.80.18:192.168.80.28" -m ping

逻辑 与

// 在 websrvs 组并且在 dbsrvs 组中的主机
ansible "websrvs:&dbsrvs" -m ping

逻辑 非

// 在 websrvs 组, 但不在 dbsrvs 组中的主机
// 注意: 此处为单引号
ansible 'websrvs:!dbsrvs' -m ping

综合 逻辑

ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping

正则 表达式

ansible "websrvs:dbsrvs" -m ping
ansible "~(web|db).*\.magedu\.com" -m ping

举例:

// 重启所有以 "kube" 开头 或 "etcd" 开头, 且不是 10.0.0.101 的主机
// 一般 10.0.0.101 为本机 IP 地址.
[root@kube-master1 ~] ansible 'kube*:etcd:!10.0.0.101' -a reboot && reboot

范例:

[root@centos8 ~] ansible all --list-hosts  
 hosts (3):
    10.0.0.6
    10.0.0.7
    10.0.0.8
    
[root@centos8 ~] ansible websrvs --list-hosts  
 hosts (3):
    10.0.0.6
    10.0.0.7
    10.0.0.8

[root@centos8 ~] ansible appsrvs --list-hosts  
 hosts (2):
    10.0.0.7
    10.0.0.8
    
// 使用 双引号 或者 单引号 都可以                                       
[root@centos8 ~] ansible "appsrvs:dbsrvs" --list-hosts
[root@centos8 ~] ansible 'appsrvs:dbsrvs' --list-hosts  
 hosts (3):
    10.0.0.7
    10.0.0.8
    10.0.0.6
                 
[root@centos8 ~] ansible "dbsrvs" --list-hosts
[root@centos8 ~] ansible 'dbsrvs' --list-hosts  
 hosts (2):
    10.0.0.6
    10.0.0.7
    
[root@centos8 ~] ansible appsrvs --list-hosts  
 hosts (2):
    10.0.0.7
    10.0.0.8
    
[root@centos8 ~] ansible "appsrvs:dbsrvs" --list-hosts  
 hosts (3):
    10.0.0.7
    10.0.0.8
    10.0.0.6
    
[root@centos8 ~] ansible "appsrvs:&dbsrvs" --list-hosts  
 hosts (1):
    10.0.0.7

// 注意: 引用 ! 号时, "不要用双引号"
[root@centos8 ~] ansible "appsrvs:!dbsrvs" --list-hosts  
-bash: !dbsrvs: event not found

// "而使用单引号"
[root@centos8 ~] ansible 'appsrvs:!dbsrvs' --list-hosts  
 hosts (1):
    10.0.0.8

范例:Ansible 执行 并发控制
GIF 录制工具:https://www.cockos.com/licecap/

// 分别执行下面两条命令观察结果
[root@ansible ~] ansible all -a 'sleep 1' -f1    # 单台单台 执行任务
[root@ansible ~] ansible all -a 'sleep 1' -f10   # 一次性 执行任务

Ansible 命令执行过程
参考:https://www.liushuang6296.com/posts/a71433d/

  1. 加载默认配置文件 /etc/ansible/ansible.cfg。
  2. 加载相应的模块,例如 command 模块。
  3. Ansible 生成临时 Python 文件,并传输到远程服务器的 $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY。
  4. 为文件添加执行权限。
  5. 执行文件并返回结果。
  6. 删除临时文件并退出。

// 演示
[root@ansible ~] ansible all -m shell -a 'sleep 100'

// 验证 ( 临时 Python 文件 )
[root@centos8 ~] ll ~/.ansible/tmp/*

Ansible 的执行状态:

[root@centos8 ~] grep -A 14 '\[colors\]' /etc/ansible/ansible.cfg
[colors]
# highlight = white
# verbose = blue
# warn = bright purple
# error = red
# debug = dark gray
# deprecate = purple
# skip = cyan
# unreachable = red
# ok = green
# changed = yellow
# diff_add = green
# diff_remove = red
# diff_lines = cyan

Ansible 执行返回 -> 颜色信息说明:
绿色: 成功执行,没有发生状态改变
黄色: 成功执行,有发生状态改变
红色: 执行失败

Ansible 使用范例

# 以 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

使用示范

// 单台主机 10.0.0.7
ansible 10.0.0.7 -m ping

// websrvs 组
ansible websrvs -m ping

3.3.3)ansible-console

此工具可交互执行命令,支持 tab,ansible 2.0+ 新增
提示符格式:
执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$

常用子命令:

  • 设置并发数:forks n 例如: forks 10
  • 切换组:cd 主机组 例如: cd web
  • 列出当前组主机列表:list
  • 列出所有的内置命令: ? 或 help

范例
ansible-console:可交互式执行 ansible 命令

[01:13:41 root@ansible ~]# ansible-console
Welcome to the ansible console.
Type help or ? to list commands.

root@all (3)[f:5]$ ping
192.168.80.8 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.80.18 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.80.28 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}

root@all (3)[f:5]$ list
192.168.80.8
192.168.80.18
192.168.80.28
root@all (3)[f:5]$ cd websrvs
root@websrvs (2)[f:5]$ list
192.168.80.18
192.168.80.28
root@websrvs (2)[f:5]$ forks 1
root@websrvs (2)[f:1]$ ping
192.168.80.18 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.80.28 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/libexec/platform-python"
    }, 
    "changed": false, 
    "ping": "pong"
}
root@appsrvs (2)[f:5]$ yum name=httpd state=present
root@appsrvs (2)[f:5]$ service name=httpd state=started

3.3.4)ansible-playbook

此工具 用于执行编写好的 PlayBook 任务

范例:

[root@ansible ~] vim hello.yml
---
# hello world yml file
- hosts: websrvs
  remote_user: root
  gather_facts: no
  
  tasks:
    - name: hello world
      command: /usr/bin/wall hello world

[root@ansible ~] ansible-playbook hello.yml

image.png

3.3.5)ansible-vault

此工具可以用于加密解密 yml 文件( RHCE 考试中存在该工具的考题 )

ansible-vault [create|decrypt|edit|encrypt|rekey|view]

范例

ansible-vault encrypt hello.yml     # 加密
ansible-vault decrypt hello.yml     # 解密
ansible-vault view hello.yml        # 查看
ansible-vault edit hello.yml        # 编辑加密文件
ansible-vault rekey hello.yml       # 修改口令
ansible-vault create new.yml        # 创建新文件

3.3.6)ansible-galaxy

Galaxy 是一个免费网站,类似于 GitHub 网站,网站上发布了很多的共享的 Roles 角色。
Ansible 提供了 ansible-galaxy 命令行工具连接 https://galaxy.ansible.com 网站下载相应的 Roles,进行 init (初始化)、search (查询)、install (安装)、 remove (移除)等操作。
image.png

范例:

# 搜索项目
[root@ansible ~] ansible-galaxy search lamp

# 列出所有已安装的 galaxy
ansible-galaxy list

# 安装 galaxy, 默认下载到 ~/.ansible/roles 下
ansible-galaxy install geerlingguy.mysql
ansible-galaxy install geerlingguy.redis

# 删除 galaxy
ansible-galaxy remove geerlingguy.redis

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1498434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat搭建个人博客 实现动静分离

jar包相关 .war&#xff1a;WebApp打包,类zip格式文件,通常包括一个应用的所有资源,比如jsp,html,配置文件等 .jar&#xff1a;EJB类文件的打包压缩类zip格式文件&#xff0c;,包括很多的class文件, 网景公司发明 .rar&#xff1a;资源适配器类打包文件&#xff0c;目前已不常…

6个维度分析实时渲染和Webgl技术异同

在日常交流中&#xff0c;对Webgl技术熟悉的合作伙伴&#xff0c;在初次了解实时渲染技术时&#xff0c;都会问二者之间的异同。目前很多要求B/S架构的项目&#xff0c;很多在用webgl技术路线&#xff0c;而且这个方案在行业里比较普&#xff0c;业主方对这个也比较熟悉&#x…

T01类加载机制

类加载机制 类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时&#xff0c;首先需要通过类加载器把主类加载到JVM public class Math {public static final int initData 666;public static User user new User();public int compute() {int a 1;int b …

泛型 --java学习笔记

什么是泛型 定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型 可以理解为扑克牌中的癞子&#xff0c;给它什么类型它就是什么类型 如…

1.BOM-获取元素(获取元素、修改属性)

web Api基本认知 作用&#xff1a;通过JS去操作html页面和浏览器(实现浏览器中的某些功能) 分类&#xff1a; DOM(网页)&#xff1a;Document Object Model(文档对象模型) BOM(浏览器)&#xff1a;Borwser Object Model(浏览器对象模型) DOM DOM树 将网页中标签的关系以树状…

Java定时调度:Timer类和TimerTask类

Java提供了多种方式来执行定时任务&#xff0c;其中使用Timer类和TimerTask类是一种简单而有效的方法。这篇教程将介绍如何使用Java的Timer类和TimerTask类来实现定时调度。 1. Timer类 Timer类用于安排指定的任务按指定的时间执行。它可以执行一次性任务&#xff0c;也可以按…

详解事件循环机制

浏览器最主要的进程 &#xff1a; 渲染主线程 如何理解JS的异步 任务没有优先级&#xff0c;但消息队列有优先级 阐述一下JS的事件循环

25考研资料PDF汇总

资料V馊public号ZL研知己 V馊public号ZL研知己 25考研资料PDF汇总

008-跨域

跨域 什么是跨域&#xff1f;非同源限制跨域解决方案CORSJSONP服务器进行第三方代理webscoketwindow.postMessage 什么是跨域&#xff1f; 同源策略&#xff1a;协议相同、域名相同、端口号相同 的两个页面被认为是同源。 由一个页面的 js 访问不同源的页面内容&#xff0c;被…

电磁兼容EMC:单、双面板的均匀传输线

目录 1 传输线 2 均匀传输线 3 特征阻抗 4 应用案例 为何要讲单、双面板的均匀传输线&#xff1f;因为均匀传输线能保证信号质量&#xff0c;减少EMC问题&#xff0c;而单双面板没有完整的地和电源平面&#xff0c;很难实现均匀传输线的布线&#xff0c;所以更需要知道如何在…

Java_排序

文章目录 一、排序的概念二、常见的排序算法三、常见排序算法的实现1.插入排序1、基本思想2、直接插入排序3、希尔排序&#xff08;缩小增量排序&#xff09; 2.选择排序1、基本思想2、直接选择排序2、堆排序 3.交换排序1、冒泡排序2、快速排序3、快速排序优化4、快速排序非递归…

day2:keil5基础2

思维导图 使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。2.总结DMA空闲中断接收数据的使用方法 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf(&q…

Stable Diffusion 模型分享:DucHaiten-AIart-SDXL(动漫、3D、逼真)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 这是一个丰富多彩的 SDXL 模型&#xff0c;可以绘制动漫、3D、科幻、真实等类型的图片。 …

第 5 章 ROS常用组件动态坐标变换(自学二刷笔记)

5.1.3 动态坐标变换 所谓动态坐标变换&#xff0c;是指两个坐标系之间的相对位置是变化的。 需求描述: 启动 turtlesim_node&#xff0c;该节点中窗体有一个世界坐标系(左下角为坐标系原点)&#xff0c;乌龟是另一个坐标系&#xff0c;键盘控制乌龟运动&#xff0c;将两个坐…

请说明Vue中的异步组件加载

Vue中的异步组件加载是指当页面需要渲染某个组件时&#xff0c;可以在需要时再去加载这个组件&#xff0c;而不是在页面初始化的时候就将所有组件一次性加载进来。这种方式能够有效降低页面的初始加载时间&#xff0c;提升用户体验。 在Vue中&#xff0c;我们可以使用import函…

idea Gradle 控制台中文乱码

如下图所示&#xff0c;idea 中的 Gradle 控制台中文乱码&#xff1a; 解决方法&#xff0c;如下图所示&#xff1a; 注意&#xff1a;如果你的 idea 使用 crack 等方式破解了&#xff0c;那么你可能需要在文件 crack-2023\jetbra\vmoptions\idea.vmoptions 中进行配置&#xf…

每日五道java面试题之springMVC篇(一)

目录&#xff1a; 第一题. 什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f;第二题. Spring MVC的优点第三题. Spring MVC的主要组件&#xff1f;第四题. 什么是DispatcherServlet?第五题. 什么是Spring MVC框架的控制器&#xff1f; 第一题. 什么是S…

基于51单片机的车辆出入光电传感管理系统设计

目 录 摘 要 I Abstract II 引 言 1 第1章 系统总体方案设计 3 1.1 整体方案设计 3 1.1.1 控制系统的选择 3 1.1.2 系统框图 4 1.2 最小系统模块 4 1.2.1 STC89C51简介 4 1.2.2 最小系统电路 6 第2章 系统硬件设计 8 2.1 单片机的选择 8 2.2 显示方案的选择 8 2.3 红外检测模块…

VisionPro 判断圆是不是无限接近圆或存在缺陷

项目上可能需要判断圆是否是无限接近圆或者判断圆边缘是否存在缺陷等。 第一种方法&#xff1a;找圆工具和点到点的距离计算圆边缘上的点到圆心距离的最大值和最小值的差值。 #region namespace imports using System; using System.Collections; using System.Drawing; usin…

【论文精读】大语言模型融合知识图谱的问答系统研究

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…