RHCE8 资料整理(十)三

第 31 章 变量的使用(二)

31.8 内置变量 groups

在ansible中,除了用户手动定义一些变量外,还有一些内置变量,这些变量不需要用户定义可以直接使用。

groups用于列出清单文件中所有定义的主机组及里面的主机,

[root@node-137 ansible]# cat 7-groups.yaml
---
- hosts: db1
  tasks:
  - name: xxx
    debug: msg={{groups}}
[root@node-137 ansible]# ansible-playbook 7-groups.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [xxx] ****************************************************************************************************************************
ok: [node-138] => {
    "msg": {
        "all": [
            "node-138",
            "node-140"
        ],
        "db1": [
            "node-138"
        ],
        "db2": [
            "node-140"
        ],
        "db3": [
            "node-138",
            "node-140"
        ],
        "ungrouped": []
    }
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

这里显示了清单文件中所有的主机组及里面的主机信息

如果仅想列出某个主机组,可以通过groups['主机组名']groups.主机组名来表示

[root@node-137 ansible]# cat 7-groups.yaml
---
- hosts: db1
  tasks:
  - name: xxx
    debug: msg={{groups.db1}}
  - name: yyy
    debug: msg={{groups['db2']}}
[root@node-137 ansible]# ansible-playbook 7-groups.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
ok: [node-138]

TASK [xxx] ****************************************************************************************************************************
ok: [node-138] => {
    "msg": [
        "node-138"
    ]
}

TASK [yyy] ****************************************************************************************************************************
ok: [node-138] => {
    "msg": [
        "node-140"
    ]
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

注意:groups['db2']中的引号不能省略,单双引号均可

31.9 内置变量 hostvars

hostvars用来显示指定主机的fact变量,用法如下,

hostvars['主机名'].键值

此变量一般用于,当某个play的hosts中只写了A主机组,但同时想在此play中显示B主机组中的信息,此时可以选择此变量

这里只能指定主机来获取fact变量,不能指定主机组

[root@node-137 ansible]# cat 8-hostvars.yaml
---
- hosts: db2
  gather_facts: true

- hosts: db1
  gather_facts: false
  tasks:
  - debug: msg={{hostvars['db2'].ansible_default_ipv4.address}}		#注意此处
[root@node-137 ansible]# ansible-playbook 8-hostvars.yaml

PLAY [db2] ****************************************************************************************************************************
...
ok: [node-140]

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: \"hostvars['db2']\" is undefined\n\nThe error appears to be in '/opt/ansible/8-hostvars.yaml': line 8, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n  - debug: msg={{hostvars['db2'].ansible_default_ipv4.address}}\n    ^ here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n    with_items:\n      - {{ foo }}\n\nShould be written as:\n\n    with_items:\n      - \"{{ foo }}\"\n"}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=0    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0
node-140                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

[root@node-137 ansible]# cat 8-hostvars.yaml
---
- hosts: db2
  gather_facts: true

- hosts: db1
  gather_facts: false
  tasks:
  - debug: msg={{hostvars['node-140'].ansible_default_ipv4.address}}	#注意此处
[root@node-137 ansible]# ansible-playbook 8-hostvars.yaml

PLAY [db2] ****************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************
...
ok: [node-140]

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "192.168.81.140"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
node-140                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

31.10 内置变量 inventory_hostname

这个变量记录了每个主机在清单文件中的名称

[root@node-137 ansible]# cat hosts
node-138
node-140

[db1]
node-138

[db2]
node-140

[db3:children]
db1
db2
[root@node-137 ansible]# cat 9-inventory.yaml
---
- hosts: db3
  gather_facts: false
  tasks:
  - debug: msg={{inventory_hostname}}
[root@node-137 ansible]# ansible-playbook 9-inventory.yaml

PLAY [db3] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "node-138"
}
ok: [node-140] => {
    "msg": "node-140"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
node-140                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

31.11 变量过滤器

所谓变量的过滤器,实际上就是对变量的值进行一些操作,例如,进行类型转化,截取,加密等操作,格式如下,

{{变量|函数}}

把大写字符转换成小写字符,如

[root@node-137 ansible]# cat 10-vars.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    aa: aa
    bb: BB
  tasks:
  - debug: msg={{bb|lower}}
  - debug: msg={{aa|upper}}
[root@node-137 ansible]# ansible-playbook 10-vars.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "bb"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "AA"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

常见的过滤器,如下

31.11.1 数字类型

整型int,可以把字符串转换成整型
浮点型float,可以把字符串转换成小数类型
绝对值abs,可以把负数转换成正数

[root@node-137 ansible]# cat 10-vars.yaml
---
- hosts: db1
  gather_facts: false
  tasks:
  - debug: msg={{3+('3'|int)}}
  - debug: msg={{3+('3'|float)}}
  - debug: msg={{-3|abs}}
[root@node-137 ansible]# ansible-playbook 10-vars.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "6"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "6.0"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "3"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
31.11.2 列表

列表的过滤器可以求出列表的长度,最大值,最小值
length,用于求列表的长度
max,用于求列表中的最大值
min,用于求列表的最小值
sort,排序
sum,求和
shuffle,打乱顺序显示

[root@node-137 ansible]# cat 10-vars1.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    list1: [1,3,"5",7,4,6,2,"ad",3.14,"|"]
  tasks:
  - debug: msg="list1:{{list1}}"
  - debug: msg="length:{{list1|length}}"
  - debug: msg="max:{{list1|max}}"
  - debug: msg="min:{{list1|min}}"
  - debug: msg="sort:{{list1|sort}}"
  - debug: msg="sum:{{list1|sum}}"
    ignore_errors: true
  - debug: msg="shuffle:{{list1|shuffle}}"
[root@node-137 ansible]# ansible-playbook 10-vars1.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "list1:[1, 3, u'5', 7, 4, 6, 2, u'ad', 3.14, u'|']"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "length:10"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "max:|"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "min:1"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "sort:[1, 2, 3, 3.14, 4, 6, 7, u'5', u'ad', u'|']"
}

TASK [debug] **************************************************************************************************************************
fatal: [node-138]: FAILED! => {"msg": "Unexpected templating type error occurred on (sum:{{list1|sum}}): unsupported operand type(s) for +: 'int' and 'AnsibleUnicode'"}
...ignoring

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "shuffle:[3.14, u'5', 6, 2, 7, 4, 3, u'|', 1, u'ad']"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=1

可以看到列表过滤器按照ASCII码进行计算,并且只计算首位

31.11.3 设置变量默认值default

如果某个变量没有被定义,那么可以通过default给它设置一个默认值,用法,

{{ var1 | default(value1) }}

如果变量var1已经被定义了,否则会被赋值为value1

[root@node-137 ansible]# cat 10-vars2.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    aa: 100
    bb: 200
  tasks:
  - debug: msg={{aa|default(111)}}
  - debug: msg={{bb|default(222)}}
  - debug: msg={{cc|default(333)}}
  
[root@node-137 ansible]# ansible-playbook 10-vars2.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "100"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "200"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "333"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
31.11.4 字符串相关

string,能把其他数据类型转换成字符串类型
capitalize,用于把字符串首字符转换成大写
upper,把小写字符串转换成大写
lower,把大写字符串转换成小写

[root@node-137 ansible]# cat 10-vars3.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    aa: abcdefg
    bb: ABCDEFG
    cc: 123456
  tasks:
  - debug: msg={{aa|capitalize}}
  - debug: msg={{bb|lower}}
  - debug: msg={{aa|upper}}
  - debug: msg={{cc|string}}
  - debug: msg={{123456}}
  - debug: msg='{{123456}}'
  - debug: msg={{"123456"}}
  - debug: msg={{'123456'}}
[root@node-137 ansible]# ansible-playbook 10-vars3.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "Abcdefg"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "abcdefg"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "ABCDEFG"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123456"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123456"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123456"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123456"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "123456"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=8    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

关注前几个函数即可

31.11.5 加密相关

有时候需要对字符串进行加密操作,例如,创建用户时给用户设定密码,就要用密文形式

求哈希值:hash,算法:md5sha1

[root@node-137 ansible]# cat 10-vars4.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    passwd: haha01
  tasks:
  - debug: msg={{passwd|hash('md5')}}
  - debug: msg={{passwd|hash('sha1')}}
  - debug: msg={{passwd|hash('sha512')}}
[root@node-137 ansible]# ansible-playbook 10-vars4.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "56433d003c7aae5f9d33b3a964751b94"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "56bed31bd19bc363ce992aa45eb9808e844b0b52"
}

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "e5eb574e00afc458cf074a665e0a59dee1c0f9faf64d39417a5e5f2a193987ca4d39fa30ce59d60f984aa683adf5087415b5ce3ce03aed40028b25c88b53c3c1"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

hash过滤器中的算法(md5或sha1等)需要用''单引号引起来

除了使用hash作为过滤器加密外,还可以使用password_hash作为过滤器,用法,

password_hash('算法名')
[root@node-137 ansible]# cat 10-vars4.yaml
---
- hosts: db1
  gather_facts: false
  vars:
    passwd: haha01
  tasks:
  - debug: msg={{passwd|password_hash('sha512')}}
[root@node-137 ansible]# ansible-playbook 10-vars4.yaml

PLAY [db1] ****************************************************************************************************************************

TASK [debug] **************************************************************************************************************************
ok: [node-138] => {
    "msg": "$6$r8h.egWSvkbXDLeo$ChfIk1UJOU3.8XBQhbOZjTvoOF.FsFZ1KM7/xx2Kpwnrh0weePg95qmoikx1HKfN1qzZ/ikdtYgb1oD/nPrb31"
}

PLAY RECAP ****************************************************************************************************************************
node-138                   : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

password_hash过滤器中的算法(md5或sha1等)同样需要用''单引号引起来

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值