Ansible常用变量【下】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


前言

在上一篇文章《Ansible常用变量【上】》中,学习了Ansible常用变量的前半部分,放了个五一假,继续学习Ansible常用变量的后半部分:

1. 模版中使用变量——在模版文件中使用自定义变量和系统变量;

2. 注册变量——把任务的运行结果作为一个变量来使用;

3. 额外变量——为了使playbook更灵活,通用性更强,允许用户在执行playook时传入变量的值,这时候就需要用到“额外变量”。

1. 模版中使用变量

在template模版文件中使用变量可以使用Facts系统变量,也可以使用用户自定义的变量。

1.1 在模版文件中引用系统变量

1)创建一个jinja2文件:

[root@test101 ansible-test]# cat template.vars-test.j2
my ip is: {{ ansible_host }}
my hostname is: {{ ansible_nodename }}
[root@test101 ansible-test]# 

2)创建yaml文件:

[root@test101 ansible-test]# cat test.yaml
---
- name: Example Playbook with Template(Fcts)
  hosts: all
  gather_facts: yes  #使用的系统变量,这里需要设置为yes
  vars:
    ip: "ip"
    hostname: "hostname"

  tasks:
    - name: description of host
      template:
        src: template.vars-test.j2
        dest: /tmp/host.txt
[root@test101 ansible-test]#

3)执行playbook:

ansible-playbook test.yaml

执行效果:

1.2 在模板文件中使用自定义变量

在模版文件中也可以使用自定义变量,例如:

1)创建一个j2文件:

[root@test101 ansible-test]# cat template.vars-test.j2
name: "sre"
age: "18"
other:
  height: "155"
  hobby: "work"
[root@test101 ansible-test]#

2)创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml
---
- name: Example Playbook with Template
  hosts: all
  gather_facts: no
  vars:
    name: "name"
    age: "age"
    other:
      height: "height"
      hobby: "hobby"

  tasks:
    - name: description of sre
      template:
        src: template.vars-test.j2
        dest: /tmp/sre.txt
[root@test101 ansible-test]#

3)执行文件:

ansible-playbook test.yaml

执行效果:

2. 注册变量

有些场景下会需要把执行结果注册到变量中,然后在后面的任务中可调用,这时候就需使用关键字register。

例如,创建一个yaml:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Ansible playbook with registered variable
  hosts: all
  gather_facts: no

  tasks:
    - name: my test
      shell: echo "This is SRE's test"
      register: my_test_output

    - name: echo the result of "my test"
      debug:
        msg: "The output of 'my test' was '{{ my_test_output.stdout }}.'"
[root@test101 ansible-test]#

执行命令:

ansible-playbook test.yaml

执行效果:

3. 额外变量

有时为了让playbook的使用更加灵活,更具有通用性,会允许用户在执行playbook的时候传入变量的值,这时候就需要用到“额外变量”。

3.1 无初始值自定义变量

有时候在yaml文件中只定义变量,没有默认值,等待用户执行yaml时传参。

例如,创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: my custom_variable test
  hosts: "{{ hosts }}"  #设置第一个变量
  gather_facts: no
  vars:
    custom_variable: "{{ custom_command_variable }}"   #设置第二个变量

  tasks:
    - name: echo variable msg
      debug:
        msg: "{{ custom_variable }}"
[root@test101 ansible-test]#

传参执行yaml,有三种方式:

① 普通格式传参执行:

ansible-playbook test.yaml --extra-vars "hosts=all custom_command_variable='this is a test of custom variable'"

② 使用json格式传参执行:

ansible-playbook test.yaml --extra-vars "{'hosts':'all', 'custom_command_variable':'this is a test of custom variable'}"  

③ 将参数放在文件中引用传参执行:

[root@test101 ansible-test]# ll
total 8
-rw-r--r-- 1 root root 229 May 11 08:49 test.yaml
-rw-r--r-- 1 root root  85 May 11 08:57 vars-test.json   #创建参数json文件
[root@test101 ansible-test]# 
[root@test101 ansible-test]# cat vars-test.json    #文件内容
{
  "hosts":"all",
  "custom_command_variable":"this is a test of custom variable"
}
[root@test101 ansible-test]# 
[root@test101 ansible-test]# ansible-playbook test.yaml --extra-vars "@vars-test.json"   #执行命令引用文件传参

执行结果:

3.2 用传参覆盖变量原有值

有些场景下定义了变量之后,会给变量设置一个初始值,这时候如果再传参进去,就会将原有的初始值覆盖掉。

例如,创建一个yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Test playbook with custom variables
  hosts: all
  gather_facts: no
  vars:
    custom_message: "Hello, SRE"  #设置参数值
  tasks:
    - name: Display custom message
      debug:
        msg: "{{ custom_message }}"  #参数调用
[root@test101 ansible-test]#

传参执行yaml文件:

ansible-playbook test.yaml  --extra-vars "custom_message='This is a new message'

执行效果:

最后打印的不是变量的初始值,而是执行yaml时传进去的参数值。但如果在模板文件中,j2文件中的变量值优先级会高于执行命令时传的参数。

3.3 在模板文件中使用额外变量

1)创建一个jinja2文件:

[root@test101 ansible-test]# cat template.vars-test.j2 
name: {{ name }}
age: {{ age }}
other:
  height: {{ height }}
  hobby: {{ hobby }}
[root@test101 ansible-test]#

2)创建一个执行的yaml文件:

[root@test101 ansible-test]# cat test.yaml 
---
- name: Example Playbook with Template
  hosts: all
  gather_facts: no
  vars:
    name: "name"
    age: "age"
    other:
      height: "height"
      hobby: "hobby"

  tasks:
    - name: description of sre
      template:
        src: template.vars-test.j2
        dest: /tmp/sre.txt
[root@test101 ansible-test]#

3)执行yaml文件:

ansible-playbook test.yaml --extra-vars "name=sre age=18 height=155 hobby=work"

执行效果:

感谢您的喜爱与分享!

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值