Ansbile-变量

文章目录

  • 零、Ansible的事实变量和内置变量?
      • Ansible 的内置变量
      • Ansible 的事实变量
      • 示例
  • 一、Ansible的事实变量有哪些(不全)
    • 1. ansible_hostname
    • 2. ansible_fqdn
    • 3. ansible_os_family
    • 4. ansible_distribution
    • 5. ansible_version
    • 6. ansible_all_ipv4_addresses和ansible_all_ipv6_addresses
    • 7. ansible_memory_mb
    • 8. ansible_processor
    • 9. hostvars
    • 10. group_names
    • 11. inventory_hostname
    • inventory_hostname与ansible_hostname的区别
    • 12. inventory_hostname_short
    • 13. ansible_env
    • 14. ansible_env.USER
    • 15. ansible_python_version
    • 16. ansible_distribution_version
    • 17. ansible_service_mgr
    • 18. ansible_devices
    • 19. ansible_local
    • 20. ansible_managed
    • 21. ansible_connection
    • 22. ansible_ethX
    • 23. ansible_processor_cores
    • 24. ansible_mounts
    • 25. ansible_kernel
    • 26. ansible_distribution_release
    • 27. ansible_lsb
    • 28. ansible_bios
    • 29. ansible_virtual
    • 30. ansible_libraries
    • 31. ansible_python_interpreter
    • 32. ansible_pkg_mgr
  • 二、Ansible的变量的使用
    • 在主机清单文件中定义变量(不推荐)
    • 在bash运行命令时定义变量(不推荐)
    • 在剧本中定义变量(不推荐)
      • `vars`方式
      • `vars_files`方式
    • bash、`vars`和`vars_files`中定义相同变量后谁的优先被调用?
    • 在host_vars目录和group_vars目录中定义变量(!!推荐!!)
      • 简述:
        • 为什么推荐使用这两种方式
        • 内容:
      • 在/etc/ansible/host_vars目录中定义变量
      • 在/etc/ansbile/group_vars目录中定义变量
      • 两种方式定义相同变量时,谁的优先被调用?
      • 自定义host_vars目录和group_vars目录(不在/etc/ansible中)
    • 以上所有的定义变量的方式谁的优先级高?
  • Ansible变量注册`register`指令

零、Ansible的事实变量和内置变量?

事实变量和内置变量在 Ansible 中有不同的用途和来源:

一、 事实变量

  • 定义:由 Ansible 收集的关于目标主机的动态信息,如操作系统版本、IP 地址、硬件信息等。
  • 获取方式:通过运行 setup 模块或自动收集。
  • 示例ansible_os_familyansible_lsb

二、 内置变量

  • 定义:Ansible 自身提供的预定义变量,用于任务执行和配置。
  • 用途:控制任务行为、传递信息等。
  • 示例inventory_hostnameplaybook_dir

总结来说,事实变量提供主机的具体信息,而内置变量则用于控制 Ansible 的行为和配置。

当然可以!下面通过具体例子来说明 Ansible 的内置变量和事实变量的关系。

Ansible 的内置变量

内置变量是 Ansible 提供的用于配置和控制剧本执行的变量。例如:

  • inventory_hostname:当前正在处理的主机名。
  • playbook_dir:当前剧本文件所在的目录。
  • hostvars:一个字典,包含了所有主机的变量。

Ansible 的事实变量

事实变量是 Ansible 在运行时自动收集的主机信息,存储在 ansible_facts 中,例如:

  • ansible_hostname:主机名。
  • ansible_distribution:操作系统分发版。
  • ansible_memtotal_mb:总内存(以MB为单位)。

示例

假设我们有一个简单的剧本,使用内置变量和事实变量来执行某些任务:

- name: Example Playbook
  hosts: all
  tasks:
    - name: Print the hostname
      debug:
        msg: "The hostname is {{ ansible_hostname }}"

    - name: Check memory and print a message
      debug:
        msg: >
          The total memory on {{ inventory_hostname }} is {{ ansible_memtotal_mb }} MB.

    - name: Install package based on OS
      package:
        name: "httpd"
        state: present
      when: ansible_distribution == "CentOS"

    - name: Print current playbook directory
      debug:
        msg: "The playbook is located in {{ playbook_dir }}"

示例解析:

  1. 打印主机名

    • 使用了事实变量 ansible_hostname,输出当前主机的主机名。
  2. 检查内存

    • 使用了内置变量 inventory_hostname 来获取当前主机名,并结合事实变量 ansible_memtotal_mb 打印总内存。
  3. 基于操作系统安装软件包

    • 使用了事实变量 ansible_distribution 来判断操作系统类型。如果是 CentOS,则安装 httpd
  4. 打印剧本目录

    • 使用了内置变量 playbook_dir,输出当前剧本所在的目录。

在这个例子中,内置变量和事实变量结合使用,使得剧本能够根据主机的具体情况做出不同的决策。内置变量提供了剧本运行时的上下文信息,而事实变量则提供了目标主机的详细信息。这样,Ansible 可以实现灵活的自动化管理。

一、Ansible的事实变量有哪些(不全)

Ansible 的事实变量包含许多系统信息,通常可以通过 ansible_facts 访问。以下是一些常见的事实变量类别及其示例:

  1. 基本信息

    • ansible_hostname:主机名。
    • ansible_domain:域名。
    • ansible_fqdn:完全合格的域名。
  2. 操作系统信息

    • ansible_os_family:操作系统家族(如 RedHat、Debian)。
    • ansible_distribution:操作系统分发版(如 Ubuntu、CentOS)。
    • ansible_distribution_version:操作系统版本。
  3. 硬件信息

    • ansible_processor:CPU信息(型号、核数等)。
    • ansible_memtotal_mb:总内存(以MB为单位)。
    • ansible_architecture:系统架构(如 x86_64)。
  4. 网络信息

    • ansible_default_ipv4:默认IPv4地址信息(如地址、网关等)。
    • ansible_interfaces:网络接口列表。
    • ansible_eth0:特定网络接口的信息。
  5. 存储信息

    • ansible_mounts:挂载点信息(包括文件系统类型、挂载状态等)。
    • ansible_devices:存储设备信息。
  6. Python 环境

    • ansible_python_version:Python版本。
    • ansible_python_interpreter:Python解释器的路径。
  7. 虚拟化信息

    • ansible_virtualization_type:虚拟化类型(如 KVM、VMware)。
    • ansible_virtualization_role:虚拟化角色(如 guest、host)。
  8. 其他

    • ansible_user_id:当前用户ID。
    • ansible_env:环境变量。

要查看当前主机的所有事实变量,可以使用 setup 模块,执行命令:

- name: Gather facts
  hosts: all
  tasks:
    - name: Print all facts
      debug:
        var: ansible_facts

这将显示主机上所有收集到的事实变量。

1. ansible_hostname

  • 描述: 当前主机的名称。
  • 用法: 常用于调试或记录主机信息。
---
- name: the play1
  hosts: web_servers
  become: no
  tasks:
    - name: task1
      debug:
        msg: "主机名称:{{ansible_hostname}}"

在这里插入图片描述

2. ansible_fqdn

  • 描述: 当前主机的完全合格域名。
    当主机名配置成:xxx.yyy.zzz时,ansible_fqdn则为:xxx.yyy.zzz,而ansible_hostname则为:xxx

  • 用法: 获取主机的 FQDN,通常用于网络配置或日志。

---
- name: the play1
  hosts: web_servers
  become: no
  tasks:
    - name: the task1
      debug:
        msg: "主机的完全合格域名:{{ansible_fqdn}}"

在这里插入图片描述

3. ansible_os_family

  • 描述: 主机的操作系统系列(如 Debian、RedHat)。
  • 用法: 用于条件判断,执行特定于操作系统的任务。
---
- name: the play1
  hosts: web_servers
  become: no
  tasks:
    - name: the task1
      debug:
        msg: "主机的操作系统系列:{{ansible_os_family}}"

在这里插入图片描述

4. ansible_distribution

  • 描述: 主机的操作系统名称(如 Ubuntu、CentOS)。
  • 用法: 根据操作系统执行特定任务。
---
- name: the play1
  hosts: web_servers
  become: no
  tasks:
    - name: the task1
      debug:
        msg: "主机的操作系统名称:{{ansible_distribution}}"

在这里插入图片描述

5. ansible_version

  • 描述: Ansible 的版本信息。
  • 用法: 用于调试或根据版本执行特定逻辑。
    在这里插入图片描述

6. ansible_all_ipv4_addresses和ansible_all_ipv6_addresses

  • 描述: 当前主机的所有 IPV4或IPV6 地址列表。
  • 用法: 获取和处理网络配置。
    在这里插入图片描述
    在这里插入图片描述

7. ansible_memory_mb

  • 描述: 主机的内存信息(以 MB 为单位)。
  • 用法: 根据内存大小执行条件逻辑。
    在这里插入图片描述

在这里插入图片描述

8. ansible_processor

  • 描述: 主机的处理器信息。
  • 用法: 获取 CPU 型号和核心数。
    在这里插入图片描述

9. hostvars

  • 描述: 当前主机的所有主机变量。
  • 用法: 访问其他主机的变量。
    语法:
hostvars['hostname']['variable_name']

在这里插入图片描述

10. group_names

  • 描述: 当前主机所属的所有组的名称。
  • 用法: 用于条件逻辑。
- name: the play1
  hosts: web02
  become: no
  tasks:
    - name: the task1
      debug: 
        msg: "当前主机有属组,属组为:{{group_names}}"
      when: group_names != ['nogrouped']
    - name: the task2
      debug:
        msg: "当前主机无属组"
      when: group_names == ['nogrouped']

在这里插入图片描述

- name: the play1
  hosts: web03
  become: no
  tasks:
    - name: the task1
      debug: 
        msg: "当前主机有属组,属组为:{{group_names}}"
      when: group_names != ['nogrouped']
    - name: the task2
      debug:
        msg: "当前主机无属组"
      when: group_names == ['nogrouped']

在这里插入图片描述

11. inventory_hostname

  • 描述: 当前主机在清单文件中的名称。
  • 用法: 用于引用清单中的主机名。

inventory_hostname与ansible_hostname的区别

在 Ansible 中,inventory_hostnameansible_hostname 是两个常用的变量,它们有不同的含义和用途:

一、 1. inventory_hostname

  • 定义:这是在 Ansible 的清单(inventory)中定义的主机名。它是用于标识和引用目标主机的名称。
  • 用途:在 Playbook 和任务中,用于对主机进行操作。可以是用户自定义的名称,可以是 IP 地址或其他标识符。
  • 示例
    • 如果你的 inventory 文件中有一行如下:
      webserver ansible_host=192.168.1.10
      
      那么在 Ansible 执行时,inventory_hostname 的值将是 webserver

二、 2. ansible_hostname

  • 定义:这是目标主机的实际主机名,通过 Ansible 在远程主机上执行 hostname 命令自动获取的。
  • 用途:用于获取目标主机的真实名称,通常用于配置文件或输出中,以确保使用的是正确的主机名。
  • 示例
    • 如果在主机 192.168.1.10 上执行 hostname 命令返回 my-server,那么在 Ansible 执行时,ansible_hostname 的值将是 my-server

三、总结

  • inventory_hostname 是你在清单中定义的名称,用于 Ansible 中的标识。
  • ansible_hostname 是目标主机的真实名称,反映了系统的配置。
---
- name: the play1
  hosts: webserver2
  become: no
  tasks:
    - name: the task1
      debug:
        msg: "当前主机的真实主机名为:{{ansbile_hostname}}"
	- name: the task2
	  debug:
	    msg: "当前主机在主机清单中的定义的主机名为:{{inventory_hostname}}"

在这里插入图片描述

在这里插入图片描述

12. inventory_hostname_short

  • 描述: 当前主机的短名称(去掉域名部分)。
  • 用法: 在需要简洁主机名时使用。

13. ansible_env

  • 描述: 当前主机的环境变量字典。
  • 用法: 访问主机的环境变量。

14. ansible_env.USER

  • 描述: 当前 Ansible 执行操作的用户。
  • 用法: 用于权限相关的任务。
    在这里插入图片描述
    在这里插入图片描述

15. ansible_python_version

  • 描述: 当前主机上 Python 的版本信息。
  • 用法: 用于根据 Python 版本执行条件任务。
    在这里插入图片描述

16. ansible_distribution_version

  • 描述: 当前主机操作系统的版本号。
  • 用法: 用于特定版本的条件判断。
    在这里插入图片描述

17. ansible_service_mgr

  • 描述: 当前主机上使用的服务管理器(如 systemd、initd)。
  • 用法: 根据服务管理器执行不同的任务。
    在这里插入图片描述

18. ansible_devices

  • 描述: 主机的所有设备信息,包括存储设备。
  • 用法: 用于磁盘管理和配置。
    在这里插入图片描述

19. ansible_local

  • 描述: 本地主机的自定义变量,用于存储本地收集的数据。
  • 用法: 访问本地特定数据。
    当然可以!ansible_local 通常用于存储在目标主机上自定义收集的数据,这些数据可以是应用程序的配置、状态信息或其他环境特征。以下是几个实际应用示例:

一、 示例 1:存储应用程序配置

假设你有一个 Web 应用程序,它的配置文件位于 /etc/myapp/config.json。你可以创建一个 Ansible 任务来读取这个配置文件并将其作为自定义事实存储。

- name: Collect application configuration
  hosts: all
  tasks:
    - name: Read application configuration
      slurp:
        src: /etc/myapp/config.json
      register: app_config

    - name: Save configuration as ansible_local fact
      copy:
        content: "{{ app_config.content | b64decode }}"
        dest: /etc/ansible/facts.d/myapp.fact

    - name: Print application configuration
      debug:
        var: ansible_local.myapp

二、示例 2:监控服务状态

你可以收集和存储特定服务的状态信息,例如数据库服务的运行状态。

- name: Collect service status
  hosts: all
  tasks:
    - name: Check if database service is running
      command: systemctl is-active my_database
      register: db_service_status

    - name: Store service status in ansible_local
      copy:
        content: |
          {
            "db_service": "{{ db_service_status.stdout }}"
          }
        dest: /etc/ansible/facts.d/db_service.fact

    - name: Print database service status
      debug:
        var: ansible_local.db_service

自行测试:

---
- name: the play1
  hosts: db01
  become: no
  tasks:
    - name: task1-1
      command: systemctl status mariadb
      register: mariadb_service_status
      ignore_errors: yes
      # 这里使用“ignore_errors”且值为yes,是为了防止出现“systemctl status mariadb”返回的结果rc!=0的情况,如果出现了rc!=0那么将不会执行下面的task了,这样通过ingore_errors就会跳过它,继续执行后面的task
    - name: taks1-2
      set_fact:
        mariadb_service_status: "{{mariadb_service_status.stdout if mariadb_service_status.rc == 0 else 'inactive'}}"
      # 这里的"set_fact"模块用于改变注册变量mariadb_service_status的值
    - name: task2
      copy:
        content: |
          {
            "mariadb_service_status": "{{mariadb_service_status}}"
          }
        dest: /etc/ansible/facts.d/mariadb_service_status.fact
        # 前提是目标主机即db01上得存在/etc/ansible/facts.d这目录才行
    - name: task3
      debug: 
        msg: "该主机存储出的mariadb_service_status变量的内容为:{{ansible_local.mariadb_service_status}}"

在这里插入图片描述

三、 示例 3:存储网络配置信息

假设你想收集网络接口的配置信息并存储为自定义事实。

- name: Collect network interface information
  hosts: all
  tasks:
    - name: Gather network facts
      setup:
        gather_subset:
          - network

    - name: Save network information as ansible_local fact
      copy:
        content: "{{ ansible_interfaces | to_json }}"
        dest: /etc/ansible/facts.d/network.fact

    - name: Print network interface information
      debug:
        var: ansible_local.network

20. ansible_managed

  • 描述: 用于指示文件是由 Ansible 管理的,通常用于模板文件的头部。
  • 用法: 在模板文件中使用,以表明文件管理状态。

通常用于在配置文件中标识文件是由Ansible管理的。这有助于在文件顶部添加注释,指明该文件的来源。

在Ansible中,ansible_managed变量主要用于模板文件(如Jinja2模板),而不是在普通的playbook或任务中直接使用。因此,下面的playbook中,ansible_managed未定义,因此会报错。

---
- name: the play1
  hosts: localhost
  become: no
  tasks:
    - name: the task1
      debug:
        msg: "ansible_managed的值为:{{ ansible_managed }}"

一、使用方法 你可以在模板文件(如Jinja2模板)中使用{{ ansible_managed }}来插入默认的管理注释。这个变量会根据Ansible的配置自动生成。

二、示例 假设你想在一个配置文件的开头添加管理信息,可以创建一个Jinja2模板,如my_config.j2

# This file is managed by Ansible. Do not edit directly.
# Ansible managed: {{ ansible_managed }}
#
# Configuration settings
setting1=value1
setting2=value2

在你的playbook中,可以使用template模块将这个模板应用到目标主机:

- hosts: all
  tasks:
    - name: Deploy configuration file
      template:
        src: my_config.j2
        dest: /etc/my_config.conf

当Ansible运行时,{{ ansible_managed }}会被替换为一个包含版本信息和更新时间的字符串,生成的文件顶部将包含有关文件的管理信息。这样,你可以清楚地知道该文件是由Ansible生成的,避免手动修改。
在这里插入图片描述

21. ansible_connection

  • 描述: 当前主机的连接类型(如 ssh、local)。
  • 用法: 根据连接类型执行不同的逻辑。
    在这里插入图片描述
    在这里插入图片描述

22. ansible_ethX

  • 描述: 特定网络接口的详细信息(X 代表接口编号)。
  • 用法: 访问指定网络接口的信息。
    在这里插入图片描述

23. ansible_processor_cores

  • 描述: 主机上处理器的核心数量。
  • 用法: 根据核心数调整配置或任务。
    在这里插入图片描述

24. ansible_mounts

- 描述: 当前主机上所有挂载点的信息。
- 用法: 获取和处理磁盘挂载信息。

在这里插入图片描述

25. ansible_kernel

  • 描述: 当前主机操作系统的内核版本。
  • 用法: 用于内核相关的任务或调试。
    在这里插入图片描述

26. ansible_distribution_release

  • 描述: 当前主机操作系统的发布版本(如 stable、testing)。
  • 用法: 用于条件逻辑。
    在这里插入图片描述

27. ansible_lsb

  • 描述: 主机的 Linux Standard Base 信息。
  • 用法: 用于 Linux 发行版的兼容性检查。

ansible_lsb 是 Ansible 中的一个事实变量,用于获取与 Linux Standard Base (LSB)
相关的信息。它包含有关操作系统版本和发行版的详细信息。

一、 获取 LSB 信息

你可以通过收集系统事实来访问 ansible_lsb。以下是一个使用示例:

- name: Gather LSB facts
  hosts: all
  tasks:
    - name: Gather facts
      setup:
        filter: ansible_lsb

    - name: Show LSB information
      debug:
        var: ansible_lsb

二、 LSB 信息内容

ansible_lsb 通常包含以下键:

  • distrib_id:发行版 ID
  • distrib_release:发行版版本
  • distrib_codename:发行版代号
  • distrib_description:发行版描述

你可以在 debug 任务中查看这些信息,例如:

- name: Show LSB ID
  debug:
    var: ansible_lsb.distrib_id

- name: Show LSB Release
  debug:
    var: ansible_lsb.distrib_release

三、 注意事项

确保在运行这些任务之前,目标主机上安装了 LSB 工具(如 lsb-release),以便 Ansible 可以成功收集这些信息。

28. ansible_bios

  • 描述: 主机的 BIOS 信息。
  • 用法: 用于硬件信息的收集和记录。

ansible_bios 是 Ansible 中的一个事实变量,用于获取与系统 BIOS 相关的信息。它通常包含 BIOS版本、制造商和发布日期等信息。

你可以通过以下方式收集 BIOS 信息:

- name: Gather BIOS facts
  hosts: all
  tasks:
    - name: Gather facts
      setup:
        filter: ansible_bios

    - name: Show BIOS information
      debug:
        var: ansible_bios

运行后,ansible_bios 将包含相关的 BIOS 信息,便于你进行进一步处理。

29. ansible_virtual

  • 描述: 主机的虚拟化状态(如 true/false)。
  • 用法: 用于检测主机是否在虚拟环境中。

ansible_virtual 是 Ansible 中的一个事实变量,用于获取有关虚拟化环境的信息。它提供了当前主机是否在虚拟机中运行的相关信息。

你可以通过以下方式获取虚拟化信息:

- name: Gather virtual facts
  hosts: all
  tasks:
    - name: Gather facts
      setup:
        filter: ansible_virtual

    - name: Show virtual information
      debug:
        var: ansible_virtual

通常,ansible_virtual 可能包含以下字段:

  • type:虚拟化类型(例如 KVM、VMware 等)
  • host:物理主机信息

这使得你可以根据虚拟化环境调整你的 Ansible 任务和剧本。

30. ansible_libraries

  • 描述: Ansible 查找模块的路径列表。
  • 用法: 用于调试或添加自定义模块路径。

ansible_libraries 是 Ansible 的一个内置变量,用于指定自定义模块的搜索路径。这可以帮助你在剧本中使用自己编写的Ansible 模块。

  1. 创建自定义模块: 首先,确保你有一个自定义模块,比如 my_module.py,并将其放在特定的目录下。

  2. 设置 ansible_libraries: 你可以在你的 Ansible 剧本中指定模块路径。例如:

- name: Use custom module
  hosts: all
  vars:
    ansible_libraries: "/path/to/your/custom/modules"
  tasks:
    - name: Execute custom module
      my_module:
        param1: value1
  1. 放置自定义模块: 确保你的自定义模块在你设置的路径下,并且具有可执行权限。

假设你的自定义模块存放在 /opt/ansible/modules,你可以在剧本中这样使用:

- name: Use custom module
  hosts: all
  vars:
    ansible_libraries: "/opt/ansible/modules"
  tasks:
    - name: Run my custom module
      my_module:
        arg1: "value"

这样,Ansible 就会在指定的路径中查找自定义模块 my_module.py

  • 确保你的模块代码是有效的,且符合 Ansible 的模块开发规范。
  • 在运行 Ansible 任务之前,确认路径设置正确。

31. ansible_python_interpreter

  • 描述: Ansible 使用的 Python 解释器路径。
  • 用法: 在执行 Python 任务时确保使用正确的解释器。

ansible_python_interpreter 是 Ansible 中的一个变量,用于指定在目标主机上运行 Python的解释器路径。它通常用于确保 Ansible 在正确的 Python 环境中运行,特别是在系统中存在多个 Python 版本时。

  1. 在剧本中指定
    你可以在 Ansible 剧本中指定 ansible_python_interpreter 变量,例如:
- name: Set Python interpreter
  hosts: all
  vars:
    ansible_python_interpreter: /usr/bin/python3
  tasks:
    - name: Check Python version
      command: "{{ ansible_python_interpreter }} --version"
  1. 在 inventory 文件中指定

    你还可以在你的 inventory 文件中为特定主机或组设置该变量。例如:

[myservers]
server1 ansible_python_interpreter=/usr/bin/python3
server2 ansible_python_interpreter=/usr/bin/python2

如果没有显式设置 ansible_python_interpreter,Ansible 会根据目标主机的环境尝试自动查找 Python解释器,通常是 /usr/bin/python/usr/bin/python3

  • 确保指定的 Python 路径是正确的,并且目标主机上存在该 Python 版本。
  • 适当的 Python 版本对于执行某些模块和任务非常重要,特别是需要依赖于特定库的模块。

32. ansible_pkg_mgr

  • 描述: 主机的包管理工具(如 apt、yum)。
  • 用法: 用于选择合适的包安装命令。
    在这里插入图片描述

二、Ansible的变量的使用

在Ansible中,变量可以分为多个类别,主要包括:

  1. 主机变量(Host Variables):特定于主机的变量,可以在 inventory 文件中定义。

  2. 组变量(Group Variables):针对主机组定义的变量,通常在 group_vars 目录中。

  3. Playbook 变量:在 playbook 中定义的变量,可以在 vars 部分声明。

  4. Facts:通过 Ansible 收集的关于主机的信息,使用 setup 模块自动收集。

  5. 临时变量:在任务中定义的临时变量,使用 set_fact 模块。

  6. 环境变量:可以通过 env 变量获取。

  7. 注册变量:通过任务的结果注册的变量,可以使用 register 关键字。

  8. Jinja2 变量:使用 Jinja2 模板语法定义和处理的变量。

  9. Playbook 参数:通过命令行传递给 playbook 的变量,使用 --extra-vars

  10. 默认变量:角色中的 defaults/main.yml 文件中定义的变量。

这些变量可以在任务、模板和其他地方使用,提供灵活的配置选项。

在主机清单文件中定义变量(不推荐)

[rsync:children]
web_servers
nfs_servers
backup_servers

[web_servers]
...
[web_servers:vars]
id=777
user=ooo

[nfs_servsers]
...
[backup_servers]
...

调用测试:

  • 错误调用:
---
- name: the play to test the inventory variables
  hosts: web_servers
  become: no
  tasks:
   - name: task1
     debug:
     # 下面的msg的内容是错误书写:
       msg: "vars in web_servers content: id:{{web_servers.id}}, user:{{web_servsers.user}}"
  

会报错:
在这里插入图片描述

  • 正确调用:
---
- name: the play to test the inventory variables
  hosts: web_servers
  become: no
  tasks:
   - name: task1
     debug:
     # 下面的msg的内容是正确书写:
       msg: "vars defined in web_servers have: id:{{id}}, user:{{user}}"

在这里插入图片描述

在bash运行命令时定义变量(不推荐)

ansible-playbook <剧本文件全路径> -e 'user=kk' -e 'id=888'
# -e: -extra-vars

在这里插入图片描述

在剧本中定义变量(不推荐)

vars方式

---
- name: the play1
  hosts: xxx
  become: no
  vars:
    packages1:
      - redis
      - tomcat
  tasks:
    - name: task1
      yum:
        name: {{packages1}}
        state: present

在这里插入图片描述

vars_files方式

# 创建含有变量的文件
vim ansbile_vars.txt
# vim中写入以下内容:
packages1:
  - redis
  - tomcat

调用测试:
在这里插入图片描述

bash、varsvars_files中定义相同变量后谁的优先被调用?

bash方式 > vars _files > vars
测试:

---
- name: the play1
  hosts: web_servers
  become: no
  # 定义一个user变量
  tasks:

在host_vars目录和group_vars目录中定义变量(!!推荐!!)

简述:

为什么推荐使用这两种方式

推荐使用 host_varsgroup_vars 目录来定义变量,主要有以下几个原因:

  1. 结构化管理:将变量按主机或组分类存放,使得管理更加清晰,便于维护和查找。

  2. 可重用性:在不同的剧本中,主机或组的变量可以被重用,避免重复定义,提高效率。

  3. 灵活性:可以为特定主机或组定义独立的变量,支持更复杂的配置管理。

  4. 自动加载:Ansible 会自动加载这些目录中的变量,简化剧本的书写,不必在每个剧本中手动引用变量文件。

总之,这种方式提升了组织性和可维护性,让 Ansible 配置更加灵活和易于扩展。

内容:
  • host_vars目录:
    定义单个主机的变量

  • group_vars目录:
    定义主机组的变量

在/etc/ansible/host_vars目录中定义变量

# 单独为web01主机定义变量,文件名必须和DNS解析的主机名(这里是web01)相同
vim /etc/ansbile/host_vars/web01	
	# 进入vim写入:
user:web01_user
id:4443

# 单独为web02主机定义变量,文件名必须和DNS解析的主机名(这里是web02)相同
vim /etc/ansible/host_vars/web02
	# 进入vim写入:
user:web02_user
id:4444

测试调用:

---
- name: the play1
  hosts: web_servers
  become: no
  tasks:
    - name: the task1
      user:
        name: "{{user}}"
        uid: "{{id}}"
        state: present
  # 尽管变量名相同,但效果是会为web01和web02各自创建不同的user

在这里插入图片描述

在/etc/ansbile/group_vars目录中定义变量

# 为主机组创建统一的变量,文件名必须与定义的主机组名相同
vim /etc/ansible/group_vars/web_servers
	# vim写入:
user:group_uni_user
id: 4449

在这里插入图片描述

两种方式定义相同变量时,谁的优先被调用?

host_vars > group_vars
测试:

自定义host_vars目录和group_vars目录(不在/etc/ansible中)

在这里插入图片描述

注意:
1、playbook文件必须与host_vars目录和group_vars目录同级,如果你的host_vars和group_vars目录位于/etc/ansible下,那么你的剧本文件可以放在任何地方。Ansible会在执行时自动查找这些目录,因此不需要与剧本文件同级。

2、当/etc/ansible下的host_vars目录或是group_vars目录也同样定义了和自定义host_vars目录或group_vars目录下的变量的话,剧本文件会优先调用与它同级的(也就是自定义的)下面的变量值

以上所有的定义变量的方式谁的优先级高?

1、命令行方式
2、host_vars方式
3、group_vars方式
4、playbook中vars_files方式
5、playbook中vars方式
6、主机清单方式

Ansible变量注册register指令

详见之前的文章"Ansible_模块"(链接)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 Shapley 到 SHAP — 数学理解

如何计算 SHAP 特征贡献的概述 假设你(玩家 1)和朋友(玩家 2)参加了一场 Kaggle 比赛,你最终赢得了 10,000 元的一等奖。现在,你想公平地分配这笔钱。你的朋友建议你平分。但是,你的超参数调整技能更出色。你相信你应该得到更大的份额,因为你为团队做出了更多贡献。考虑…

如何在Windows和Linux之间实现粘贴复制

第一步 sudo apt-get autorremove open-vm-tools第二步 sudo apt-get update第三步 sudo apt-get install open-vm-tools-desktop第四步 一直按Y&#xff0c;希望执行 Y第四步 重启 reboot然后可以实现粘贴复制。

MySQL连接查询解析与性能优化成本

文章目录 一、连接查询1.连接查询基础1. INNER JOIN内连接2. LEFT JOIN (或 LEFT OUTER JOIN)左外连接3. RIGHT JOIN (或 RIGHT OUTER JOIN)右外连接4. FULL OUTER JOIN 2.连接查询的两种过滤条件3.连接的原理 二、性能优化成本1.基于成本的优化2.调节成本常数(1)mysql.server_…

如何在Markdown写文章上传到wordpress保证图片不丢失

如何在Markdown写文章上传到wordpress保证图片不丢失 写文日期,2023-11-16 引文 众所周知markdown是一款nb的笔记软件&#xff0c;本篇文章讲解如何在markdown编写文件后上传至wordpress论坛。并且保证图片不丢失&#xff08;将图片上传至云端而非本地方法&#xff09; 一&…

WSL进阶体验:gnome-terminal启动指南与中文显示问题一网打尽

起因 我们都知道 wsl 启动后就死一个纯命令行终端&#xff0c;一直以来我都是使用纯命令行工具管理Linux的。今天看到网上有人在 wsl 中启动带图形界面的软件。没错&#xff0c;就是在wsl中启动带有图形界面的Linux软件。比如下面这个编辑器。 ​​ 出于好奇&#xff0c;我就…

Linux部署python web项目Flask + gunicorn + nginx

文章目录 一、安装python&使用虚拟环境二、python程序重要参数加密2.1 非对称加密&#xff08;RSA&#xff09;2.2 生成密钥对2.4 以连接数据库参数加密为例2.4.1 工具类RSA.py 三、一个简单的Flask项目四、安装配置gunicorn4.1 安装4.2 启动/配置(选择eventlet)4.2.1 命令…

vue打包exe之electron-quick-start的npm install 报错

vue打包exe之electron-quick-start的npm install 报错 1、github地址2、问题3、解决4、其他(打包exe)参考 1、github地址 https://github.com/electron/electron-quick-start2、问题 我使用的pnpm install正常安装&#xff0c;执行npm start提示错误 3、解决 在package.js…

【LLM多模态】文生视频综述From Sora What We Can See: A Survey of Text-to-Video Generation

note 现在很多主流的文生视频应该还是Diffusion-based 基于扩散模型的方法这篇综述将现有研究按照三个维度进行分类&#xff1a;进化生成器&#xff08;Evolutionary Generators&#xff09;、卓越追求&#xff08;Excellent Pursuit&#xff09;、现实全景&#xff08;Realis…

【学习笔记】MIPI

MIPI介绍 MIPI是由ARM、Nokia、ST、IT等公司成立的一个联盟&#xff0c;旨在把手机内部的接口如存储接口&#xff0c;显示接口&#xff0c;射频/基带接口等标准化&#xff0c;减少兼容性问题并简化设计。 MIPI联盟通过不同的工作组&#xff0c;分别定义一系列手机内部的接口标…

植物大战僵尸杂交版V2.5.1下载(最新版)

2.5.1版本更新公告&#xff1a; 在最新的2.5.1版本中&#xff0c;游戏对“两面夹击”关卡进行了多项重要调整。出怪倍率和种类均有所降低&#xff0c;部分关卡的初始阳光量也得到了调整&#xff0c;以增强玩家的策略性。同时&#xff0c;玩家可以在这些关卡中使用投手类植物&a…

sysbench 命令:跨平台的基准测试工具

一、命令简介 sysbench 是一个跨平台的基准测试工具&#xff0c;用于评估系统性能&#xff0c;包括 CPU、内存、文件 I/O、数据库等性能。 ‍ 比较同类测试工具 bench.sh 在上文 bench.sh&#xff1a;Linux 服务器基准测试中介绍了 bench.sh 一键测试脚本&#xff0c;它对…

RabbitMQ下载安装运行环境搭建

RabbitMQ运行环境搭建 1、Erlang及RabbitMQ安装版本的选择2、下载安装Erlang2.1、下载Erlang2.2、安装Erlang2.2.1、安装Erlang前先安装Linux依赖库2.2.2、解压Erlang压缩包文件2.2.3、配置2.2.4、编译2.2.5、安装2.2.6、验证erlang是否安装成功 3、RabbitMQ下载安装3.1、下载3…

FortiGate 无线组网

无线管理与配置 FortiAP 连接 internal 接口之后自动获得 ip 地址&#xff1a;192.168.1.xxx/24在 FortiGate 中创建 SSIDFortiGate 自动发现 FortiAP&#xff0c;将 FortiAP 添加到 FortiGate将 SSID 和 FortiAP 关联创建防火墙策略 下面我们就来一起看看在 FortiGate 中该如…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

前端——js基础

一、JavaScript &#xff08;简称js&#xff09;——js可以给网页实现一个动态效果 1.JavaScript 组成 - 核心语法 ECMScipt 简称(es): 规范js的基本语法 1.es是js的语法规范 管理者 2.js是es的实现 操作者 - DOM > 文档对象 提供js操作 (例如…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

jq实现:点击图片时弹出详情弹窗,判断拖动图片时不弹出

1.需求分析: 要实现点击图片时弹出详情弹窗,但在拖动时不弹出,可以使用 jQuery 来判断用户的操作。可以通过设置一个标志变量来判断用户是否在拖动图片。 并且在鼠标拖动某个图片时将其层级设置为最上面,可以使用 jQuery 结合 CSS 的 z-index 属性 说明 : 标志变量:使用…

传输层TCP协议

一、TCP协议格式 我们看到报头固定有20字节&#xff0c;最后选项大小不固定。 4位首部长度&#xff08;二进制0000 ~ 1111&#xff0c;十进制范围[0, 15]&#xff09;单位是4字节&#xff08;存放字节大小范围[0, 60]&#xff09;包括了20字节固定长度 选项长度。若选项大小为…

PWA(Progressive web APPs,渐进式 Web 应用): manifest.json、 Service Worker

文章目录 引言I 什么是 PWA功能特性技术上分为三个部分:II Web 应用清单将Web 应用清单文件链接到站点manifest.json字段说明III Service WorkerService worker 本质Service worker 运行在 worker 上下文注册服务辅助角色扩展知识将 PWA 作为脱机应用定义当前文档与被链接文档…

用Python实现运筹学——Day 4: 线性规划的几何表示

一、学习内容 线性规划的几何表示&#xff1a; 线性规划问题的解通常位于一个凸多边形&#xff08;即可行解空间&#xff09;的顶点上&#xff0c;这意味着在求解线性规划问题时&#xff0c;只需要找到可行解空间中的顶点并计算出目标函数值&#xff0c;再选择其中的最优解。 可…