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
邏輯裏面實現就行了,裏面記得做冪等。