运维Linux之Ansible详解学习(更新中)

news2025/7/27 17:52:40

什么是Ansible

Ansible 是一款新出现的自动化运维工具,基于 Python 开发。以下是对它的详细介绍:

  • 功能特点:集合了众多运维工具的优点,能实现批量系统配置、批量程序部署、批量运行命令等功能。它是基于模块工作的,本身没有批量部署能力,而是提供一种框架,真正具有批量部署能力的是其运行的模块。
  • 工作原理:通过 SSH 或 Windows 远程管理机制建立临时远程连接,控制节点在大多数安装了 Python 的类 Unix 系统上执行,包括安装了 WSL 的 Windows 系统。系统配置部分通过其自己的声明式语言定义。
  • 主要组件
    • 连接插件:负责和被监控端实现通信。
    • host inventory:指定操作的主机,是一个配置文件,里面定义了监控的主机。
    • 各种模块:包括核心模块、command 模块、自定义模块等。
    • 插件:借助于插件完成记录日志邮件等功能。
    • playbook:剧本,执行多个任务时可让节点一次性运行多个任务,非必需。
  • 设计目标:本质上为最小、一致性、安全和可靠的。如果小心撰写程序,Ansible playbook 脚本文件可以是幂等的,以防止对受控系统产生意外的副作用。Playbook 使用基于 YAML 和 Jinja 模板的简单叙述性语言,仅需要最少的学习。
  • 平台支持:控制机器必须是 Linux/Unix 主机,并且需要 Python 2.7 或 3.5。托管节点(如果是类 Unix)必须具有 Python 2.4 或更高版本。从 1.7 版本开始,Ansible 也可以管理 Windows 节点,使用 WS - Management 协议支持的本机 PowerShell 远程处理,而不是 SSH。Ansible 可以部署到裸机主机、虚拟机和云环境。
官网文档地址:

https://docs.ansible.com/ansible/latest/

配置文件


rpm -qc ansible-core
在没下载之前查询不到,q是query(查询),c是configfile(配置文件)

/etc/ansible/ansible.cfg # 主配置文件
/etc/ansible/hosts # 主机清单文件

概念

主机清单

官方文档:

https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.
html
主机清单(Inventory)是 Ansible 中用于管理目标主机的配置文件。它是一个文本文件,其
中列出了要在其上执行 Ansible 任务的远程主机。
主机清单可以包含 IP 地址、域名或主机别名等信息,并且可以将主机分组以便更好地组织和
管理。主要清单文件默认位于 /etc/ansible/hosts 文件中,但也可以使用 -i 参数指定其
他位置的清单文件。
例如,下面定义了一个清单文件示例:
[web-servers]
webserver1.example.com
webserver2.example.com
[database-servers]
dbserver1.example.com
dbserver2.example.com

连接插件

官方文档:

https://docs.ansible.com/ansible/latest/plugins/connection.html
连接插件(Connection Plugins)是 Ansible 中的组件,用建立与远程主机的连接。Ansible
支持多种连接插件,包括 SSH、WinRM 等。连接插件的选择取决于目标主机的操作系统和
配置。 通过连接插件,Ansible 可以与目标主机进行通信,并在其上执行任务。在主机清单中,可以通过在主机名后连接插件名称来指定连接插件。如果不指定,默认使用 SSH 连接插件。
以下是示例:
[web-servers]
webserver1.example.com ansible_connection=ssh
webserver2.example.com ansible_connection=ssh
[database-servers]
dbserver1.example.com ansible_connection=ssh
dbserver2.example.com ansible_connection=winrm

模块

模块(Modules)是 Ansible 的核心组件,用于在远程主机上执行任务。
Ansible 提供了丰富的内置模块,涵盖了各种任务,如文件操作、软件包管理、服务管理、用
户管理等。还能通过在剧本中调用模块,可以实现自动化任务的执行。
常用模块有:
ping:检测远程主机的连通性。
command/shel:在目标主机上执行命令或命令字符串。
copy:将文件从控制节点复制到远程主机。
file:创建、修改或删除文件和目录。
template:使用 jinja2 模板生成文件,并将其复制到远程主机。
apt/yum:在基于 Debian/RedHat 的系统上安装、升级或移除软件包。
service:启动、停止、重新启动或重载系统服务。
user/group:创建、修改或删除用户和用户组。
lineinfile:在文中添加、修改或删除一行文本。
raw:在目标主机上执行原始命令,绕过模块系统。
wait_for:等待一定时间或直到某个条件为真。
script:在在目标主机上执行本地脚本。
git:克隆或更新 Git 代码库。
debug:打印调试信息。

Playbook

Ansible Playbook(剧本)是 Ansible 的核心组件之一,是一种以 YAML 格式编写的自动化
任务描述文件。
每个 Playbook 由一个或多个 Play 组成。在每个 Play 下面,通过 tasks 关键字来定义一组
任务。每个任务由一个或多个模块组成,用于在远程主机上实现自动化部署、配置和管理等操
作。
下面示例演示了一个简单的Playbook:
- name: Install and start Nginx #描述 Playbook 或任务的简短名称
hosts: web_servers #指定要执行任务的目标主机或主机组
become: yes #可选参数,用于指定是否以管理员权限执行任务及执行任务的用户。
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
playbook基本格式及用法:
一、Playbook 基础结构

Playbook 由一个或多个 Play(剧本) 组成,每个 Play 定义了一组 主机 和 任务。基本框架如下:

 
---  # YAML 文件起始标记(必须存在)
- name: <Play 的名称>  # 描述性名称(建议明确任务目的,如 "Install Nginx")
  hosts: <主机或主机组>  # 目标主机(必填)
  gather_facts: <是否收集主机信息>  # 可选(默认值为 yes)
  become: <是否提权>  # 可选(默认值为 no)
  vars:  # 定义变量(可选)
    - var1: value1
    - var2: value2
  tasks:  # 任务列表(必填)
    - name: <任务名称>  # 描述性名称(建议明确操作,如 "Install nginx package")
      <模块名>:  # 模块名称(如 yum、apt、copy 等)
        <参数1>: value1  # 模块参数
        <参数2>: value2
      when: <条件判断>  # 条件执行(可选)
      tags: <标签>  # 标记任务(可选,用于选择性执行)
      register: <变量名>  # 注册任务结果到变量(可选)
  handlers:  # 处理程序(可选,用于响应 notify 事件)
    - name: <处理程序名称>
      <模块名>:  # 通常用于重启服务等操作
        <参数>: value
  roles:  # 引入角色(可选,用于模块化管理)
    - <角色名称>
二、关键组成部分详解

1. Play 级别参数

参数说明示例
namePlay 的描述性名称(建议清晰易懂,便于调试)name: "Configure Web Servers"
hosts目标主机或主机组(必填),支持清单中的组名、正则表达式或动态主机hosts: webservers
hosts: 'node[1:3]'
hosts: all:!db
gather_facts是否收集目标主机的系统信息(如 IP、内核版本等),值为 yes 或 nogather_facts: no (适用于无需系统信息的轻量级任务)
become是否提权(如切换为 root 用户),值为 yes 或 nobecome: yes
become_user: root (指定提权用户)
vars定义 Play 内的变量(优先级高于清单变量)vars: <br> - port: 8080 <br> - user: admin
remote_user指定连接远程主机的用户(默认取清单中的 ansible_userremote_user: ubuntu

2. tasks 任务列表

任务是 Playbook 的核心,每个任务调用一个 Ansible 模块完成具体操作。

 
  • 模块类型
    • 核心模块:如 ping(测试连通性)、yum/apt(包管理)、service(服务管理)、copy(文件复制)等。
    • 扩展模块:如 git(代码拉取)、mysql_user(数据库用户管理)等。
  • 关键参数
    参数说明示例
    name任务的描述性名称(必填,建议明确操作内容,如 "Create directory")name: "Create data directory"
    module模块名称(必填,如 fileshelltemplate 等)file: path=/data state=directory mode=0755
    when条件判断(可选,支持 Jinja2 表达式)when: ansible_os_family == 'Debian'
    tags标记任务(可选,用于通过 --tags 或 --skip-tags 选择性执行)tags: [install, web]
    register注册任务结果到变量(可选,用于后续任务引用)register: result <br> debug: var=result.stdout

3. handlers 处理程序

处理程序是被动触发的任务,通常用于重启服务、重载配置等操作,需配合 notify 触发。

 
tasks:
  - name: Update config file
    copy: src=nginx.conf dest=/etc/nginx/nginx.conf
    notify: Restart Nginx  # 触发名为 "Restart Nginx" 的处理程序

handlers:
  - name: Restart Nginx  # 处理程序名称需与 notify 一致
    service: name=nginx state=restarted

4. roles 角色

角色用于将 Playbook 拆分为模块化组件,提升复用性。

 
roles:
  - role: common  # 引用 roles/common 目录下的角色
    var1: value1  # 传递参数给角色
  - role: webserver
    port: 8080
三、Playbook 示例

以下是一个完整的 Playbook 示例,用于在 Debian 系统上安装 Nginx 并启动服务:

 
---
- name: Install and configure Nginx
  hosts: webservers
  gather_facts: yes
  become: yes
  vars:
    nginx_pkg: nginx
    nginx_port: 80

  tasks:
    - name: Ensure Nginx is installed
      apt:
        name: "{{ nginx_pkg }}"
        state: present
      when: ansible_os_family == 'Debian'

    - name: Copy Nginx config
      copy:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Reload Nginx

    - name: Ensure Nginx is running
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Reload Nginx
      service:
        name: nginx
        state: reloaded
四、最佳实践
  1. 命名规范
    • Play 和任务名称应清晰描述操作(如 Install Docker Engine 而非 Task 1)。
  2. 变量管理
    • 复杂变量可通过 vars_files 引入外部 YAML 文件,避免 Playbook 臃肿。
  3. 条件判断
    • 使用 when 区分不同系统或环境(如 ansible_distribution == 'CentOS')。
  4. 错误处理
    • 添加 ignore_errors: yes 忽略非关键错误,或 failed_when: condition 自定义失败条件。
  5. 测试与调试
    • 使用 --syntax-check 验证语法,-C(--check)模式试运行,-vvv 查看详细日志。
五、执行 Playbook
ansible-playbook -i inventory/hosts site.yml  # 标准执行
ansible-playbook -i inventory/hosts site.yml --tags="install"  # 仅执行标记为 install 的任务
ansible-playbook -i inventory/hosts site.yml --limit=webservers  # 仅对 webservers 组执行
 

通过以上结构和规范,可高效编写可维护、易扩展的自动化任务脚本。

安装

安装方法

Ansible 提供了多种安装方式,适应不同的操作系统和需求。以下是常见的安装方法:
1.通过包管理器安装
在 Ubuntu/Debian 上安装
[root@ansible-controller ~]# apt install ansible -y
在 CentOS/RHEL 上安装
[root@ansible-controller ~]# dnf install ansible -y
在 RockyLinux9上安装
[root@ansible-controller ~]# dnf install ansible-core -y
查看版本信息:
[root@ansible-controller ~]# ansible --version
2.通过pip安装
安装 Python 和 pip(如果尚未安装):
在 Ubuntu/Debian:
[root@ansible-controller ~]# apt install python3 python3-pip -y
在 CentOS/RHEL:
[root@ansible-controller ~]# sudo yum install python3 python3-pip -y
一般自带
[root@free ~]# python
Python 3.9.18 (main, Sep  7 2023, 00:00:00) 
[GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 


>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit

quit()也行

使用pip安装:

[root@ansible-controller ~]# pip3 install ansible
3.阿里云镜像下载eple辅助安装

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区阿里巴巴开源镜像站,免费提供Linux镜像下载服务,拥有Ubuntu、CentOS、Deepin、MongoDB、Apache、Maven、Composer等多种开源软件镜像源,此外还提供域名解析DNS、网络授时NTP等服务,致力于为互联网用户提供全面,高效和稳定的基础服务。https://developer.aliyun.com/mirror/eple中选择对应版本。

https://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpmhttps://mirrors.aliyun.com/epel/epel-release-latest-9.noarch.rpm

1. 什么是 EPEL?
全称:Extra Packages for Enterprise Linux(企业 Linux 额外软件包)
作用:由 Fedora 社区维护的第三方开源软件仓库,为 RHEL、CentOS、Rocky Linux 等系统提供大量 非官方默认源 的软件包(如开发工具、系统工具、库文件等)。
优势:补充官方源中缺失的软件,版本更新相对及时,方便用户快速安装常用工具。
2. epel-release 软件包的作用
功能:这个软件包是 EPEL 源的 安装器和配置文件,用于自动配置系统的软件源信息(如 /etc/yum.repos.d/epel.repo 或 /etc/dnf.repos.d/epel.repo)。
安装后效果:
启用 EPEL 源,允许使用 yum 或 dnf 命令直接安装 EPEL 中的软件包。
包含 GPG 密钥,确保软件包的完整性和安全性。




验证 EPEL 源是否启用
# 列出所有已启用的源
dnf repolist enabled

# 输出应包含类似内容:
# epel                Extra Packages for Enterprise Linux 9 - x86_64
三、使用 EPEL 源安装软件包
安装方式与官方源完全相同,直接使用 dnf 或 yum 命令:
# 示例:安装 htop(系统监控工具,官方源可能没有)
dnf install htop -y

# 示例:安装 ansible(自动化运维工具)
dnf install ansible -y

# 搜索 EPEL 源中的软件包
dnf search <关键词>
四、EPEL 源的配置与管理
1. 临时禁用 / 启用 EPEL 源
# 禁用 EPEL 源(本次命令生效)
dnf --disablerepo=epel install <软件包>

# 仅从 EPEL 源安装(忽略其他源)
dnf --enablerepo=epel install <软件包>
2. 永久禁用 EPEL 源
编辑配置文件,将 enabled=1 改为 enabled=0:
vi /etc/yum.repos.d/epel.repo

# 修改为:
[epel]
name=Extra Packages for Enterprise Linux 9 - $basearch
#baseurl=https://download.fedoraproject.org/pub/epel/9/$basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-9&arch=$basearch
enabled=0  # 禁用 EPEL 源
gpgcheck=1
...

免密配置

这个是之前的内容(ssh服务)

准备主机

控制节点是运行 Ansible 的主机 ,负责发送任务并收集结果。 被控节点是被 Ansible 管理的
主机,无需安装任何额外软件 ,仅需确保 SSH 服务正常运行,并具备必要的访问权限。

生成密钥对

[root@ansible-controller ~]# ssh-keygen -t rsa (三次回车,不输入其他信息)
复制本机公钥到其它被控节点
# 执行命令后,输入正确密码即可
ssh-copy-id root@192.168.72.64
ssh-copy-id root@192.168.72.65
配置好后测试连接:
# 如果免密做成功则无需密码即可登录
ssh root@192.168.72.64
ssh root@192.168.72.65

注意

ssh-copy-id 命令格式有两种:
1. ssh-copy-id 远端用户@远端IP 或 仅IP
2. ssh-copy-id -i /root/.ssh/id_rsa.pub 远端用户@远端IP 或 仅IP
3. 如果在生成密钥时指定了密钥的名称,此处需要通过 ssh-copy-id -i 指定的名称 远程
用户@远端IP 或仅IP
远程登录无需密码就成功了

主机清单

官方文档

https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.
html
清单(Inventory)定义 Ansible 将要管理的一批主机。 这些主机也可以分配到组中,以进
行集中管理。组可以包含子组,主机也可以是多个组的成员。清单还可以设置应用到它所定义
的主机和组的变量。
可以通过静态和动态两种方式定义主机清单。这里主要讲解静态的主机清单,静态主机清单是
一个文本文件。

基本语法

[组名] :定义一组主机。
主机名 :每行定义一个主机,主机可以是 IP 或域名。
变量 :可以通过 key=value 的形式为主机或组添加变量。

清单内容可写位置

1. 默认全局清单文件

可以直接写在 Ansible 默认的全局清单文件 /etc/ansible/hosts 里 ,使用时直接执行 Ansible 命令,无需额外指定清单文件路径。不过要注意,直接修改该文件可能影响全局配置,操作前最好备份。

2. 自定义清单文件

后缀名:ini,yaml,yml

创建一个新的文本文件,比如 my_inventory.ini ,将清单内容写入其中。后续使用 Ansible 命令时,通过 -i 参数指定这个文件路径,例如 ansible -i my_inventory.ini server -m ping 。这种方式适合不同项目或环境分开管理清单,方便维护。

3. 清单目录(高级用法)

如果有多个环境(开发、测试、生产等)或更复杂的清单管理需求,可以创建一个清单目录,比如 my_inventory_dir ,在目录内创建不同环境的子目录(如 devprod ) ,把清单文件放在对应的子目录中,使用时指定目录路径,如 ansible -i my_inventory_dir/dev server -m ping 。

配置示例

基本清单
[server]
192.168.72.64
192.168.72.65
[db]
db1.example.com
db2.example.com

如果ip是连续的,还可以简写
[server]
192.168.72.[64:65]
[db]
db1.example.com
db2.example.com


1. 分组定义
[server] 和 [db] 是两个主机组(Group),用于将功能相似的主机归类。
组名可以自定义,通常根据主机角色(如 web、db)或环境(如 dev、prod)命名。
2. 主机列表
[server] 组:包含两个 IP 地址的主机:
192.168.72.64
192.168.72.65


[db] 组:包含两个域名的主机:
db1.example.com
db2.example.com

二、Ansible 如何使用这个清单?
当执行 Ansible 命令时,可以通过组名选择目标主机:
# 对 [server] 组中的所有主机执行 ping 模块
ansible server -m ping

# 对 [db] 组中的所有主机执行 shell 命令
ansible db -a "df -h"

测试:

[root@ansiblecontroller ~]# ansible -i my_inventory.yml server  -m ping
192.168.153.137 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.153.136 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
这里使用的是135,136,137的主机



-i 指定路径

server  根据清单指定主机组   也可以是具体ip,域名
特殊标识符:
all 或 *:表示清单中的所有主机。
多组组合:如 server:db(同时选择 server 和 db 组)。

-m  指定模块




其他常用参数(可选)
1. -u username
指定 SSH 连接的用户名。
bash
-u root  # 以 root 用户连接

2. -k
提示输入 SSH 密码(适用于密码认证,非密钥认证)。
bash
-k  # 执行后会提示输入密码

3. -K
提示输入 sudo 密码(用于需要管理员权限的操作)。
bash
-K  # 执行后会提示输入 sudo 密码


4. -vvv
开启详细模式(-v 越多,输出越详细),用于调试。
bash
-vvv  # 显示 SSH 连接过程、模块执行细节等


5. -a "参数"
传递模块的参数(仅对部分模块需要)。
bash
-m command -a "ls -l"  # 执行 ls -l 命令
-m copy -a "src=file.txt dest=/tmp/"  # 复制文件


主机级变量
[server]
192.168.72.64 ansible_user=root ansible_port=22
192.168.72.65 ansible_user=root
[db]
db1.example.com ansible_host=192.168.72.100
db2.example.com ansible_host=192.168.72.101 ansible_user=postgres

配置好后测试同上

优先级:

如果同一参数在多个地方定义,优先级从高到低为:
命令行参数(如 -u root)。
清单文件中的主机变量(如 192.168.1.1 ansible_user=root)。
清单文件中的组变量(如 [web_servers:vars] ansible_user=deploy)。
ansible.cfg 中的全局配置。
为什么需要这些参数?
场景 1:多用户环境

假设你有:

  • 生产服务器:只能用 root 用户 SSH 登录。
  • 开发服务器:使用 devops 用户 + 密钥认证。
    清单可配置为:
 
[prod_servers]
192.168.1.1 ansible_user=root

[dev_servers]
192.168.1.10 ansible_user=devops
场景 2:非标准 SSH 端口

某服务器为安全起见,将 SSH 端口改为 5000:

[secure_servers]
192.168.1.20 ansible_port=5000
场景 3:内网域名与 IP 映射

公司内网有域名 db-prod,但未配置 DNS,实际 IP 为 10.0.0.5

[databases]
db-prod ansible_host=10.0.0.5
主机变量示例:
主机变量是定义一个 host_vars 目录,然后在目录中定义 主机名 .yml ,在这个文件中定义
相关的变量。
示例:

inventory/            # 清单目录
├── hosts             # 主清单文件(INI 或 YAML 格式)
├── group_vars/       # 组变量目录
│   └── web.yml       # 名为 web 的组的变量文件
└── host_vars/        # 主机变量目录
    ├── test1.yml     # 主机 test1 的变量文件
    └── test2.yml     # 主机 test2 的变量文件


变量文件内容示例
1. inventory/hosts(主清单文件)
[web]                  # 定义名为 web 的主机组
test1 ansible_host=192.168.1.10
test2 ansible_host=192.168.1.11

2. inventory/host_vars/test1.yml(主机 test1 的变量)
http_port: 8080       # test1 的 HTTP 端口为 8080
app_env: development  # test1 的应用环境为开发环境

3. inventory/group_vars/web.yml(web 组的公共变量)
http_port: 443        # web 组默认使用 443 端口
ssl_enabled: true     # 启用 SSL

变量优先级与覆盖规则
Ansible 变量的优先级(从高到低):
命令行参数(如 -e "http_port=80")
主机变量(host_vars/test1.yml)
组变量(group_vars/web.yml)
角色默认变量(roles/<role>/defaults/main.yml)

示例覆盖逻辑:
test1 的 http_port 为 8080(主机变量覆盖组变量)。
test2 的 http_port 为 443(继承组变量)。

你可以验证什么?
当你执行命令 ansible web -m ping 时:
验证主机连通性:检查 test1 和 test2 是否可通过 SSH 访问。
验证变量加载:通过 debug 模块查看变量是否正确加载:
ansible web -m debug -a "var=http_port"

输出应为:
yaml
test1 | SUCCESS => {
    "http_port": 8080
}
test2 | SUCCESS => {
    "http_port": 443
}
组级别变量
官方文档
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_varia
bles.html
组变量使用 [ 组名 :vars] 定义:
[server]
192.168.72.64
192.168.72.65
[db]
db1.example.com
db2.example.com
[server:vars]
ansible_user=root
ansible_port=22
[db:vars]
ansible_user=postgres

配置好后可尝试用ping模块测试同上

示例:
组变量还可以在 hosts 中定义的组公共变量放到一个专门的文件中这个文件名是以组名定
义,而文件夹名称则为 group_vars。结构如下:
invertory
├─ hosts
├─ main.yml
├─ group_vars
│ └─ server.yml

main.yml:
---
- name: test variable
  hosts: server  # 目标主机组(需与清单文件中的组名匹配)
  gather_facts: no  # 不收集主机信息(加快执行速度)
  tasks:
    - name: test vars
      debug:
        msg: "ansible_port = {{ ansible_port }}, ansible_user = {{ ansible_user }}"


hosts:
[server]
192.168.72.[136:137]

server.yml:
ansible_port: 22
ansible_user: root
ansile_password: '123456'

测试:
1.测试playbook
[root@ansiblecontroller ~]# ansible-playbook -i invetory/hosts.yml invetory/main.yml 

PLAY [test variable] *******************************************************************************************************************************

TASK [test vars] ***********************************************************************************************************************************
ok: [192.168.153.136] => {
    "msg": "ansible_port = 22, ansible_user = root"
}
ok: [192.168.153.137] => {
    "msg": "ansible_port = 22, ansible_user = root"
}

PLAY RECAP *****************************************************************************************************************************************
192.168.153.136            : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.153.137            : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 
2.测试连通性
[root@ansiblecontroller ~]# ansible -i invetory/hosts.yml all -m ping
192.168.153.136 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
192.168.153.137 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}



main.yml
Playbook 分析
yaml
---
- name: test variable
  hosts: server  # 目标主机组(需与清单文件中的组名匹配)
  gather_facts: no  # 不收集主机信息(加快执行速度)
  tasks:
    - name: test vars
      debug:
        msg: "ansible_port = {{ ansible_port }}, ansible_user = {{ ansible_user }}"

这个 Playbook 的作用是:
针对 server 组的所有主机。
打印每个主机的 ansible_port 和 ansible_user 变量值。

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

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

相关文章

深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核

第三篇&#xff1a;Verilog实现I2C Master核 副标题 &#xff1a;从零构建工业级I2C控制器——代码逐行解析与仿真实战 1. 架构设计 1.1 模块分层设计 三层架构 &#xff1a; 层级功能描述关键信号PHY层物理信号驱动与采样sda_oe, scl_oe控制层协议状态机与数据流控制state…

ARM笔记-嵌入式系统基础

第一章 嵌入式系统基础 1.1嵌入式系统简介 1.1.1嵌入式系统定义 嵌入式系统定义&#xff1a; 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可剪裁&#xff0c;对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统 ------Any devic…

upload-labs通关笔记-第19关文件上传之条件竞争

系列目录 upload-labs通关笔记-第1关 文件上传之前端绕过&#xff08;3种渗透方法&#xff09; upload-labs通关笔记-第2关 文件上传之MIME绕过-CSDN博客 upload-labs通关笔记-第3关 文件上传之黑名单绕过-CSDN博客 upload-labs通关笔记-第4关 文件上传之.htacess绕过-CSDN…

第5章:任务间通信机制(IPC)全解析

💬 在多线程开发中,线程之间如何协作?如何让一个线程产生数据,另一个线程消费数据?本章聚焦 Zephyr 提供的多种任务间通信机制(IPC)及实战使用技巧。 📚 本章导读 你将学到: Zephyr 提供的常用 IPC 接口:FIFO、消息队列、邮箱、信号量 每种机制适用场景和用法对比…

CAPL自动化-诊断Demo工程

文章目录 前言一、诊断控制面板二、诊断定义三、发送诊断通过类.方法的方式req.SetParameterdiagSetParameter四、SendRequestAndWaitForResponse前言 本文将介绍CANoe的诊断自动化测试,工程可以从CANoe的 Sample Configruration 界面打开,也可以参考下面的路径中打开(以实…

SVN被锁定解决svn is already locked

今天遇到一个问题&#xff0c;svn 在提交代码的时候出现了svn is already locked&#xff0c;解决方案

【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则

一、感知机 对于分类问题&#xff0c;我们设定一个映射&#xff0c;将x通过函数f(x)映射到y 1. 感知机的基本结构 感知机&#xff08;Perceptron&#xff09;是最早期的神经网络模型&#xff0c;由 Rosenblatt 在 1958 年提出&#xff0c;是现代神经网络和深度学习模型的雏形…

云原生安全:网络协议TCP详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 &#xff08;注&#xff1a;文末附可视化流程图与专有名词说明表&#xff09; 1. 基础概念 TCP&#xff08;Transmission Control Protocol&#xff09;是…

使用CentOS部署本地DeekSeek

一、查看服务器的操作系统版本 cat /etc/centos-release二、下载并安装ollama 1、ollama下载地址&#xff1a; Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

LLMs之Qwen:《Qwen3 Technical Report》翻译与解读

LLMs之Qwen&#xff1a;《Qwen3 Technical Report》翻译与解读 导读&#xff1a;Qwen3是Qwen系列最新的大型语言模型&#xff0c;它通过集成思考和非思考模式、引入思考调度机制、扩展多语言支持以及采用强到弱的知识等创新技术&#xff0c;在性能、效率和多语言能力方面都取得…

从工程实践角度分析H.264与H.265的技术差异

作为音视频从业者&#xff0c;我们时刻关注着视频编解码技术的最新发展。RTMP推流、轻量级RTSP服务、RTMP播放、RTSP播放等模块是大牛直播SDK的核心功能&#xff0c;在这些模块的实现过程中&#xff0c;H.264和H.265两种视频编码格式的应用实践差异是我们技术团队不断深入思考的…

如何设计一个高性能的短链设计

1.什么是短链 短链接&#xff08;Short URL&#xff09; 是通过算法将长 URL 压缩成简短字符串的技术方案。例如将 https://flowus.cn/veal/share/3306b991-e1e3-4c92-9105-95abf086ae4e 缩短为 https://sourl.cn/aY95qu&#xff0c;用户点击短链时会自动重定向到原始长链接。其…

提升工作效率的可视化笔记应用程序

StickyNotes桌面便签软件介绍 StickyNotes是一款极为简洁的桌面便签应用程序&#xff0c;让您能够快速记录想法、待办事项或其他重要信息。这款工具操作极其直观&#xff0c;只需输入文字内容&#xff0c;选择合适的字体大小和颜色&#xff0c;然后点击添加按钮即可创建个性化…

11|省下钱买显卡,如何利用开源模型节约成本?

不知道课程上到这里&#xff0c;你账户里免费的5美元的额度还剩下多少了&#xff1f;如果你尝试着完成我给的几个数据集里的思考题&#xff0c;相信这个额度应该是不太够用的。而ChatCompletion的接口&#xff0c;又需要传入大量的上下文信息&#xff0c;实际消耗的Token数量其…

机器学习圣经PRML作者Bishop20年后新作中文版出版!

机器学习圣经PRML作者Bishop20年后新书《深度学习&#xff1a;基础与概念》出版。作者克里斯托弗M. 毕晓普&#xff08;Christopher M. Bishop&#xff09;微软公司技术研究员、微软研究 院 科学智 能 中 心&#xff08;Microsoft Research AI4Science&#xff09;负责人。剑桥…

吴恩达机器学习笔记:逻辑回归3

3.判定边界 现在说下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。 在逻辑回归中&#xff0c;我们预测&#xff1a; 当ℎθ (x) > 0.5时&#xff0c;预测 y 1。 当ℎθ (x) < 0.5时&#xff0c;预测 y 0 。 根据…

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel&#xff0c;第一个最大的原因&#xff0c;就是图方便&#xff0c;比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …

Java 中的 super 关键字

个人总结&#xff1a; 1.子类构造方法中没有显式使用super&#xff0c;Java 也会默认调用父类的无参构造方法 2.当父类中没有无参构造方法&#xff0c;只有有参构造方法时&#xff0c;子类构造方法就必须显式地使用super来调用父类的有参构造方法。 3.如果父类没有定义任何构造…

PCM音频数据的编解码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a…

Ubuntu 通过指令远程命令行配置WiFi连接

前提设备已经安装了无线网卡。 1、先通过命令行 ssh 登录机器。 2、搜索wifi设备&#xff0c;指令如下&#xff1a; sudo nmcli device wifi 3、输入需要联接的 wifi 名称和对应的wifi密码&#xff0c;指令如下&#xff1a; sudo nmcli device wifi connect wifi名称 passw…