ansible之t_fact
⽂章⽬录
通过t_fact定义变量
t_fact是⼀个模块,我们可以通过t_fact模块在tasks中定义变量,先来看⼀个⼩⽰例,如下
---
- hosts: test70
remote_ur: root
tasks:
- t_fact:
testvar: "testtest"
- debug:
msg: "{{testvar}}"
如上例所⽰,我们通过t_fact模块定义了⼀个名为testvar的变量,变量值为testtest,然后使⽤debug模块输出了这个变量。
是不是很简单,通过t_fact模块就能够在tasks中定义变量了,我们也可以通过t_fact将⼀个变量的值赋予另⼀个变量,⽰例如下---
- hosts: test70
remote_ur: root
vars:
testvar1: test1_string
tasks:
- shell: "echo test2_string"
register: shellreturn
- t_fact:
testsf1: "{{testvar1}}"
testsf2: "{{shellreturn.stdout}}"
- debug:
msg: "{{testsf1}} {{testsf2}}"
上例中,我们先定义了⼀个变量testvar1,⼜使⽤register将shell模块的返回值注册到了变量shellreturn中,
之后,使⽤t_fact模块将testvar1变量的值赋予了变量testsf1,将shellreturn变量中的stdout信息赋值给了testsf2变量,
最后,使⽤debug模块输出了testsf1与testsf2的值。
如上述⽰例所⽰,t_fact模块可以让我们在tasks中创建变量,也可以将⼀个变量的值赋值给另⼀个变量。
其实,通过t_fact模块创建的变量还有⼀个特殊性,通过t_fact创建的变量就像主机上的facts信息⼀样,可以在之后的play中被引⽤,什么意思呢?我们慢慢聊。
前⽂中已经总结过,默认情况下,每个play执⾏之前都会执⾏⼀个名为”[Gathering Facts]”的默认任务,这个任务会收集对应主机的相关信息,我们可以称这些信息为facts信息,我们已经总结过怎样通过变量引⽤这些facts信息,此处不再赘述,⽽通过t_fact模块创建的变量可以在之后play中被引⽤,就好像主机的facts信息可以在play中引⽤⼀样,这样说可能还是不是特别容易理解,不如来看⼀个⼩例⼦,如下
---
- hosts: test70
remote_ur: root
vars:
testvar1: tv1
tasks:
- t_fact:
testvar2: tv2
- debug:
msg: "{{testvar1}} ----- {{testvar2}}"
- hosts: test70
remote_ur: root
tasks:
- name: other play get testvar2
debug:
msg: "{{testvar2}}"
- name: other play get testvar1
debug:
msg: "{{testvar1}}"
上例中⼀共有两个play,第⼀个play中,我们通过两种⽅式创建了两个变量,第⼀个变量testvar1使⽤vas关键字创建,第⼆个变量使⽤t_fact创建。
如果执⾏上例的playbook,可以发现,这两个变量在第⼀个play中都可以正常的输出。但是在第⼆个play中,testvar2可以被正常输出了,testvar1却不能被正常输出,会出现未定义testvar1的错误,因为在第⼀个play中针对test70主机进⾏操作时,testvar1是通过vars 关键字创建的,⽽testvar2是通过t_fact创建的,所以testvar2就好像test70的facts信息⼀样,可以在第⼆个play中引⽤到,⽽创建testvar1变量的⽅式则不能达到这种效果,虽然testvar2就像facts信息⼀样能被之后的play引⽤,但是在facts信息中并不能找到
testvar2,只是”效果上”与facts信息相同罢了。
前⽂已经总结了注册变量的⽤法,其实注册变量也可以在之后的play操作同⼀主机时被调⽤到,⽰例如下
---
- hosts: test70
remote_ur: root
vars:
testvar3: tv3
tasks:
- shell: "echo tv4"
register: testvar4
- debug:
msg: "{{testvar3}} -- {{testvar4.stdout}}"
- hosts: test70
remote_ur: root
tasks:
- name: other play get testvar4
debug:
msg: "{{testvar4.stdout}}"
- name: other play get testvar3
debug:
msg: "{{testvar3}}"
执⾏上例的playbook时,在第⼆个play中获取”testvar3″时会报错,⽽在第⼆个play中获取注册变量”testvar4″时则正常,但是,注册变量中的信息是模块的返回值,这并不是我们⾃定义的信息,所以,如果想要在tasks中给变量⾃定义信息,并且在之后的play操作同⼀个主机时能够使⽤到之前在tasks中定义的变量时,则可以使⽤t_facts定义对应的变量。