1. 程式人生 > >ansible 模組自定義開發

ansible 模組自定義開發

def main():

    module = AnsibleModule(
        # not checking because of daisy chain to file module
        argument_spec=dict(
            src=dict(type='path'),
            original_basename=dict(type='str'),  # used to handle 'dest is a directory' via template, a slight hack
            content=dict(type='str', no_log=True),
            dest=dict(type='path', required=True),
            backup=dict(type='bool', default=False),
            force=dict(type='bool', default=True, aliases=['thirsty']),
            validate=dict(type='str'),
            directory_mode=dict(type='raw'),
            remote_src=dict(type='bool'),
            local_follow=dict(type='bool'),
            checksum=dict(),
        ),
        add_file_common_args=True,
        supports_check_mode=True,
    )

    src = module.params['src']
    b_src = to_bytes(src, errors='surrogate_or_strict')
    dest = module.params['dest']
    b_dest = to_bytes(dest, errors='surrogate_or_strict')
    backup = module.params['backup']
    force = module.params['force']
    original_basename = module.params.get('original_basename', None)
    validate = module.params.get('validate', None)
    follow = module.params['follow']
    mode = module.params['mode']
    remote_src = module.params['remote_src']
    checksum = module.params['checksum']

    if not os.path.exists(b_src):
        module.fail_json(msg="Source %s not found" % (src))
    if not os.access(b_src, os.R_OK):
        module.fail_json(msg="Source %s not readable" % (src))
    if os.path.isdir(b_src):
        module.fail_json(msg="Remote copy does not support recursive copy of directory: %s" % (src))

以上是copy模組例子

模組是一個獨立的, 可以複用的指令碼, 它可以被anisible API, Ansible 或者ansible-playbook使用.   在模組退出之前, 它通過輸出一個json字串到標準輸出從而反饋資訊給ansible.  你可以用任何一種語言去寫一個模組. 寫好的模組可以放在ANSIBLE_LIBRARY或者--module-path目錄下. 通常情況下playbook的目錄下的library目錄也可以做為模組的預設目錄.

1. 模組的基本開發模式

  一個簡單的模組, 之所以用這個作為例子, 是因為你可以用任何語言去開發自己的模組, 我們需要了解模組最基本的開發模式

複製程式碼

#!/usr/bin/python

import datetime
import json

date = str(datetime.datetime.now())
print json.dumps({
    "time" : date
})

複製程式碼

  模組測試

git clone git://github.com/ansible/ansible.git --recursive
source ansible/hacking/env-setup

ansible/hacking/test-module -m ./timetest.py

  模組引數

   ansible會自動的把引數儲存到一個引數檔案中, 所以我們必須讀取並分析這個檔案. 這個引數檔案只是一個字串, 所以任何形式的引數都是合法的.  

複製程式碼

#!/usr/bin/python

# import some python modules that we'll use.  These are all
# available in Python's core

import datetime
import sys
import json
import os
import shlex

# read the argument string from the arguments file
args_file = sys.argv[1]
args_data = file(args_file).read()

arguments = shlex.split(args_data)
for arg in arguments:

    # ignore any arguments without an equals in it
    if "=" in arg:

        (key, value) = arg.split("=")
        if key == "time":


            rc = os.system("date -s \"%s\"" % value)

            if rc != 0:
                print json.dumps({
                    "failed" : True,
                    "msg"    : "failed setting the time"
                })
                sys.exit(1)

            date = str(datetime.datetime.now())
            print json.dumps({
                "time" : date,
                "changed" : True
            })
            sys.exit(0)


date = str(datetime.datetime.now())
print json.dumps({
    "time" : date
})
測試模組
ansible/hacking/test-module -m ./timetest.py -a "time=\"March 14 12:23\""

複製程式碼

  二進位制模組

  二進位制模組的支援會在ansible2.2中加入,  當ansible發現是二進位制模組是, 它會提供一個json檔案argv[1]來儲存引數.

  提供facts的模組

  setup模組可以提供很多系統相關的變數, 然而使用者不修改系統模組也可以新增自定義變數, 只需要在模組的返回值中加入ansible_facts這個鍵值. 例如:

複製程式碼

{
    "changed" : True,
    "rc" : 5,
    "ansible_facts" : {
        "leptons" : 5000,
        "colors" : {
            "red"   : "FF0000",
            "white" : "FFFFFF"
        }
    }
}

開發一個site_facts的模組並且在所有的playbook之前呼叫是一個較好的習慣, 

複製程式碼

2. 通用的模組樣板

  如果你使用python來開發自定義模組, ansible提供了很多強大的快捷方式. 模組仍然儲存在一個檔案當中, 但是我們不需要再去處理引數檔案. 最好的學習方法是去學習ansible的核心模組.

from ansible.module_utils.basic import AnsibleModule
if __name__ == '__main__':
    main()

Note: 對於ansible2.1來說, 上面的匯入已經不能工作, 必須使用from ansible.module_utils.basic import *

複製程式碼

def main():
    module = AnsibleModule(
        argument_spec = dict(
            state     = dict(default='present', choices=['present', 'absent']),
            name      = dict(required=True),
            enabled   = dict(required=True, type='bool'),
            something = dict(aliases=['whatever'])
        )
    )
AnsibleModule 提供和很多通用的函式來處理返回值, 分析引數並允許你檢查輸入
成功返回
module.exit_json(changed=True, something_else=12345)
失敗退出
module.fail_json(msg="Something fatal happened")

還有很多其他的基礎功能, 課參看lib/ansible/module_utils/basic.py 

複製程式碼

  check模式

  模組支援check模式. 如果使用者在check模式下執行ansible, 模組會去嘗試預判change是否發生. 如果想定義一個check模組, 使用者必須在初始化模組的時候設定supports_check_mode=True

複製程式碼

module = AnsibleModule(
    argument_spec = dict(...),
    supports_check_mode=True
)

if module.check_mode:
    # Check if any changes would be made but don't actually make those changes
    module.exit_json(changed=check_if_system_state_would_be_changed())
作為模組的開發者, 你有責任去保證在check模式下沒有系統狀態被改變?
Remember that, as module developer, you are responsible for ensuring that no system state is altered when the user enables check mode.

如果你的模組不支援check模式, 而使用者卻在check模式下執行ansible, 你的模組會被自動跳過

複製程式碼

  在模組中永遠不要使用"print "some status message"".  因為在ansible中輸出被假定為一個可用的json.

  Modules must not output anything on standard error, because the system will merge standard out with standard error and prevent the JSON from parsing. Capturing standard error and returning it as a variable in the JSON on standard out is fine, and is, in fact, how the command module is implemented.

ANSIBLE_KEEP_REMOTE_FILES 這個引數會保留在遠端伺服器上執行的python指令碼. 可以用來debug.

相關推薦

ansible 模組定義開發

def main(): module = AnsibleModule( # not checking because of daisy chain to file module argument_spec=dict(

openERP筆記,定義開發模塊

客戶 自己 作者 開發 模式 desc 模塊開發 encoding 自動安裝 ##目標 OpenERP模塊基本結構 使用模塊添加額外的字段(Date Required和Rush Order) 擴展視圖, 讓OpenERP能夠顯示新的字段 修改用於OpenERP工作流的可用

Flume 定義開發方案

1:Avro Client MyApp.java import org.apache.flume.Event; import org.apache.flume.EventDeliveryException; import org.apache.flume.

Ansible修改定義埠和登入使用者

如下所示: [servers] host1 ansible_ssh_host=192.0.2.1 ansible_ssh_port=5555 ansible_ssh_user="user"   參考: https://ansible-tran.readthedocs.io/en/

小程式學習之旅---wxs模組定義方法

// pages/user/user.js Page({ /** * 頁面的初始資料 */ data: { d: '1500000000000' }, goShop () { wx.navigateTo({ url:

【cordova學習筆記02】定義開發外掛,外掛集成了谷歌的RS232通訊操作的程式碼

1、cordova開發的另外一個難點就在於如何自定義自己的外掛,將自己的原生Android程式碼抽離出來,做成外掛的形式整合到app。中。如何開發自定義外掛,請你先詳細地閱讀完這個網址:https://www.jianshu.com/p/02e17c392144裡面的內容。下

python 基礎logging模組定義封裝,同時輸出到本地資料夾以及python控制檯

# coding=utf-8 import logging import os import time import logging.handlers class TestLogger(object): def __init__(self, log_

定義開發一個android輪播圖控制元件BannerImg

app開發中經常會用到輪播圖控制元件,這裡乾脆自定義開發一個常用的元件(主要使用ViewPager+ImageLoader),以後每次呼叫時,用起來方便:) 先看下效果圖: 自定義的控制元件為BannerImg類,首先看佈局檔案 bannerimg.xml <?x

定義開發Spark ML機器學習類

初窺門徑 Spark的MLlib元件內建實現了很多常見的機器學習演算法,包括資料抽取,分類,聚類,關聯分析,協同過濾等等. 然鵝,內建的演算法並不能滿足我們所有的需求,所以我們還是經常需要自定義ML演算法. MLlib提供的API分為兩類: - 1.基於

Android定義開發SDK與呼叫

介紹以.jar/.aar包形式製作自己的SDK,並實現呼叫的過程。將使用OpenCV實現圖片灰度化的方式打包為.jar/.aar包,並實現呼叫,OpenCV使用JNI實現本地方法呼叫。建立一個module用於製作SDK,OpenCV環境搭建和程式碼編寫部分參考一下部落格:部落

cas 配置與定義開發

1. 下載 cas server 原始碼 https://github.com/Jasig/cas/releases 我下載的是 4.0.1。你也可以直接checkout cas client : http://downloads.jasig.org/cas-client

Python基礎之匯入Python模組+匯入第三方模組+定義模組

Python的模組匯入 Imporp random 匯入模組 Form random import randrange,random 詳細匯入 Import sys,os 多個匯入 匯入第三方模組 使用pip命令安裝 Pip install 模組名 安裝 P

定義開發ionic帶的日曆外掛ionic-datePicker

一、首先說一下如何將ionic-datePicker外掛引入到專案中:1. 在專案根目錄中:bower install ionic-datepicker --save  2. 下載完成後,在lib資料夾

SpringXD 定義Job模組開發

SpringXD中的Job實際即為Spring Batch中的Job,因此我們先按照Spring Batch的規範開發一個簡單的Job。 專案依賴: <dependencies> <dependency&

模組管理常規功能定義系統的設計與實現(56--開源開發測試版釋出 )

常規功能自定義模組管理系統(cfcmms)開發試用版釋出 此開發試用版中包括所有的前臺js程式碼(Extjs 4),後臺java的大部分開發原始碼(部分打包成了jar)。想要使用的使用者可以

cordova跨平臺app開發02_定義插件開發與安裝

xtend else callback 視頻 方法名 pty ges ray expect 視頻地址:http://t.cn/RacmXiy cordova的自定義插件由js、原生代碼文件(java、oc)、plugin.xml三部分組成。 cordvoa提供了命令來創

微信開發筆記-調用定義分享接口

彈出菜單 菜單 開發筆記 n-1 onf target ready 模式 時間戳 文章來自:http://www.cnblogs.com/ysyn/archive/2015/07/23/4665897.html 引言:   工作中開發微信網站,簡稱微網站。由於微

IDEA定義代碼模板,讓開發更快更快樂

ideaIDEA自定義代碼模板,讓開發更快更快樂IDEA中有個Live Template選項,就是用來自定義代碼模板,來提高編碼效率。1、創建模板,並做基本的變量配置,例如:@Service() $INTER$Impl $INTER${ Logger log = Logger.getLogger($I

定義PopupWindow開發

popupwindow近期工作需求,需要做一個彈出窗口,並且裏面包含2個設置項,一個進入詳細設置,一個快捷開關,界面如下: //目前常規的動畫設置,如下幾種mPopWindow.setAnimationStyle(Animation_Toast); 其中,可以設置的動畫值如下:AnimationAnim

php微信定義菜單開發

php menu wechat 微信自定義菜單需要有一個微信服務號,在開發之前需要獲取access_token,獲取方法很簡單,登陸微信公眾賬號,進入開發者模式,就可以看到{開發者憑據}:下面AppId和AppSecret,開發者文檔說明 :接口調用請求說明http請求方式: GEThttps:/