转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
前言
在上一篇文章《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: allgather_facts: yes #使用的系统变量,这里需要设置为yesvars:ip: "ip"hostname: "hostname"tasks:- name: description of hosttemplate:src: template.vars-test.j2dest: /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 Templatehosts: allgather_facts: novars:name: "name"age: "age"other:height: "height"hobby: "hobby"tasks:- name: description of sretemplate:src: template.vars-test.j2dest: /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 variablehosts: allgather_facts: notasks:- name: my testshell: 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 testhosts: "{{ hosts }}" #设置第一个变量gather_facts: novars:custom_variable: "{{ custom_command_variable }}" #设置第二个变量tasks:- name: echo variable msgdebug: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 variableshosts: allgather_facts: novars:custom_message: "Hello, SRE" #设置参数值tasks:- name: Display custom messagedebug: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 Templatehosts: allgather_facts: novars:name: "name"age: "age"other:height: "height"hobby: "hobby"tasks:- name: description of sretemplate:src: template.vars-test.j2dest: /tmp/sre.txt
[root@test101 ansible-test]#
3)执行yaml文件:
ansible-playbook test.yaml --extra-vars "name=sre age=18 height=155 hobby=work"
执行效果:
感谢您的喜爱与分享!