ansible处理一些逻辑请求思路
我发现ansible处理一些没有模块能用的那种带逻辑判断的任务,比较难处理。比如说做swap这种,
- stat: path=/data/swap
register: s
然后再判断s 是否存在
- shell: dd if=/dev/zero of=/eastmoney/swap bs=1G count=16
when: s.stat.exists
然后发现stat 模块也是超级慢的。如果你的文件够大的话,比如上面这个16G文件(当然这是比较极端的情况)。
因为ansible源码, /usr/lib/python2.7/site-packages/ansible/modules/files/stat.py
def main():
module = AnsibleModule(
argument_spec=dict(
path=dict(type='path', required=True),
follow=dict(type='bool', default=False),
get_md5=dict(type='bool', default=False),
get_checksum=dict(type='bool', default=True),
get_mime=dict(type='bool', default=True, aliases=['mime', 'mime_type', 'mime-type']),
get_attributes=dict(type='bool', default=True, aliases=['attr', 'attributes']),
checksum_algorithm=dict(type='str', default='sha1',
choices=['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'],
aliases=['checksum', 'checksum_algo']),
),
supports_check_mode=True,
)
get_checksum 默认是true的,
# checksums
if output.get('isreg') and output.get('readable'):
# NOTE: see above about get_md5
if get_md5:
# Will fail on FIPS-140 compliant systems
try:
output['md5'] = module.md5(b_path)
except ValueError:
output['md5'] = None
if get_checksum:
output['checksum'] = module.digest_from_file(b_path, checksum_algorithm)
如果isreg 并且readable ,就会计算checksum ,大文件计算一遍要很久,其实纯的stat调用是不会扫整个文件的,但是ansbile的模块里加了checksum的逻辑,一种当然是设成false即可,当时没细看,
然后发现用script结合 shell很好实现:
if [ -f /data/swap ]; then
echo "文件存在"
#statements
else
dd if=/dev/zero of=/data/swap bs=1G count=16
chmod 600 /data/swap
mkswap /data/swap
swapon /data/swap
fi
playbook里直接script 即可:
- script: doswap.sh
逻辑里面实现就行了,里面记得做幂等。