ansible处理一些逻辑请求思路

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

逻辑里面实现就行了,里面记得做幂等。

posted @ 2021-11-20 19:20  过去的我  阅读(107)  评论(0编辑  收藏  举报