在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']
中的引号不能省略,单双引号均可
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
这个变量记录了每个主机在清单文件中的名称
[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
所谓变量的过滤器,实际上就是对变量的值进行一些操作,例如,进行类型转化,截取,加密等操作,格式如下,
{{变量|函数}}
把大写字符转换成小写字符,如
[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
常见的过滤器,如下
整型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
列表的过滤器可以求出列表的长度,最大值,最小值
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码进行计算,并且只计算首位
如果某个变量没有被定义,那么可以通过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
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
关注前几个函数即可
有时候需要对字符串进行加密操作,例如,创建用户时给用户设定密码,就要用密文形式
求哈希值:hash
,算法:md5
或sha1
等
[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等)同样需要用
''
单引号引起来