Ansible 变量

Ansible 变量

Ansible 和其他编辑语言一样,可以通过变量来存储值,并在 Ansible 项目的所有文件中使用这些值

变量的命名规则:

  • 必须以字母开头;
  • 只能包含字母,数字和下划线;

变量范围:

Global:全局变量,在命令行中,通过 -e 参数传递;

Play:在 Playbook 中的 play 里面 通过 vars 或 vars_files 关键字定义的变量

Host:由清单中,主机或主机组中定义的变量

全局变量

编写 playbook,在该 playbook 中,我们为 apt 模块来安装软件包,并为软件包的 name 选项指定一个名为 package 的变量;

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Install Apache
  hosts: servera
  tasks:
    - name: Install {{ package }}
      apt:
        name: "{{ package }}"
        state: present

* 在 play 中通过 “{{ VariableName }}”

* 在需要打印出来的字段中引用变量不需要加引号,在其他地方引用变量需要加引号,如,在 name 中引用,因为变量名与花括号之间有空格,name 不能把他们识别成一个整体,所以不加引号会报错;

运行 playbook 时,通过 -e 来指定变量名对应的值;

it@workstation:~/ansible$ ansible-playbook test.yml -e "package=apache2"
BECOME password: 

PLAY [Install Apache] ******************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [servera]

TASK [Install apache2] *****************************************************************************
ok: [servera]

PLAY RECAP *****************************************************************************************
servera                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

* 我前面已经执行过安装 Apache2 了,所以这里执行的结果是 ok,而不是 changed;

Play 变量

Play 变量就是在 playbook 中为每个 play 定义的变量,play 变量可以直接定义在 play 中,通过 vars 关键字定义;也可以定义在文件中,然后在 play 中通过 vars_files 关键字导入变量文件;

通过 vars 关键字定义变量

创建 playbook,并通过 vars 关键定义一个 user 的变量,对应的值为 Jack

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: servera
  vars:
    user: jack
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

运行 playbook

it@workstation:~/ansible$ ansible-playbook test.yml
BECOME password: 

PLAY [Create User] *********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [servera]

TASK [Create a user named jack] ********************************************************************
changed: [servera]

PLAY RECAP *****************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

从创建用户的 task 名称可以看到,变量 user 被其对应的值所替换;

通过文件定义变量

创建变量文件,并在文件中定义一个 user 变量,并指定值为 Jerry

it@workstation:~/ansible$ vim user.yml
it@workstation:~/ansible$ cat user.yml
---
user: jerry

* 注意变量文件的格式应为 yml 文件格式;

编写 playbook,在 play 中通过 vars_files 关键字来导入变量文件

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: servera
  vars_files:
    - user.yml
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

主机变量

编辑主机清单,在主机后面添加一个 user 变量,并指定值为 user1;

it@workstation:~/ansible$ vim hosts 
it@workstation:~/ansible$ cat hosts
serverb user=user1

[web]
servera

[prod:children]
web

创建 playbook

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: serverb
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

运行 playbook

it@workstation:~/ansible$ ansible-playbook test.yml 
BECOME password: 

PLAY [Create User] *********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [serverb]

TASK [Create a user named user1] *******************************************************************
changed: [serverb]

PLAY RECAP *****************************************************************************************
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

变量 user 被对应的值,user1 替换了;

我们还可以在主机变量目录(host_vars)中定义主机变量文件

更改清单,删除清单中定义的变量

it@workstation:~/ansible$ vim hosts 
it@workstation:~/ansible$ cat hosts
serverb

[web]
servera

[prod:children]
web

在 ansible 目录中创建一个 host_vars 目录,并在这个目录下以主机名创建一个 yml 文件,并在文件中指定 user 变量;

it@workstation:~/ansible$ mkdir host_vars
it@workstation:~/ansible$ vim host_vars/servera.yml
it@workstation:~/ansible$ cat host_vars/servera.yml
---
user: user2

编辑 playbook

t@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: servera
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

运行 playbook

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ ansible-playbook test.yml 
BECOME password: 

PLAY [Create User] *********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [servera]

TASK [Create a user named user2] *******************************************************************
changed: [servera]

PLAY RECAP *****************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

变量 user 被对应的值,user2 替换了;

主机组变量

编辑主机清单文件,通过 [GroupName:vars] 为主机组添加变量

it@workstation:~/ansible$ vim hosts 
it@workstation:~/ansible$ cat hosts
serverb

[web]
servera
serverb

[prod:children]
web

[web:vars]
user=user3

删除之前在 host_vars 目录下创建的变量文件

it@workstation:~/ansible$ rm host_vars/servera.yml

编辑 playbook

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: web
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

运行 playbook

it@workstation:~/ansible$ ansible-playbook test.yml 
BECOME password: 

PLAY [Create User] *********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]

TASK [Create a user named user3] *******************************************************************
changed: [servera]
ok: [serverb]

PLAY RECAP *****************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

变量 user 被对应的值,user3 替换了;

同样,你也可以通过组变量文件目录(group_vars)定义主机组变量文件

更改主机清单,删除前面创建的主机变量

t@workstation:~/ansible$ vim hosts
it@workstation:~/ansible$ cat hosts
serverb

[web]
servera
serverb

[prod:children]
web

创建主机组变量目录,并以组名作为文件名,创建一个 yml 格式的变量文件,并在文件中指定 user 变量,值为 user4;

it@workstation:~/ansible$ mkdir group_vars
it@workstation:~/ansible$ vim group_vars/web.yml
it@workstation:~/ansible$ cat group_vars/web.yml
---
user: user4

创建 playbook

it@workstation:~/ansible$ vim test.yml 
it@workstation:~/ansible$ cat test.yml
---
- name: Create User
  hosts: web
  tasks:
    - name: Create a user named {{ user }}
      user:
        name: "{{ user }}"

运行 playbook

it@workstation:~/ansible$ ansible-playbook test.yml 
BECOME password: 

PLAY [Create User] *********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [servera]
ok: [serverb]

TASK [Create a user named user4] *******************************************************************
changed: [serverb]
changed: [servera]

PLAY RECAP *****************************************************************************************
servera                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
serverb                    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

变量 user 被对应的值,user4替换了;

<think>嗯,用户想了解Ansible变量的使用方法以及相关示例。好的,我需要先回忆一下Ansible变量的几种定义方式。根据提供的引用,比如引用2提到了在host_vars和group_vars目录中定义变量,还有命令行中使用-e参数覆盖变量。还有引用5提到变量用于提高任务维护效率,所以需要说明变量如何简化配置。 首先,用户可能需要知道变量的不同定义位置,比如Inventory文件、YAML文件、命令行等。然后,不同优先级的变量如何覆盖,比如命令行变量优先级最高。需要分步骤说明,确保结构清晰。 然后,引用2提到不建议直接在Hosts文件中定义变量,而是推荐使用host_vars和group_vars,这部分需要详细解释,并给出示例目录结构和文件内容。可能用户会遇到多主机变量管理的问题,这样分开管理更方便。 另外,引用1中的示例用-e选项覆盖用户变量,可能需要说明如何在命令行传递变量,以及应用场景,比如临时测试某个变量值。 还有,引用3关于ansible_local过滤本地facts,可能需要提到如何在playbook中使用远程主机的本地变量,或者如何收集facts。 引用4提到了ansible-vault查看加密文件,这部分可能和变量安全相关,比如如何保护敏感变量,比如密码,但用户的问题可能更关注变量定义而不是加密,不过可以提一下使用vault加密变量的方法。 需要生成相关问题,比如变量优先级、最佳实践、加密变量等,根据引用内容来设计问题。 现在,组织回答的结构:先介绍变量作用,再分点说明各种定义方法,每种方法给出示例,然后覆盖优先级,最后相关问题。确保每个部分都有对应的引用标注,比如在host_vars部分引用2,命令行引用1,vault引用4,变量作用引用5等。 还要注意使用中文,LaTeX的正确格式,行内变量用$,比如变量名可能不需要,但如果有数学表达式的话需要注意。不过Ansible变量一般不会有数学表达式,可能不需要用LaTeX,但根据系统指令,所有行内数学表达式需要用$...$,所以如果有的话需要注意,比如在示例中如果有变量名可能不需要,但需要检查是否有数学内容。 最后,确保回答真实可靠,引用提供的资料中的信息,正确标注来源。例如,host_vars的示例来自引用2,命令行覆盖变量来自引用1,ansible-vault来自引用4。 可能还需要提到变量的作用域,比如主机变量组变量、全局变量等,以及如何在playbook中引用变量,比如{{ foo }}的语法。 总结一下,回答的结构应该是: 1. 变量定义方法: - Inventory内定义(不推荐,引用2) - host_vars/group_vars(推荐,引用2) - playbook中vars - 命令行-e参数(引用1) - Facts变量(引用3) 2. 变量优先级顺序 3. 示例代码块,比如host_vars的文件内容,playbook中使用变量 4. 加密变量(引用4) 5. 相关问题生成,基于各个引用内容和变量使用中的常见疑问 需要确保每个部分都有对应的引用标注,并且语言口语化,但符合中文语法,不使用Markdown格式,用自然的分段和标号。</think>### Ansible变量使用方法及示例 Ansible变量的核心作用是存储重复使用的值,简化配置管理并提高维护效率[^5]。以下从定义方式、优先级和实际应用三个层面说明其用法。 --- #### 一、变量定义方法 1. **Inventory内定义(不推荐)** 直接在`hosts`文件中定义变量,适用于简单场景,但不利于多主机管理[^2]: ```ini [web_servers] app1.example.com ansible_user=admin http_port=80 ``` 2. **host_vars与group_vars(推荐)** 在`/etc/ansible/`下创建`host_vars`和`group_vars`目录,按主机名或组名定义变量。例如为`app1.example.com`定义变量: ```yaml # /etc/ansible/host_vars/app1.example.com --- db_host: "192.168.1.10" max_connections: 200 ``` 组变量文件同理,文件名需与组名一致。 3. **Playbook中定义** 在Playbook的`vars`部分直接声明变量: ```yaml - hosts: web_servers vars: package_name: nginx tasks: - name: Install {{ package_name }} apt: name: "{{ package_name }}" ``` 4. **命令行覆盖变量** 使用`-e`参数临时覆盖变量,优先级最高[^1]: ```bash ansible-playbook deploy.yml -e "http_port=8080" ``` 5. **Facts变量** 通过`ansible_local`收集远程主机信息[^3]: ```bash ansible localhost -m setup -a "filter=ansible_local" ``` --- #### 二、变量优先级顺序 Ansible变量优先级从高到低为: 1. 命令行`-e`定义的变量 2. Playbook中`vars`定义的变量 3. `host_vars`和`group_vars`中的变量 4. Inventory文件中的变量 --- #### 三、实际应用示例 1. **加密敏感变量** 使用`ansible-vault`加密包含密码的变量文件[^4]: ```bash ansible-vault create secrets.yml ``` 文件内容: ```yaml --- db_password: "s3cr3tP@ss" ``` 2. **动态配置模板** 在Jinja2模板中引用变量: ```jinja2 ServerName {{ server_name }} Listen {{ http_port }} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值