ansible:变量调用set_fact和register


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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值