ansible 变量详解

本文详细介绍Ansible中变量的多种定义方式,包括主机变量、组变量、playbook内定义、远程获取系统变量、通过facts目录获取、运行结果中提取、文件传递及命令行传参。同时讲解了如何访问其他主机信息,如使用hostvars和group_names等预设变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义变量的方法

1、 主机变量,在hosts文件中设置变量,

[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909

2、组变量,

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

3、playbook中定义变量

- hosts: webservers
  vars:
    http_port: 80

4、 Facts 远程获取系统相关变量, 可以在playbook中添加  

gather_facts: no

来关闭Facts,这样可以提高ansible的运行效率

5、远程机器上设置facts目录获取变量

如果远程受管理的机器有一个 “/etc/ansible/facts.d” 目录,那么在该目录中任何以 ”.fact”结尾的文件都可以在Ansible中提供局部facts.这些文件可以是JSON,INI或者任何可以返回JSON的可执行文件.

例如建设有一个 /etc/ansible/facts.d/perferences.fact文件:

[general]
asdf=1
bar=2

这将产生一个名为 “general” 的哈希表fact,里面成员有 ‘asdf’ 和 ‘bar’. 可以这样验证:

ansible <hostname> -m setup -a "filter=ansible_local"
结果为:
"ansible_local": {
        "preferences": {
            "general": {
                "asdf" : "1",
                "bar"  : "2"
            }
        }
 }

而且也可以在template或palybook中访问该数据:

{{ ansible_local.preferences.general.asdf }}

6、使用运行结果得到变量

- hosts: web_servers
  tasks:
     - shell: /usr/bin/foo
       register: foo_result
       ignore_errors: True

     - shell: /usr/bin/bar
       when: foo_result.rc == 5

6、使用文件转递变量

把playbook置于源代码管理之下是个很好的注意,当你可能会想把playbook源码公开之余还想保持某些重要的变量私有.有时你也想把某些信息放置在不同的文件中,远离主playbook文件.

- hosts: all
  remote_user: root
  vars:
    favcolor: blue
  vars_files:
    - /vars/external_vars.yml
  tasks:
  - name: this is just a placeholder
    command: /bin/echo foo

7、命令行中传递变量

ansible-playbook release.yml --extra-vars "version=1.23.45 other_variable=foo"
或者使用json
--extra-vars '{"pacman":"mrs","ghosts":["inky","pinky","clyde","sue"]}'

8、访问其他主机信息

Ansible会自动提供给你一些变量,即使你并没有定义过它们.这些变量中重要的有 ‘hostvars’,’group_names’,和 ‘groups’.由于这些变量名是预留的,所以用户不应当覆盖它们. ‘environmen’ 也是预留的. hostvars可以让你访问其它主机的变量,包括哪些主机中获取到的facts.如果你还没有在当前playbook或者一组playbook的任何play中访问那个主机,那么你可以获取变量,但无法看到facts值. 如果数据库服务器想使用另一个节点的某个 ‘fact’ 值,或者赋值给该节点的一个inventory变量.可以在一个模板中甚至命令行中轻松实现:

{{ hostvars['test.example.com']['ansible_distribution'] }}

另外, group_names 是当前主机所在所有群组的列表(数组).所以可以使用Jinja2语法在模板中根据该主机所在群组关系(或角色)来产生变化:

{% if 'webserver' in group_names %}
   # some part of a configuration file that only applies to webservers
{% endif %}

 

转载于:https://www.cnblogs.com/zhengyionline/p/10437355.html

<think>好的,用户想了解Ansible变量的用法和详细说明。我需要根据提供的引用资料来组织回答,确保内容准确且结构清晰。首先,我需要回顾Ansible变量的基本概念,然后分层次讲解变量的不同使用方式,比如在Playbook中定义、在文件中定义、主机和清单变量变量优先级等。还要注意引用对应的资料来支持每个部分。用户可能对变量的优先级不太清楚,需要详细说明不同来源的变量如何覆盖。另外,魔法变量和事实变量这些高级特性也应该提到,帮助用户全面了解。还要注意使用正确的中文表达,避免术语混淆。同时,根据用户提供的引用,特别是引用[3]关于变量语法和引用[4]关于优先级的部分,需要重点强调这些内容。可能还需要检查是否有遗漏的重要点,比如注册变量或Jinja2模板的使用,这些在引用[5]中有提到,应该包含在回答中。最后,生成相关问题时要考虑用户可能的后续疑问,比如变量优先级、加密控制等。确保整个回答逻辑清晰,步骤分明,用户能够逐步理解Ansible变量的各个方面。</think>### Ansible变量用法详解 Ansible变量用于动态化管理配置和任务执行,支持多级定义和灵活调用机制。以下从变量命名规范、定义方式、优先级及典型应用场景展开说明: --- #### 一、变量命名规范 1. **命名规则** 变量名需以字母开头,可包含字母、数字和下划线,例如`app_port`有效,`3app`无效。 2. **命名建议** 采用小写字母+下划线的组合(如`max_retries`),避免与系统保留字冲突。 --- #### 二、变量定义方式 ##### 1. **Playbook内直接定义** ```yaml - hosts: web_servers vars: http_port: 80 app_path: "{{ base_path }}/app" # 引用其他变量 tasks: - name: 配置端口 debug: msg: "服务端口为{{ http_port }}" ``` *通过`vars`块定义适用于当前Playbook的变量[^3]* ##### 2. **独立变量文件定义** 在`group_vars/`或`host_vars/`目录下创建与主机组/主机同名的YAML文件: ```yaml # group_vars/dbservers db_version: 14 backup_dir: /opt/backups ``` *此方式便于集中管理多主机共享的变量[^1]* ##### 3. **命令行覆盖变量** ```bash ansible-playbook deploy.yml -e "db_version=15 force_update=yes" ``` *通过`-e`参数临时覆盖已有变量值[^4]* ##### 4. **注册变量(动态捕获输出)** ```yaml - name: 获取系统时间 command: date +%s register: timestamp - debug: var: timestamp.stdout ``` *将任务执行结果存入变量供后续任务调用* --- #### 三、变量优先级层次 从低到高优先级排序: 1. **Inventory变量** 在主机清单文件中定义的基础变量 2. **Group/Host变量文件** `group_vars/all`等目录下的全局变量 3. **Playbook的`vars`块** 当前Playbook内定义的变量 4. **命令行`-e`参数** 最高优先级,实时覆盖其他来源[^4] --- #### 四、高级变量应用 ##### 1. **事实变量(Facts)** 自动收集目标主机信息: ```yaml - debug: var: ansible_facts['eth0']['ipv4']['address'] ``` *通过`gather_facts: true`启用(默认开启)* ##### 2. **魔法变量** 获取Ansible运行时上下文信息: - `ansible_play_hosts`:当前Play涉及的所有主机 - `inventory_hostname`:当前执行主机的Inventory名称 ##### 3. **Jinja2模板引擎** ```jinja2 # templates/nginx.conf.j2 server { listen {{ http_port | default(80) }}; server_name {{ server_name }}; } ``` *支持过滤器(如`default`)和逻辑控制[^5]* --- #### 五、最佳实践 1. **敏感数据加密** 使用`ansible-vault`加密含密码的变量文件: ```bash ansible-vault encrypt vars/secrets.yml ``` 2. **变量分层管理** 按环境(dev/prod)划分变量文件,通过`--extra-vars "@env_vars.yml"`加载 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值