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

邏輯裏面實現就行了,裏面記得做冪等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章