ansible-playbook 变量定义

目录

–extra-vars

vars

单独变量文件

inventory 文件定义变量

注册变量

内置变量

变量优先级

变量定义建议


Ansible 中有多种不同的途径来定义变量:

–extra-vars

在运行playbook时,使用extra-vars选项指定额外的变量

# ansible-playbook example.yml --extra-vars "foo=Bertram"

vars

使用vars代码块

# cat playbook.yml
---
- hosts: example
  vars:
    foo: bar
  tasks:
    # print "Variable 'foo' is set to bar ".
    - debug: msg="Variable 'foo' is set to {{ foo }}"

单独变量文件

使用代码块vars_files 来调用独立文件vars.yml,获取其中的变量foo

# cat vars.yml
---
foo: bar
# cat playbook.yml
---
- hosts: all
  vars_files:
    - vars.yml
  tasks:
    - debug: msg="Variable 'foo' is set to {{ foo }}"

 注意: 在 vars.yml 文件中,定义变量的代码是顶格写的。这就是当变量被独立出来定义时的一个特殊之处,即当在独立文件中定义变量时,变量可在YAML中顶格进行定义,也不需要vars标识。

inventory 文件定义变量

在 Ansible 中,Inventory 文件通常是指 Ansible 的主机和组的定义文件 Hosts(默认路径为/etc/ansible/hosts,简称Hosts文件)。在 Hosts 文件中,变量会被定义在主机名的后面或组名的下方,如下面这个例子所示:

[shanghai]
app1.example.com proxy_state=present 
app2.example.com proxy_state=absent 
#为主机组指定变量,作用范围为整个主机组
[shanghai: vars]
cdn_host=sh.static.example.com api_version=3.0

在 Inventory 文件中直接定义变量方法虽然简单直观,但当所需要定义的变量多,并且在被多台主机同时应用的时候,这种方法就会显得非常麻烦。而且,事实上,Ansible 的官方手册中也并不建议人们把变量直接定义在 Hosts 文件中。
在执行 Ansible 命令时,Ansible 默认会从/etc/ansible/host_vars/ 和 /etc/ansible/group_vars/ 两个目录下读取变量定义,如果/etc/ansible 下面没有这两个目录,可以直接手动创建,并且可以在这两个目录中创建与 Hosts 文件中主机名或组名同名的文件来定义变量。
举例来说,我们现在要给主机 app1.example.com 设置一组变量,那就可以直接在/etc/ansible/host_vars/ 目录下创建一个名为 app1.example.com 的空白文件,然后在文件中以 YAML 语法来定义所需的变量,如以下代码所示:

# cat /etc/ansible/host_vars/app1.example.com
---
foo: bar
baz: qux

如此一来,变量 foo 和 baz 将自动定义给主机 app1.example.com。

同理,要想针对整个 shanghai 主机组定义一些变量,则只需在/etc/ansible/group_vars/目录下创建与主机组同名的 YAML 文件来定义变量就可以了:

# cat /etc/ansible/group_vars/group_example
---
admin: layne

也可以在/etc/ansible/group_vars 和/etc/ansible/host_vars 两个目录下定义all文件,来一次性为所有的主机组和主机定义变量

注册变量(register)

注册变量,其实就是将操作的结果,包括标准输出和标准错误输出,保存到变量中,然后再根据这个变量的内容来决定下一步的操作,在
这个过程中用来保存操作结果的变量就叫注册变量。我们在 Playbook 中使用 register 来声明一个变量为注册变量。

[root@web ansible-playbook]# cat register.yml
---
- hosts: tests
  gather_facts: no
  remote_user: root
  vars:
    - work_dir: /usr/local
    - nginx_version: 1.15.1

  tasks:
  - name: register var
    command: date +"%F_%T"
    register: datetime

  - name: touch file
    file:
      dest: /tmp/r_{{datetime.stdout}}
      state: touch
//执行register配置文件
[root@web ansible-playbook]# ansible-playbook  register.yml 

PLAY [tests] *********************************************************************************************************

TASK [register var] **************************************************************************************************
changed: [192.168.1.131]

TASK [touch file] ****************************************************************************************************
changed: [192.168.1.131]

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

//验证tmp下是否创建了文件
[root@web ansible-playbook]# ansible tests -m shell -a "ls /tmp | grep r_"
192.168.1.131 | CHANGED | rc=0 >>
Backup_server_config_files_tmp
r_2020-11-09_14:06:22

内置变量

  1. hostvars
  2. groups
  3. group_names
  4. inventory_hostname
  5. play_hosts
  6. inventory_hostname_short

变量优先级

变量优先级由高到低如下:

  1. 在命令行中定义的变量(即用 -e 定义的变量);
  2. 在 Inventory 中定义的连接变量(比如ansible_ssh_user);
  3. 大多数的其他变量(命令行转换、play中的变量、included 的变量、role 中的变量等);
  4. 在 Inventory 定义的其他变量;
  5. 由系统通过 gather_facts 方法发现的 Facts;
  6. “Role 默认变量”, 这个是默认的值,很容易丧失优先权。

变量定义建议

  1. Role中的默认变量应设置得尽可能的合理,因为它优先级最低
  2. Playbook 中应尽量少地定义变量,Playbook 中用的变量应尽量定义在专门的变量文件中,通过 vars_files 引用,或定义在 Inventory 文件中
  3. 只有真正与主机或主机组强相关的变量才定义在 Inventory 文件中
  4. 应尽量少地在动态或静态的 Inventory 源文件中定义变量,尤其是不要定义那些很少在 Playbook 中被用到的变量
  5. 应尽量避免在命行中使用 -e 选项来定义变量。只有在我们不用去关心项目的可维护性和任务幂等性的时候,才建议使用这种变量定义方式。比如只是做本地测试,或者运行一个一次性的 Playbook 任务。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_狂奔者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值