安裝的版本ansible版本<=2.7,<=2.8是不行的哦
安裝模塊
pip install ansible==2.7
先導出環境變量 我們自定義模塊的目錄.
我存放的目錄 export ANSIBLE_LIBRARY=/home/makeit/mylib/
把自己寫的模塊放到這個目錄中,ansible在執行的時候會讀取ANSIBLE_LIBRARY這個環境變量來查找對應的模塊文件.
例 我們新寫的模塊文件名 mydownload.py 那么我們的模塊名就是mydownload
這樣使用自定義模塊:
ansible all -m mydownload -a 'url=http://test.com/test.png dest=/tmp/test.png'
url=http://test.com/test.png 把 http://test.com/test.png 傳遞給 url
直接上代碼吧
#!/usr/bin/env python
#!coding:utf-8
from ansible.module_utils.basic import AnsibleModule
import requests,os
def main():
module=AnsibleModule(
argument_spec=dict(
url=dict(required=True,type='str'),
dest=dict(required=True,type='str')
)
)
if os.path.exists(module.params.get('dest')):
module.exit_json(changed=False)
return
rst=requests.get(module.params.get('url'))
if rst:
with open(module.params.get('dest'),'w') as f:
f.write(rst.content)
if os.path.exists(module.params.get('dest')):
module.exit_json(changed=True)
if __name__=='__main__':
main()
下面是用python腳本直接執行任務的實現
#!/usr/bin/env python
# coding: utf8
from ansible import __version__ as AV
if AV>=2.8:
print('實例代碼不支持2.8及以上平台運行')
exit(1)
import shutil
from collections import namedtuple
# DataLoader用於解析yaml/json/ini文件
from ansible.parsing.dataloader import DataLoader
# VariableManager用於分析ansible用到的變量
from ansible.vars.manager import VariableManager
# InventoryManager用於分析主機文件
from ansible.inventory.manager import InventoryManager
from ansible.playbook.play import Play
# task_queue_manager管理任務隊列
from ansible.executor.task_queue_manager import TaskQueueManager
import ansible.constants as C # ansible的常量
#創建元組,將選項加入,如:connection:連接,module_path:模塊路徑,forks:進程數量等
Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff'])
# 創建具體的實例對象
# connection有三個選擇local/ssh/smart
# local表示在本機執行,ssh表示通過ssh協議執行,smart表示自動選擇
options = Options(connection='smart', module_path=['/usr/share/ansible/plugins/modules/'], forks=10, become=True, become_method='sudo',become_user='root', check=False, diff=False)
loader = DataLoader() #負責查找和讀取YAML、JSON和INI文件
passwords = dict() # 用於存儲加密密碼、遠程連接密碼等
# 聲明被ansible管理的主機有哪些,可以把各主機用逗號分開形成字符串
# 也可以使用主機清單文件路徑,將路徑放到列表中
# inventory = InventoryManager(loader=loader, sources='localhost,')
inventory = InventoryManager(loader=loader, sources=['hosts'])
#變量管理器負責合並所有不同的源,從而為每個上下文提供變量的統一視圖。
variable_manager = VariableManager(loader=loader, inventory=inventory)
#腳本執行時屏幕顯示的結果結構及信息
play_source = dict(
name="Ansible Play", # Play名稱
# hosts='localhost', # 在哪些主機上執行命令
hosts='k8s', # 在上面inventory定影的myansi/hosts中查找
gather_facts='no', # 不收集主機信息
tasks=[
# 以下是執行的命令
dict(action=dict(module='yum', args='name=httpd state=latest'), register='shell_out'),
#dict(action=dict(module='debug', args=dict(msg='{{shell_out}}')))
]
)
#上面導入的對象,play_source執行的任務有哪些,變量到的分析
play = Play().load(play_source, variable_manager=variable_manager, loader=loader)
tqm = None
try:
#tqm是taskQueueManager任務管理器生成的實例
tqm = TaskQueueManager(
inventory=inventory, #主機清單
variable_manager=variable_manager, #參數管理
loader=loader, #json等語法分析
options=options, #選項
passwords=passwords, #密碼
)
result = tqm.run(play) # tqm實例中的run方法開始執行play中的任務
finally:
if tqm is not None: #如果tqm不為none
tqm.cleanup() #清理
shutil.rmtree(C.DEFAULT_LOCAL_TMP, True) #刪除ansible執行任務是生成的臨時目錄
