目录标题
1. 在tasks内部调用变量,使用set_fact
[root@server4 ~]# cat bl2.yml
---
- hosts: testB
remote_user: root
tasks:
- set_fact: # 在tasks内部调用变量,使用set_fact
testvar: "test"
- debug:
msg: "{{testvar}}"
测试:
[root@server4 ~]# ansible-playbook bl2.yml
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [set_fact] ****************************************************************
ok: [server3]
TASK [debug] *******************************************************************
ok: [server3] => {
"msg": "test"
}
PLAY RECAP *********************************************************************
server3 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2. 使用set_fact调用register中的值
当shell执行完后,使用register获取shell的运行结果存放到shellreturn这个变量中,shellreturn是一个key value字典,输出形式为shellreturn.stdout
[root@server4 ~]# cat bl3.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: test1
tasks:
- shell: "echo test2"
register: shellreturn
- set_fact:
testf1: "{{testvar1}}"
testf2: "{{shellreturn.stdout}}"
- debug:
msg: "{{testf1}} {{testf2}}"
测试:
[root@server4 ~]# ansible-playbook bl3.yml
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [shell] *******************************************************************
changed: [server3]
TASK [set_fact] ****************************************************************
ok: [server3]
TASK [debug] *******************************************************************
ok: [server3] => {
"msg": "test1 test2"
}
PLAY RECAP *********************************************************************
server3 : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
3. 只有set_fact定义的变量才能在不同的play中应用,而vars定义的变量不能在不同的play中应用
[root@server4 ~]# cat bl4.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: tv1 # 不可以被调用
tasks:
- set_fact:
testvar2: tv2 # 可以备调用
- debug:
msg: "{{testvar1}}----{{testvar2}}"
- hosts: testB
remote_user: root
tasks:
- name: get testvar2
debug:
msg: "{{testvar2}}"
- name: get testvar1
debug:
msg: "{{testvar1}}"
测试:
[root@server4 ~]# ansible-playbook bl4.yml
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [set_fact] ****************************************************************
ok: [server3]
TASK [debug] *******************************************************************
ok: [server3] => {
"msg": "tv1----tv2"
}
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [get testvar2] ************************************************************
ok: [server3] => {
"msg": "tv2" # 表明只有testvar2可以备调用,因为是set_fact定义的变量
}
TASK [get testvar1] ************************************************************
fatal: [server3]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'testvar1' is undefined\n\nThe error appears to be in '/root/bl4.yml': line 18, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n msg: \"{{testvar2}}\"\n - name: get testvar1\n ^ here\n"}
PLAY RECAP *********************************************************************
server3 : ok=5 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
4. register的注册变量也可以传递到不同的play中
[root@server4 ~]# cat bl5.yml
---
- hosts: testB
remote_user: root
vars:
testvar1: tv1 # 在下面的play中不可以使用
tasks:
- shell: "echo tv2"
register: testvar2 # 在下面的play中可以使用
- debug:
msg: "{{testvar1}}----{{testvar2.stdout}}"
- hosts: testB
remote_user: root
tasks:
- name: get testvar2
debug:
msg: "{{testvar2.stdout}}"
- name: get testvar1
debug:
msg: "{{testvar1}}"
测试:
[root@server4 ~]# ansible-playbook bl5.yml
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [shell] *******************************************************************
changed: [server3]
TASK [debug] *******************************************************************
ok: [server3] => {
"msg": "tv1----tv2"
}
PLAY [testB] *******************************************************************
TASK [Gathering Facts] *********************************************************
ok: [server3]
TASK [get testvar2] ************************************************************
ok: [server3] => {
"msg": "tv2" # register定义的tv2可以被调用
}
TASK [get testvar1] ************************************************************
fatal: [server3]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'testvar1' is undefined\n\nThe error appears to be in '/root/bl5.yml': line 18, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n msg: \"{{testvar2.stdout}}\"\n - name: get testvar1\n ^ here\n"}
PLAY RECAP *********************************************************************
server3 : ok=5 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0