δÀ´´Ó²»Ò£Ô¶¡£ÔÚδÀ´£¬ÖÇÄÜ»¯µÄ¼ÆËãÉ豸ÎÞ´¦²»ÔÚ£¬ÎÒÃǵÄÃÎÏëÒѾÂýÂý¿ªÊ¼ÊµÏÖ¡£½ñÌ죬ÖÇÄÜ»¯µÄ²Ù×÷ϵͳÒѾǶÈë¼ÆËã»úºÍÊÖ»ú£¬ÈçLinux ºÍ Windows ¡£Ê©ÀÖÑо¿ÖÐÐĵÄMark Weiser ÔøÐ´µÀ:
"×îÓÐÉîÔ¶ÒâÒåµÄ¼¼ÊõÊÇÄÇÐ©ËÆºõÏûʧµÄ¼¼Êõ¡£ÒòΪËüÃÇÒѾ½øÈ뵽ÿÌìÉú»îÖеķ½·½ÃæÃ棬ÈÚΪһÌ壬ֱµ½ÎÞ·¨Çø·Ö³öÀ´¡£"
½ñÌìºÜ¶àÈËÔÚ̸ÂÛÔÆ¼ÆË㣬²¢ÈÏΪËüÊÇÃÎÏëµÄÁíÒ»ÖÖÏÔÏÖ£¬ÄÇʱ¼ÆËã»úÎÞ´¦²»ÔÚ£¬¸üÈ·ÇеÄ˵¼ÆËã»ú¸²¸ÇÁËÊÀ½çÉÏËùÓеÄÊý¾ÝÖÐÐÄ£¬²»Ö»Êǰ칫ÊҺͼÒÀï¡£ÕâÊÇÈüÆËã»úʹÓýøÈëÎÒÃÇËùÐèÒªÁìÓòµÄÒ»¸ö·½Ãæ¡£Èκμ¼ÊõµÄ»ù´¡ÊÇÐèÒªÓÐÄܹ»Ö´ÐдóÁ¿×¼È·ÅäÖõŤ¾ß¡£Cfengine ¾ÍÊÇÕâÑùµÄÒ»ÖÖ¹¤¾ß¡£
ÔÚÈκεÄϵͳ»·¾³ÖУ¬Cfengine ¿ÉÒÔΪÕû¸öϵͳµÄÉúÃüÖÜÆÚ½øÐпÉÀ©Õ¹µÄÅäÖùÜÀí ¡£¼¸ºõËùÓÐÆäËûµÄϵͳÅäÖö¼ÉèÏëÓÐÒ»¸öÎȶ¨¿É¿¿µÄÍøÂç²¢ÇÒÄܹ»´Óһ̨ȨÍþµÄÖ÷·þÎñÆ÷ÖÁÉ϶øÏµÄÕ¹¿ª¸üÐÂÅäÖá£ÕâЩϵͳÔÚÈçÏµĻ·¾³ÖÐÊÇûÓÐÓõģº
l ´øÓоֲ¿µÄ»òÕß²»¿É¿¿µÄÍøÂçÁ¬½ÓµÄÒÆ¶¯ÏµÍ³£¨ÀýÈ磬DZˮͧ£©
l ÍøËÙºÜÂýµÄ¼ÆËã»úϵͳ£¨ÀýÈ磬ÎÀÐÇ»òº½Ìì̽²âÆ÷£©
l ¼ÆËã»úµçÁ¿ºÜµÍµÄ¼ÆËã»úϵͳ£¨ÀýÈç£¬ÒÆ¶¯¸ÐÓ¦Æ÷»ò³ø·¿É豸£©
Cfengine ²»ÐèÒª¿É¿¿µÄ»ù´¡ÉèÊ©¡£Ëü¼¸ºõ¿ÉÒÔÔÚÈκλ·¾³ÖÐÔËÐУ¬²¢ÇÒ²»ºÄ×ÊÔ´£¬Ã»ÓÐÈí¼þÒÀÀµÐÔ¡£ Òò´Ë£¬Ëü²»½ö¿ÉÒÔÔÚËùÓеĴ«Í³¼Æ»®µÄÇé¿öÖÐÔËÐУ¬²¢ÇÒÄܹ»ÔÚÍêÈ«ÒÆ¶¯µÄÅäÖÃÖÐÔËÐУ¬ÈçÁÙʱµÄʹʰ칫ÊÒ£¬Æ¯Á÷µÄDZˮͧ£¬ÎÀÐÇ»ò»úÆ÷ÈË̽²â³µ¡£
ÓÐÈ˻ᷴ¶Ô˵£º¡°ºÃ°É£¬µ«ÎÒ²»ÐèÒªÕâÑùµÄϵͳ, ÒòΪÎÒµÄÍøÂçºÜ¿É¿¿¡£¡±È»¶ø£¬ÄãµÄÍøÂç²¢²»ÊÇÄãÏëµÄÄÇô¿É¿¿£¬²¢ÇÒÍøÂçµÄÒÆ¶¯ÐÔÊÇÒ»¸öÔ½À´Ô½ÖØÒªµÄ»°Ìâ¡£¼´Ê¹ÊÇÒ»¸ö·Ç³£ÈßÓàµÄÍøÂ磬֧³ÖÍøÂçµÄÄÇЩÉ豸Ҳ¿ÉÄÜÒòΪÆäÖÐÈÎÒâһ̨µÄÉ豸Öж϶øÏÝÈëϵͳ̱»¾µÄ״̬¡£ÔÚÏÖ´úÆÕ±éµÄϵͳ»·¾³ÖУ¬ÏµÍ³Äܹ»³ÖÓпÉÐÐÐÔ£¬ÈÝ´íÐÔ£¬²¢¾¡¿ÉÄܵĶÀÁ¢ÓÚÍⲿÌõ¼þÏÞÖÆ£¬ÊǷdz£ÖØÒªºÍ¹Ø¼üµÄ¡£Õâ¾ÍÊÇÈçºÎ½¨Á¢¿ÉÀ©Õ¹µÄ£¬¿É¿¿µÄ·þÎñ¡£
Cfengine ¿ÉÒÔÔÚÄãËùÈÏΪµÄ¸÷¸öµØ·½¹¤×÷£¬ÉõÖÁËùÓÐÄ㻹ûÓÐÏë¹ýµÄеط½ÔËÐС£ÎÒÃÇÈçºÎÄÜÖªµÀ£¿ÒòΪËüÊÇ»ùÓÚ20¶àÄêµÄϸÐÄÑо¿ºÍʵ¼ù¡£
ÔÚϵͳ¹ÜÀíÖÐ×îÀ§ÄѵÄÊÂÇéÖ®Ò»ÊÇÈÃÿһ̨¼ÆËã»úÃ÷°××Ô¼ºµÄ½ÇÉ«ºÍÈÎÎñ£¬²¢½ÓÄܹ»ÒÀ¿¿ÆäËûµÄ¼ÆËã»úÖ´ÐÐÏàͬµÄÈÎÎñ ¡£ÐÅÈμÈʡǮÓÖʡʱ¼ä¡£Èç¹ûÄã²»ÐÅÈΣ¬Äã±ØÐëȥ֤ʵ£¬ÕâÑùµÄ´ú¼ÛÊǺܸߵġ£
ΪÁËÔö½øÐÅÈÎÎÒÃÇÐíϳÐŵ¡£³ÐŵÊÇÖ¼ÔÚÒÔijÖÖ·½Ê½À´Ðж¯±íÏÖµÄÎļþÖ¤Êé¡£²»¹ÜËüÃÇÊÇ»úÆ÷»¹ÊÇÈËÀ࣬ÎÒÃÇÐèҪѧϰ³ÐŵÀ´ÐÅÈÎϵͳ¡£
Ò»¸öCfengine µÄÓû§Ôø¾¶ÔÎÒ˵£¬Cfengine»ùÓÚ×ÔÖ÷ºÏ×÷µÄÉè¼ÆÔø¾×î´ó°ïÖúËûÅäÖÃCfengine ."ÎÒÃǵÄÖ÷ÒªÎÊÌâ²»ÊǼ¼ÊõÎÊÌ⣬¶øÊÇÕþÖÎÎÊÌ⣬¼´ÒªÈÃÊÀ½çÉÏÿһ¸ö²¿ÃŵÄÿһ¸öÈ˶¼Í³Ò»Òâ¼û ¡£" ¶ÔÓÚËùÓеļ¼Êõ¶øÑÔ£¬ÕâÊÇÒòΪÄÇЩ×ö¾ö¶¨µÄÈËÐèÒª¸Ð¾õµ½ÏµÍ³ÊÚȨÓÚËûÃÇ£¬¶ø²»ÊÇÏÞÖÆËûÃÇ¡£
Cfengine ÊÇÒÔ¼òµ¥µÄ³ÐŵÀíÄîÀ´¹¤×÷µÄ¡£ÎÒÃÇ¿ÉÒÔÈÏΪCfengine ÖеÄËùÓÐÒ»ÇÐÊÇÒ»¸öͨ¹ýϵͳ²»Í¬×ÊÔ´À´Î¬³ÖµÄ³Ðŵ¡£
½«³ÐŵºÍÐÎʽ½áºÏÆðÀ´ÃèÊö³ÐŵӦ¸Ãʵ¼ùµÄʱ¼äºÍλÖã¬Õâ¾ÍÊÇËùνµÄCfengine.
ÈËÀàÉó¤ÓÚ×ö¾ö¶¨£¬È´²»ÄܺܺõÄÈ¥Ö´ÐС£¶ø»úÆ÷²»ÄÜ×ö¾ö¶¨£¬µ«¿ÉÒԺܺõÄÈ¥Ö´ÐС£Èç¹ûÈËÀàºÍ»úÆ÷Äܹ»Ï໥ȡ³¤²¹¶Ì¾Í»áºÜÓÐÒâÒå¡£
ÔÚϵͳ¹ÜÀíÖеÄÖ÷ÒªÎÊÌâÊÇȱ·¦×ÔÂÉ¡£¼ÍÂɲ¢²»ÊÇÒâζ×ÅÒª°´ÕÕÖØÒªµÄָʾÀ´ÓÐÐòÖ´ÐС£ËüÖ»ÒªÇóϵͳµÄÿһ²¿·ÖÄܹ»ÖªµÀËüµÄ¹¤×÷²¢ÇÒÄܹ»ÍêÕûÎÞÎóµÄÖ´ÐС£
Óм¼ÊõµÄ¹¤×÷ÕßÒ×ÓÚÈÏΪËüÒѾ×ã¹»µÄÖÇÄÜ»¯¡£ÊÂʵÊÇÕâÊÇ´íµÄ£º´ÏÃ÷µÄÈËÒ×ÓÚ³ÉΪÎÊÌâ½â¾öÕß²¢ÇҺܿªÐÄÄܹ»½â¾öÏàͬµÄÎÊÌâºÜ¶à´Î£¬ÕâÑùÆäʵºÄʱÓÖºÄÁ¦¡£´ËÍ⣬ÈËΪµÄ¸ÉÔ¤³£³£ÊÇ»ùÓÚ»ÅÕźÍÃÔºý£¬ËùÒÔÿ´ÎÓÐÈËÊÖ¶¯µÇÈëϵͳ£¬ÆäʵÕâÑùÓк¦ÓÚÿ¸öÈ˶ÔϵͳµÄÀí½â¡£Ö»ÓÐÎȶ¨Õ³̵Ä×ÔÂɲÅÄÜ´øÀ´¿ÉÔ¤²âÐÔ¡£
ÁãÉ¢µÄ¸ü¸ÄÊDz»ºÃµÄ£¬ÒòΪ£º
l ÆäËûÈ˲»ÖªµÀ·¢ÉúÁËʲô¡£
l ûÓмǼ¸ü¸ÄµÄÄÚÈݺÍÄ¿µÄ¡£
l Ö»ÁôÏÂÁ˸ü¸ÄµÄºÛ¼£¡£
ÈËÃǾ³£·ßÅ·´¶Ô×Ô¶¯»¯£¬ÒòΪ¾õµÄ×Ô¶¯»¯ÈÃËûÃǹ¤×÷ʧȥÁËÈËÐÔ¡£ÊÂʵȴÏà·´£¬Ç¿ÆÈÈ˲»¶ÏÖØ¸´Îȶ¨È¥×ö»úÆ÷×öµÄ¹¤×÷£¬Õâ²ÅÊÇɥʧÈËÐÔ¡£Äܹ»ÈÏʶµ½ÕâÒ»»µµÄϰ¹ß²¢ÇÒÔ¸Òâ·ÅÆúÕâÒ»»µÏ°¹ß¾ÍÊÇÒ»´ó½ø²½¡£
ÔÚ¹ýÈ¥£¬ÈÃϵͳÉý¼¶»»´úµÄΨһ·½Ê½¾ÍÊÇÈÃËùÓÐϵͳÏàͬ¡£Õâ²»ÔÙÊÇÕýÈ·µÄ·½Ê½¡£
ÔÚ1960ÄêµÄÄ©ÆÚ£¬¼æÓÐÐÂÎŹ¤×÷ÕߺÍδÀ´Ö÷ÒåÕßÉí·ÝµÄAlvin Toffler Ãè»æÁËÒ»·ù¹ØÓÚÎ÷·½ÊÀ½çºÍºó¹¤Òµ»¯Î´À´µÄÃÀÀö¾ªÈ˵Äͼ»¡£ËûÔÚ1970ÄêдµÄÒ»±¾Êé½Ð¡¶Î´À´³å»÷¡·£¬ÕæÊµµÄ»ØÓ¦ÁËÀäսʱÆÚ¶ÔÓÚÔÚÒ»¸ö¹²²úÖ÷Ò幤ҵ½×¶Î´óÁ¿Éú²úͬÀà²úÆ·µÄ¿Ö»Å¡£ËûµÄÊéÕæÊµµÄ·´²µÁËÄÇЩÈÏΪ¹¤Òµ»¯ºÍ´óÁ¿Éú²ú¾ÍÒâζ×ÅÒ»Çж¼Ó¦¸ÃÊÇһģһÑùµÄÈËÃÇ¡£ÎÒÍÆ¼ö´ó¼ÒÈ¥ÔĶÁÕâ±¾Ê飬µÄÈ·ÊÇдµÄ·Ç³£ºÃ²¢ÇÒÓкܶà½ñÌìÎÒÃÇÐèҪѧϰµÄ¾Ñé½Ìѵ¡£µ«ÊÇ´ÓËûÈß³¤µÄÅê»÷ÖУ¬ÎÒдÏÂÒ»¾ä¼òµ¥µÄ»°À´×ܽáÎÒÃÇÐèҪѧϰµÄ½Ìѵ£º
¡°µ±¼¼ÊõÔ½À´Ô½ÏȽø£¬Ç±ÔڵķçÏÕ´ú¼ÛÒ²Ô½À´Ô½Ð¡¡£¡±
»»¾ä»°Ëµ£¬ÓÃÓÚ´óÁ¿Éú²úµÄÈκÎÖÐÁ÷¼¼Êõ¶¼ÄܰïÖúÎÒÃǸü¼ÓæµÊìºÍÁé»î£¬¶ø²»ÊǸüÉÙ¡£µ±Äã¿ÉÒÔÔÚ»ú³¡µÄATM»úÉϰ´ÒªÇó´òÓ¡³öÃûƬ£¬²¢ÇÒ¿ÉÒÔÔÚÕ£ÑÛ¹¦·òÈÿ§·È±±äµÄ¸öÐÔ»¯£¬ÔÚÕâÑùÒ»¸öʱ´úÀïÎÒÃÇûÓÐÀíÓÉÈ¥¼á³ÖÒ»¸ö»Äµ®µÄÀíÄÈÏΪ´ó¹æÄ£µÄ»ù´¡ÉèÊ©¾ÍÒªÇóÍêÈ«µÄÖØ¸´¡£È»¶øÈËÃÇÈÔÈ»ÕâôÈÏΪ£¬°üÀ¨ÍøÂ繤³Ìʦ£¬ÏµÍ³¹ÜÀíÔ±¡£ËûÃÇÉõÖÁ˵ÕâÊÇ¿ÉÀ©Õ¹ÐԱز»¿ÉȱµÄ¡£
Toffler µÄÒ»¸öÖØÒª¹ÛµãÊÇ´óÁ¿Éú²ú»¯¾¼ÃÓëÊÊÓ¦ÐÔ¾¼Ã²¢²»³åÍ»£¬²¢ÇÒÔÚ40ÄêÖ®ºó£¬ÎÒÃÇÈÔÈ»ÔÚÎüÈ¡Õâ¸ö½Ìѵ¡£
Cfengine ÊÇÒ»¸ö¹¹¼Ü¡£Ëü²¢Ã»ÓÐÈç´ËµÄ¸´ÔÓ£¬µ«ËüµÄÈ·ºÜ¹ã·º¡£¾³£µ±ÊÔͼÃèÊöCfengineµÄʱºò,ËÆºõÓкܶàҪ˵µÄ²¢ÇÒºÜÄÑÓÃÒ»¸ö¼òµ¥·½Ê½À´±í´ïÕâ¸öÈí¼þÄÜ×öʲô¡£ÏÂÃæÕâ·ùͼÄܹ»¸øÄãһЩ˼·ȥÈÏʶCfengine ¡£

¶ÔÐí¶àÓû§À´Ëµ£¬Cfengine ÊÇÒ»¸ö¼òµ¥µÄÅäÖù¤¾ß£¬ÀýÈ磬¸ù¾Ý²ßÂÔÀ´ÅäÖúÍÐÞ²¹ÏµÍ³µÄÈí¼þ¡£²ßÂÔÊÇͨ¹ý³ÐŵÀ´ÃèÊöµÄ£¬ÊÂʵÉÏ£¬ÔÚCfengine3 ÀïµÄÿһ¸öÉùÃ÷¶¼ÊÇÒ»¸ö½«ÔÚijʱijµØ¶ÒÏֵijÐŵ¡£³ý´ËÒÔÍ⣬Ȼ¶øCfengine ²»Ïñ´ó¶àÊý×Ô¶¯»¯µÄ¹¤¾ßÒ»´ÎÐÔÕ¹¿ªÒ»Ð©Èí¼þµÄÀ¶Í¼²¢ÇÒ±§ÓÐÀÖ¹ÛµÄÏ£Íû¡£ÄãÔÚCfengineÀïËùÐíϵÄÿһ¸ö³Ðŵ¶¼ÊDz»¶Ï±»¼ìÑéºÍά»¤¡£Ëü²¢²»ÊÇÒ»´ÎÐԵIJÙ×÷£¬¶øÊÇÒ»¸ö·â×°µÄ½ø³Ì£¬ËüÄܹ»×ÔÎÒÐÞ¸´ÄÇЩƫÀë²ßÂÔµÄÐÐΪ¡£
ÎÞÒɰÑCfengine·ÅÔÚÒ»¸ö×Ô¶¯»¯µÄÍõ¹úÀ¾³£»áÓÐÎÊÌâÌá³ö£ºÄѵÀËüÖ»ÊÇÁíÒ»Öֽű¾ÓïÑÔÂ𣿠²»¿É·ñÈÏCfengine ȷʵ°üº¬ÁËÒ»ÖÖÇ¿´óµÄ½Å±¾ÓïÑÔ£¬µ«ÊÇËü²»ÏñÆäËüÖÖÓïÑÔ¡£Cfengine ²»ÏñPerl ,Python or Ruby ÊÇÒ»Öֵͼ¶ÓïÑÔ¡£ËüÊÇÒ»ÖÖ³ÐŵµÄÓïÑÔ£¬Äã¿ÉÒÔÓÃËüÀ´±í´ï¶Ôϵͳ¸ß²ã´ÎµÄÆÚÍûºÍʵÏÖ½á¹ûËùÐèÒªµÄËã·¨»úÖÆµÄÄÚ²¿Ï¸½Ú¡£ÎÒÃǽ«»áÔÚÏÂÃæÔÙ´ÎÌáµ½¡£
¶ÔÓÚÐí¶àÈËÀ´Ëµ£¬Cfengine ÊÇÒ»¸öÓÃÀ´ÔÚϵͳÉÏÖ´Ðа²È«Îȶ¨µÄ²½Öè²¢ÇÒÔÚÒÔºó½øÐв»¶Ï¼à²âµÄ¹¤¾ß¡£Õâ¿Ï¶¨ÊÇÒ»¸öÖ÷ÒªµÄÓ¦Ó÷½Ãæ¡£Cfengine ÒÔÎȶ¨ºÍ°²È«ÁôϺܺõĿڱ®¡£ÕâÊÇÒòΪËüµÄ»ù±¾Éè¼ÆÊǰ²È«µÄ¡£Ëü²»¿ÉÄÜ´ÓϵͳÍâ·¢ËÍÓйزßÂÔµÄÐÅÏ¢µ½Cfengine . Èç¹û±»ÔÊÐí½øÈëϵͳ£¬ËüÖ»¿ÉÄÜ·¢ËÍһЩ´óСÓÐÏ޵ļòµ¥µÄÐÒéÇëÇóµ½·þÎñÆ÷¡£ÕâÑùµÄÉè¼Æ±È´ó¶àÊý·À»ðǽ¸ü°²È«¡£´ó¶àÊý·þÎñÆ÷²»ÄܽøÐа²È«²âÊÔ£¬ÒòΪ²âÊÔÓпÉÄܻᷢËÍÊý¾Ýµ½·þÎñÆ÷¡£
Äܹ»ÃèÊöÒ»¸öϵͳµÄ´ó¶àÊý²ßÂÔµÄÄÜÁ¦¾ÍÊÇÒâζ×ÅÎÒÃÇËù½¨ÒéϵͳËùÐèÒªÐíϵĺÍ×ñÐеijÐŵ¡£Òò´ËCfengine Ò²¿ÉÒÔ±»ÈÏΪÊÇÒ»¸ö³ÐŵÒýÇæ¡£Ëü¿ÉÒÔÈÝÒ׵طþ´ÓһЩ¿ò¼ÜÄ£ÐÍ£¬ÈçSOX ,'EUROSOX'(µÚ8ÌõÅ·ÃË×ÊÁÏÖ¸Òý), ITILµÄ¼Ü¹¹ºÍÏñISO1 7799,ISO 200000µÄ±ê×¼µÈµÈ¡£
×îºó£¬ËäÈ»Cfengine ²»ÊÇ×î³õÉèÏëÓÃÀ´¼à²âµÄ£¬µ«Ëü°üº¬ÁË×îÁé»îºÍÊ¡¿ªÏúµÄ¼à²âÒýÇæ¡£Äã¿ÉÒÔÌáÈ¡¹ØÓÚϵͳÅäÖã¬Ó÷¨£¬×ÊÔ´£¬¼Ç¼ÎļþµÄÊý¾Ý£¬²¢ÇÒ½«Ëüת»¯³É¿É¶ÁµÄ±¨¸æ¡£Cfengine ·¢ÏÖºÍÌáȡϵͳÐÅÏ¢ºÍ±¨¸æµÄÄÜÁ¦Òâζ×ÅÄã¿ÉÒÔ½«ÏµÍ³×ª»¯ÎªÒ»¸ö¼òµ¥µÄÅäÖùÜÀíÊý¾Ý¿â¡£ÔÚÃâ·Ñ°æ±¾ÖУ¬¼à²âÊÇÒ»¸ö»¹Î´ÊµÐеĽø³Ì¡£Ëæ×ÅCfengine µÄÉÌÒµÀ©Õ¹£¬¶ÔÄãËù×÷µÄ¼à²â³ÐŵÖÖÀ༸ºõûÓÐÏÞÖÆ£¬²¢ÇÒ²»»áÏñ´ó¶àÊý¼à²âϵͳºÄ¾¡È«²¿µÄ×ÊÔ´¡£
×ܶøÑÔÖ®£¬CfengineÄ¿µÄÊÇ´Ù½øÈËÀà¶Ô¸´ÔÓ½ø³ÌµÄÀí½â¡£ËüµÄ³ÐŵÒ×ÓÚÌṩÎĵµ£¬²¢ÇÒÔÚ´íÎ󱨸æÖÐϵͳ»á¼Çס²¢ÌáÐÑÎÒÃÇ¡£ËüÒþ²ØÁËÔÝʱÎ޹صÄÖ´ÐÐϸ½Ú´Ó¶øÍ»³ö³Ðŵ±³ºóµÄÄ¿µÄ¡£ÕâÒâζ×ÅÄ㹫˾µÄ֪ʶ¿ÉÒÔ±àÈëCfengine µÄÓïÑÔÖС£
Ϊʲô֪ʶºÜÖØÒª£¿ÆäÖÐÓÐÁ½¸öÔÒò£º µÚÒ»¾ÍÊǼ¼ÊõÐÔµÄÃèÊöºÜÄѱ»¼ÇÒä¡£Ö»Óе±ÄãÔÚдµÄʱºòÄã²ÅÓпÉÄÜÀí½âÄãµÄÅäÖþö¶¨£¬µ«µ±¼¸¸öÔºó³öÏÖһЩÎÊÌ⣬ÄãºÜ¿ÉÄÜÒѾÍü¼ÇÄ㵱ʱËùÏëµÄ¡£Õâ¾Í»¨·ÑÁËÄãµÄʱ¼äºÍŬÁ¦À´Õï¶ÏÆäÖеÄÎÊÌâ¡£µÚ¶þ¸öÔÒò¾ÍÊǹ«Ë¾Ò×ÓÚÒÀÀµÄÇЩ±àд²ßÂÔµÄÈË¡£Ò»µ©ËûÃÇÀ뿪£¬ ʣϵÄÈËÍùÍù²»ÄÜÄܹ»Àí½âºÍÐÞ¸´ÏµÍ³¡£Ö»ÓÐÍêÕûÕýÈ·µÄÎĵµ£¬ÏµÍ³²ÅÓпÉÄÜÃâÓÚÊÜËð¡£
Cfengine ÊÇÓÉ´óÁ¿µÄ×é¼þ¹¹³ÉµÄ¡£ÔÚÕâÕ£¬ÎÒÃǽ«ÌÖÂÛÈçºÎ×齨ËüÃDz¢½âÊÍËüÃÇÊǸÉʲôÓõġ£
Òª°²×°Cfengine £¬ÄãÐèҪһЩÈí¼þ°ü¡£ÈçÏ£º
OpenSSL ¿ªÔ´¼ÓÃܵݲȫÌ××°ÐÒé
꿅᣼http://www.openssl.org
BerkeleyDB (3.2°æ±¾»ò¸üеİ汾 )
ÇáÁ¿µÄÆ½ÃæÎļþÊý¾Ý¿âϵͳ
꿅᣼http://www.oracle.com/technology/products/berkeley-db/index.html
ÆäËû...
½¨ÒéʹÓÃPerl ÓïÑÔ¼æÈݵÄÕýÔò±í´ïʽ£¨PCRE£©¾²Ì¬¿â£¬ÒòΪÕâÊǶÔ×î±ê×¼µÄ¿ÉÒÆÖ²ÐÔ²Ù×÷ϵͳ½Ó¿Ú¾²Ì¬¿âµÄÒ»´ó¸Ä½ø¡£Õâ¸öÎĵµÊDzÉÈ¡PCRE µÄʹÓá£
ÔÚWindowsϵͳÖУ¬ÎªÁ˱£Ö¤Cfengine Õý³£ÔËÐУ¬ÄãÐèÒª°²×°»ù±¾Ð¡Ð͵ÄUnixÄ£Äâ»·¾³£¨Cygwin£©¶¯Ì¬Á´½Ó¿â¡£
꿅᣼http://www.cygwin.com
Èç¹ûÓÐÆäËûµÄ¾²Ì¬¿â£¬ÈçOpenLDAP, MySQLµÄÓû§»ú¾²Ì¬¿â ºÍ PostgreSQLµÈµÈ£¬ ÁíÍâµÄ¹¦ÄÜ£¨ÆäÖÐÓÐһЩÐèÒª¸¶·ÑʹÓã©Ò²ÊÇ¿ÉÓõġ£Ã»ÓÐÕâЩ¾²Ì¬¿âCfengine Ò²Äܹ»ÔËÐУ¬Ö»ÊÇÏà¹ØµÄ¹¦Äܽ«²»¿ÉÓá£
³ý·ÇÄãÒѾ¹ºÂòÁËÏֳɵÄÔ´´úÂ룬»òÕßÔÚÕýÔÚʹÓÃÒ»¸ö·¢Ðеİü£¬ÄãÐèÒª±àÒëCfengine . Èç¹ûÕâÑùÄãҲͬÑùÐèÒªÒ»¸öÒѾװÓÐ gcc , flex ºÍbison µÄϵͳ»·¾³¡£
ÍÆ¼öµÄ°²×°·½·¨ÈçÏ£º
tar zxf cfengine-x.x.x.tar.gz
cd cfengine-x.x.x
./configure
make
make install
ÕâÑùÔ´´úÂë¾Í°²×°ÔÚ`/usr/local/sbin' Ŀ¼Ï¡£
Cfengine ÓÐÒ»¸ö¿ÉÒÔʹÓõŤ×÷¿Õ¼äĿ¼¡£µ±ÒÔroot Éí·ÝÔËÐУ¬ËüµÄĬÈÏλÖÃÔÚ`/var/cfengine' £¬¶øÄ¿Â¼~/.cfagent ÊÇÁô¸øÆäËûÓû§Ê¹Óõġ£
/var/cfengine
/var/cfengine/bin
/var/cfengine/inputs
/var/cfengine/outputs
Ò»¸ö¿ÉÐÅÈεÄÊäÈëÎļþ»º³åÇøÄ¿Ç°±ØÐë±»·ÅÖÃÔÚ`inputs' ×ÓĿ¼Ï¡£µ± Cfengine ×Ô¶¯±»¼¤»î£¬°´ÕÕÔ¤ÆÚËü¾Í»áÖ»¶ÁÈ¡Õâ¸öĿ¼ÏµÄÎļþ¡£ÔÚÿ̨»úÆ÷Éϸüлº³åÇøÊÇÓû§µÄ¹¤×÷£¨ÕâÊÇÓÉĬÈÏÅäÖÃÎļþ¾ö¶¨µÄ£©¡£
²»ÏñCfengine 2£¬Cfengine 3 ²»ÄÜʶ±ðCFINPUTS »·¾³±äÁ¿¡£
ÏÖÔÚ'outputs' Ŀ¼ÊÇһϵÁÐÔËÐб¨¸æµÄÒ»¸ö¼Ç¼ ¡£ÕâЩÍùÍùͨ¹ýcf-execd·¢Óʼþ¸ø¹ÜÀíÔ±£¬»òÕß±»¸´ÖƵ½ÆäËûÖØÒªµÄλÖò¢Çҿɱ»ÏàÓ¦µÄä¯ÀÀÆ÷ÔĶÁ¡£
Ò»¸öCfengineϵͳÓеãÀàËÆÒ»¸ö¹ÜÏÒÀÖ¶Ó¡£ËüÓÉÈÎÒâÊýÁ¿µÄ¼ÆËã»ú£¨ÑÝ×àÕߣ©×é³É£¬Ã¿Ò»¸öÈ˶¼ÓÐ×Ô¼ºµÄÀ֯ײ¢ÇÒÖªµÀµ¯×àʲô¡£ÓÐÎÞÖ¸»ÓÕßе÷ÕûºÏÿһ²¿·Ö£¬ÕâÊÇÓÉÄã×Ô¼º¾ö¶¨µÄ¡£
Cfengine µÄÈí¼þ´úÀíÔÚÿһ̨¶ÀÁ¢µÄ¼ÆËã»úÉÏÔËÐУ¬µ«ÔÚ±ØÒªÇé¿öÏ¿ÉÒÔ½øÐÐͨÐÅ£¬ÈçÏÂͼËùʾ¡£Õâ¾ÍÒâζ×ÅÄãûÓбØÒªÎªÁËÔËÐÐÄãµÄÍøÂç¶ø¹æ·¶±ê×¼ÒÔ·À²»°²È«µÄµÇ¼£¬Èç¹ûÍøÂçͨÐųöÏÖÁËÎÊÌ⣬ÔÚÔËÐÐÖÐ¶ÏÆÚ¼äcfengine¾Í¿ÉÒÔÈçÐèÐÞ¸´ºÍ±£»¤ÏµÍ³ ¡£

Èç¹ûÍøÂç²»¹¤×÷£¬ cfengin¾Í»áÌø¹ýÕâЩ²¿·Ö²¢ÇÒ¼ÌÐøËüµÄ¹¤×÷¡£Ëü¾ßÓÐÈÝ´íÐԺͶàÑ¡ÔñÐÔ¡£
cf-promises ³ÐŵµÄ¼ìÑéÕߺͱàÒëÕߣ¬ÔÚÊÔͼִÐÐÒ»Ì×ÅäÖóÐŵǰԤÏȼì²â¡£
cf-agent ±ä»¯µÄ·¢¶¯Õߣ¬´úÀíÊÇCfengine ²Ù×÷ϵͳ×ÊÔ´µÄ²¿·Ö¡£
cf-serverd ·þÎñÆ÷Äܹ»¹²ÏíÎļþ²¢ÇÒ½ÓÊÜÔÚһ̨¸öÌ弯Ëã»úÉÏÖ´Ðе±Ç°²ßÂÔµÄÇëÇó¡£
Ëü²»¿ÉÄÜ´ÓÍⲿ·¢ËÍ£¨ÍƳö£©ÐÂÐÅÏ¢¸øCfengine .
cf-execd ÕâÊÇÒ»¸ö°²ÅÅÈճ̵ĺǫ́³ÌÐò£¨ËüÄܲ¹³ä»òÈ¡´úcron£©.ËüÒ²¿ÉÒÔ×÷Ϊ°ü×°Æ÷£¬
Ö´ÐкÍÊÕ¼¯cf-agent µÄÊä³ö£¬²¢ÇÒ·¢ËÍÓʼþ¸øÓбØÒªµÄϵͳÓû§¡£
cf-runagent ÕâÊÇÒ»¸ö°ïÖúÕß³ÌÐò£¬ËüÄܹ»¶Ô»°cf-serverd ²¢ÒªÇóÖ´ÐÐcf-agent Éϵĵ±Ç°²ß
ÂÔ¡£Èç¹û´úÀí»úÉϵIJßÂÔ°üº¬Á˼ìÑé¸üУ¬ËüÒò´ËÄ£ÄâΪһ¸ö·¢¶¯Õߣ¬¶Ô
cfengine µÄÖ÷»ú²úÉú±ä»¯¡£
cf-report ËüÄܵóö×ܽáºÍÆäËû±¨¸æ£¬ÒÔ¶àÖÖ¸ñʽÊä³ö»òÓëÆäËûϵͳÕûºÏ¡£
cf-know Õâ¸ö´úÀíÄܹ»´Ó´óÁ¿¹ØÓÚϵͳ֪ʶµÄ³ÐŵÖвúÉúÒ»¸öISO±ê×¼Ö÷Ìâͼ¡£Ëü¿É
×÷ΪÓïÒåÍøÏÔʾÎĵµ¡£
Õⲿ·Ö½âÊÍcfengine ½«ÈçºÎÔÚÄãµÄÒýµ¼ÏÂÔÚÍøÂçÖÐ×Ô¶¯»¯µÄ²Ù×÷¡£Èç¹ûÄãµÄ¹«Ë¾ÓкܴóµÄ¹æÄ££¨³ÉǧÉÏÍòµÄ·þÎñÆ÷£©£¬µ±ÕâÑùµÄ¹æÄ£ÒªÇóÄãÓиü¶àµÄ»ù´¡ÉèÊ©ºÍÒ»¸öDZÔڵĸü¸´ÔÓµÄÅäÖã¬Äã¸Ã»¨Ò»Ð©Ê±¼ä¸úCfengine ר¼ÒÌÖÂÛÈçºÎ½«ÕâÑùµÄÃèÊöµ÷гµ½ÄãµÄϵͳ»·¾³ÖС£ÈκÎcfengine ÅäÖõÄʵÖÊÊÇÏàͬµÄ¡£
ÔÚ¹ÜÀíϵͳÖУ¬ÓÐËĸö¹²Í¬±»ÒýÓõĽ׶Σ¬×ܽáÈçÏ£º
l °²×°
l ÅäÖÃ
l ¹ÜÀí
l ÉóºË
ÕâЩ¶ÀÁ¢µÄ½×¶ÎÀ´×ÔÓÚϵͳ¹ÜÀíµÄÒ»¸öģʽ£¬ËüÊÇ»ùÓÚÊÂÎñ´¦ÀíµÄ±ä»¯¡£Cfengine µÄ¹ÜÀíÀíÄîÓе㲻ͬ£¬ÒòΪÊÂÎï´¦ÀíµÄ½ø³Ì¶ÔÓÚϵͳ¹ÜÀíÀ´Ëµ²»ÊÇÒ»¸öºÃµÄģʽ£¬µ«ÎÒÃÇ¿ÉÒÔÓÃÕâ¸öÄ£°åÈ¥¿´¿´cfengine ÈçºÎ²»Í¬µØ¹¤×÷¡£
°²×° Ò»¸öϵͳÊÇ»ùÓÚ´óÁ¿µÄµÄ¾ö¶¨ºÍÐèÒªÔÚÖ´ÐÐǰ±»°²×°µÄ×ÊÔ´¡£½¨Á¢Ò»¸öϵͳµÄ
¿ÉÐÅÈεĸù»ùÊÇÒýµ¼ËüÅäÖõĹؼüËùÔÚ¡£Äã²»ÐèÒª¾ö¶¨Ã¿Ò»¸öϸ½Ú£¬¾Í×ãÒÔ
ÔÚÄãµÄϵͳÖн¨Á¢ÐÅÈκÍÁ¼ºÃµÄ¿ÉÔ¤²âÐÔ¡£
ÔÚcfengine ÖУ¬Äã°²×°µÄÊÇÒ»¸öΪ¹«Ë¾µÄ¼ÆËã»úËùÍÆ¼öµÄ³Ðŵģ°å£¬ÒÔÖÂÈç
¹ûËùÓмÆËã»ú¶¼ÄÜ×ö³öºÍ±£³ÖÕâЩ³Ðŵ£¬ÏµÍ³½«ÈçÆÚÁ÷³©µÄÔËÐС£Õâ¾ÍÊÇËüÈç
ºÎÔÚÈËȺ×éÖ¯Öй¤×÷£¬²¢ÇÒÈçºÎΪ¼ÆËã»ú·þÎñ¡£
ÅäÖà ÅäÖÃȷʵÊÇÒâζ×ÅÖ´ÐÐÒѾ¾ö¶¨µÄ²ßÂÔ¡£ÔÚÊÂÎñ´¦ÀíϵͳÖУ¬Ò»Ì¨»ú×ÓÊÔͼһ
¸ö½ÓÒ»¸öµØÍƳö¸üУ¬Òò´ËÐèÒª²¿ÊðÕâ¸ö¾ö¶¨¡£ÔÚcfengine ÄãºÜ¼òµ¥µÄ·¢²¼ÁË
ÄãµÄ²ßÂÔ£¨ÔÚcfengine µÄÓï·¨ÖÐÕâЩÊÇ¡®³ÐŵÌáÒ顯£©²¢ÇÒÕâЩ¼ÆËã»ú¿´¼ûÁË
еÄÌáÒé²¢ÇÒÄÜÏàÓ¦µÄµ÷Õû¡£Ã¿Ò»Ì¨¼ÆËã»ú¶¼ÔËÐÐ×ÅÒ»¸öÄܹ»Ëæ×Åʱ¼äÖ´
ÐвßÂÔºÍά»¤ËüÃǵĴúÀí£¬¶øÎÞÐè½øÒ»²½µÄÐÖú¡£
¹ÜÀí Ò»µ©×öÁËÒ»¸ö¾ö¶¨£¬³öºõÒâÁϵÄʽ«»á·¢Éú¡£ÕâÖÖÍ»·¢Ê¼þͨ³£»áÒýÆð¾¯¾õ£¬
²¢ÇÒÈËÃÇ»á´Ò´ÒææµÄ×ö³öеÄÊÂÎñ´¦ÀíÀ´ÐÞ¸´ËüÃÇ¡£ÔÚcfengine ÖУ¬×Ô¶¯»¯
µÄ´úÀíÄܹ»¹ÜÀíϵͳ£¬²¢ÇÒÄãÖ»ÐèÒª´¦ÀíÄÇЩ²»Äܱ»×Ô¶¯´¦ÀíµÄº±¼ûʼþ¡£
ÉóºË ÔÚ´«Í³µÄÅäÖÃϵͳÖУ¬ÔÚÒ»´Îͨ¹ýµÄÊÂÎñ´¦ÀíºóÊä³öÍùÍù²»¹»Ã÷È·£¬ËùÒÔÓÐÈË
À´ÉóºËϵͳÒÔ±ãÕÒ³öÎÊÌâËùÔÚ¡£ÔÚ cfengine ÖÐ, ²»Ö»ÊDZ仯»á±»·¢ÆðÒ»´Î£¬¶ø
ÇÒ±¾µØµÄÉóºËºÍά»¤Ò²ÊÇÈç´Ë¡£Cfengine µÄÉè¼Æ²¢²»Äܱ£Ö¤ºÍ×Ô¶¯»¯µØÎ¬»¤¾ö
¶¨Êä³ö£¬ËùÒÔÖ÷ÒªµÄµ£ÓÇÊǹÜÀí³åÍ»µÄÒâͼ¡£Óû§¿ÉÒÔÐÝÏ¢²¢ÇÒ¼ì²é´úÀí²úÉú
µÄÈÕ³£±àÒ뱨¸æ£¬²¢ÇÒûÓбØÒª°²ÅÅеı¸·ÝÊÂÎñ´¦Àí¡£
±¸·ÝºÍ»Ö¸´£¿ Äã²»Ó¦¸ÃÈÏΪcfengine ÊÇÒ»¸ö±¸·Ýϵͳ£¬ÀýÈ磬ÓÐÈËÊÔͼ×èֹϵͳ¾ø¶ÔµÄ±ä»¯²¢ºÜ¿ÉÄָܻ´ËüÃÇÒÔ·À³ö´í¡£±¸·ÝºÍ»Ö¸´ÊÇÔÚÀíÂÛÉÏÓÐ覴õĸÅÄֻÊÇÓÐʱÔÚʵ¼ÊÖпÉÐС£Í¨¹ýcfengine ,Äã·¢²¼ÁËһϵÁеIJßÂÔÐ޸ģ¬×ÜÊÇÔÚÍùǰ½ø²½£¨ÒòΪ²»¹Üϲ²»Ï²»¶£¬Ê±¼äÖ»ÊÇÔÚÁ÷ÊÅ£©¡£ËùÓб»ÆÚÍû״̬µÄ±ä»¯ÊÇ¿ÉÒÔͨ¹ýÿһ̨¶ÀÁ¢µÄ¼ÆËã»úÔÚ±¾µØ¹ÜÀí£¬²¢ÇÒ²»¶ÏµÄÐÞ¸´ÒÔ±£Ö¤½øÐÐÖеıàÒëÓë²ßÂÔÒ»Ö¡£
Cfengine ûÓÐ×ö³ö·Ç³£¶à¾ø¶ÔµÄÑ¡Ôñ¡£ËüµÄ´ó¶àÊýÐÐΪÊDzßÂÔµÄÎÊÌ⣬²¢Äܹ»±»¸Ä±ä¡£È»¶ø£¬ÍƼöʹÓÃÒ»¸ö½á¹¹£¬¼ûÏÂͼ¡£
ΪÁ˱£Ö¤²Ù×÷¾¡¿ÉÄܼòµ¥£¬cfengine ÔÚÿ̨¼ÆËã»úÉϱ£³ÖÒ»¸ö˽Óй¤×÷Ŀ¼£¬¼´ÔÚÎĵµÖеÄWORKDIR£¬ÔÚ²ßÂÔÖÐÒÔ±äÁ¿$(sys.workdir)µÄÐÎʽ³öÏÖ¡£Õâ¸öĿ¼µÄĬÈÏλÖÃÊÇÔÚ'/var/cfengine'ºÍ' c:\var\cfengine' . Ëü°üº¬ÁËcfengine ÐèÒªÔËÐеÄÒ»ÇС£
ÏÂÃæµÄÕâ·ùͼÏÔʾÁ˾ö¶¨ÈçºÎÔÚϵͳ֮¼äÁ÷¶¯¡£

l е÷ºÏ×÷µÄµ¥Ò»µãÊǺÜÓÐÒâÒåµÄ¡£Òò´Ëͨ³£µ¥Ò»µÄ±¾µØ£¨²ßÂÔ¶¨ÒåÖÐÐÄ£©×öÁ˾ö¶¨¡£ÄãÑ¡ÔñÒ»¸öµÄ°æ±¾¿ØÖÆÏµÍ³£¨ÀýÈ磬SubVersion ,CVS,µÈµÈ£©¿ÉÒÔ¸ú×Ù¾ö¶¨ºÍ±ä»¯µÄÀúÊ·¼Ç¼¡£
l ͨ¹ý±à¼cfengine µÄ²ßÂÔÎļþ 'promises.cf ' £¨»òÕßËü°üÀ¨µÄ×ÓÎļþ£©¿ÉÒÔ×ö³ö¾ö¶¨¡£Õâ¸ö¹ý³ÌÊÇÔÚ·ÇÔËÐÐ״̬ÏÂÖ´Ðеġ£
l Ò»µ©¾ö¶¨±»¶¨Ðβ¢±àÂëÁË£¬ÐµIJßÂԻᱻÊÖ¶¯£¨ÈËΪ¾ö¶¨£©µØ¸´ÖƵ½Ò»¸ö¾ö¶¨·Ö²¼µã£¬Ä¬ÈÏÊÇλÓÚËùÓвßÂÔ·Ö²¼·þÎñÆ÷ÉϵÄĿ¼'/var/cfengine/masterfiles 'ÖС£
l ÿһ¸ö¿Í»§»úÁªÏµ²ßÂÔ·þÎñÆ÷²¢ÇÒÏÂÔØÕâЩ¸üС£Èç¹û¿Í»§»úµÄÊýÁ¿ºÜÅÓ´ó£¬ÎÒÃÇ¿ÉÒÔ¸´ÖÆÕâ¸ö²ßÂÔ·þÎñÆ÷£¬µ«ÎÒÃǽ«ÈÏΪÄÇÀﻹÊÇÖ»ÓÐÒ»¸ö²ßÂÔ·þÎñÆ÷¡£
Ò»µ©¿Í»§»úÓÐÒ»¸ö²ßÂԵı¸·Ý£¬ËüÖ»´ÓÖÐÌá³öÓëÖ®Ïà¹ØµÄ³ÐŵÌáÒ飬²¢ÇÒÔÚûÓÐÈËΪ°ïÖúÏÂÖ´ÐÐÈκεı仯¡£Õâ¾ÍÊÇcfengine ¹ÜÀí±ä»¯¡£
ΪʲôÕâô×ö£¿Cfengine ÊÔͼͨ¹ý·ÖÀë½ø³ÌÀ´¼õÉÙÒÀÀµÐÔ¡£Í¨¹ý×ñÐлùÓÚÀµÄ¼Ü¹¹¡£Cfengine ½«ÄÜÈÝÈÌÍøÂçÖжϣ¬²¢ºÜÈÝÒ×´ÓÅäÖôíÎóÖлָ´¡£Í¨¹ý°Ñ¾ö¶¨µÄÔðÈÎÖØµ£·ÅÔÚ×î¶¥ÉÏ£¬È»ºó°ÑÖ´ÐзÅÔÚ×îµ×Ï£¬ÎÒÃÇ¿ÉÒÔ±ÜÃâÎÞÐèµÄ´àÈõ£¬²¢±£³ÖÁ½¸ö¶ÀÁ¢µÄÖÊÁ¿±£Ö¤½ø³Ì·Ö¿ª¡£
Éý¼¶µ½cfengineµÄÉÌÒµ°æ±¾ÊÇÒ»²½µ½Î»µÄ²Ù×÷£¬ÕâÔÚËüÃǸ÷×ÔµÄÎĵµÖÐÒѾÃèÊöÁË¡£ÒÔÃâ·Ñ°æ±¾¿ªÊ¼µÄ×î¿ì·½·¨ÊǰѰ²×°ÔÚ`/usr/local/share/cfengine/'µÄ·Ö²¼µÄ²ßÂÔÎļþ¸´ÖƵ½²ßÂÔ·Ö²¼µã£¬ÈçÏ£º
1. Ñ¡ÔñÄãµÄ²ßÂÔ·þÎñÆ÷¡£
2. ³ÉΪÄÇ̨·þÎñÆ÷µÄ³¬¼¶Óû§»òÕß¹ÜÀíÔ±¡£
3. ´´½¨²ßÂÔԴĿ¼£º
host# mkdir -p /var/cfengine/masterfiles
host# cp /usr/local/share/cfengine/*.cf /var/cfengine/masterfiles
4. ÏÖÔÚÆô¶¯ÏµÍ³
host# /usr/local/sbin/cf-key
host# cd /var/cfengine/masterfiles
host# /usr/local/sbin/cf-agent --bootstrap
ÏÖÔÚCfengineÔÚÄãµÄ·þÎñÆ÷ÉÏÔËÐÐ, Ëü½«×öЩʲô£¿Ö»ÊÇÒ»µ½Á½¾ä¼ò¶ÌµÄ»°ÓËùÒÔÈËÃÇÖªµÀѰÕÒʲô£¨»òÖªµÀÄÇÊǰ²È«µÄ£©
host# ps waux | grep cf-
ÄãÓ¦¸Ãä¯ÀÀÔÚĿ¼`/var/cfengine/masterfiles' µÄÎļþ£¬¿´¿´ËüÃǰüº¬ÁËʲô£¬ÉõÖÁÔÚÆô¶¯Ç°×öһЩÐ޸ġ£ÔÚÆäËüÊÂÖ®¼ä£¬ÄãÏëÒª×Ô¶¨ÒåһЩ²ÎÊý£¬¾ÍÏñÄãÕ¾µãÖС®resolv.conf ¡¯µÄÄÇЩ²ÎÊý¡£Èç¹ûÄãÒÔǰÒѾʹÓÃÁËcfengine µÄÔçÆÚ°æ±¾£¬ÕâЩÎļþµÄÄÚÈݽ«²»»á¿´ÆðÀ´Èç´ËµÄÉñÃØ¡£ÖÁÓÚÆäËû£¬ÎªÁËÓÐÒ»¸ö¸Å¹ÛÇë¼ÌÐøµÄ¹Ø×¢¡£
×¢Ò⣺Èç¹ûÄãÒѾΪcfengine µÄ¹¤×÷Ŀ¼ÊÖ¶¯ÅäÖÃÁËÒ»¸ö²»Í¬µÄλÖã¬Ä㽫ÐèÒªµ÷Õû£¬ÓÃÄãÒѾÅäÖõÄ·¾¶À´È¡´ú¡®/var/cfengine¡¯¡£ÀýÈ磬»ùÓÚ°üµÄDebian¸Ð¾õ¡®/var/lib/cfengine¡¯¶ÔÓÚËüÀ´Ëµ¾ÍÊÇÕýÈ·µÄλÖá£
Äã²»ÐèÒª³¬¼¶Óû§µÄȨÏÞÀ´Ê¹ÓÃcfengine .ÒÔÆÕͨÓû§¿ÉÒÔ°²È«µØ²âÊÔ´ó¶àÊýµÄÊÔÑé¡£ÄãÓ¦¸ÃÔÚ×¼±¸¿ªÊ¼ÅäÖÃϵͳÒÔǰ»¨Ò»Ð©Ê±¼äÀ´ÊÔÑéСµÄÀý×Ó¡£ÎªÁËÕâô×öÄãÓ¦¸ÃÒÔ³£¹æÎÞÌØÈ¨µÄÓû§µÇ¼µ½ÄãµÄϵͳ²¢¿ªÊ¼ÅäÖãº
host$ /usr/local/sbin/cf-key
host$ cp /usr/local/sbin/cf-* ~/.cfagent/bin
Cfengine ÏëÒª¿´¿´ÔÚ¹¤×÷Ŀ¼ÖÐËüµÄÔ´´úÂëµÄ±¸·Ý¡£¶ÔÓÚÒ»¸ö³£¹æÓû§À´Ëµ£¬Õâ¸öͨ³£Î»ÓÚ`~/.cfagent' £¬¶ø²»ÊÇÔÚ`/var/cfengine'¡£ÄãÓ¦¸ÃÏÖÔÚ×¼±¸ºÃÁË¡£
ÏÂÃæÊÇÔÚcfengine3ÖÐ×î¼òµ¥µÄ¡®Hello world¡¯³ÌÐò:
# ÿ¸ö²ßÂÔ±ØÐëÓÐÒ»×éÐø·¢Ê¼þ
body common control
{
bundlesequence => { "test" };
}
#
bundle agent test
{
reports: #Õâ¸öÊdzÐŵÀàÐÍ This is a promise type
cfengine_3:: # Õâ¸öÊÇÀà»·¾³£¨Õâ¸ö³ÐŵֻÄÜÔÚcfengine3ϵͳʵÐУ©
"Hello world"; # ÕâÊÇÒ»¸ö¼òµ¥µÄ³Ðŵ(Ëü²úÉúÁËÒ»¸öдÓÐ"Hello world"µÄ±¨¸æ)
}
ÔÚÒ»¸öÎļþÖÐÊäÈëÕâ¸ö£¬ÀýÈç`emacs ~/test.cf' ¡£È»ºó¼ì²éÓï·¨ÈçÏÂ
/usr/local/sbin/cf-promises -f ~/test.cf
Èç¹û¶¼ÊÇÕýÈ·µÄ£¬Äǽ«Ã»ÓÐÈκεÄÊä³ö¡£ÏÖÔÚÖ´ÐÐÈçÏ£º
/usr/local/sbin/cf-agent -f ~/test.cf
ÄãÓ¦¸Ã¿´¼ûÕâ¸ö£º
R: Hello world
Õâ¸ö¡®R¡¯£º¸æËßÄãÕâÊǸöÀ´×ÔÓÚÒ»¸ö±¨¸æµÄÊä³ö£¨ºÍ¼Ç¼Îļþ¡®L¡¯»òÕßһЩǶÈë³ÌÐòµÄ´øÒýºÅµÄÊä³ö¡®Q¡¯Ïà·´£©¡£
Õâ²»ÊÇÒ»¸ö¾µäµÄcfengine³ÌÐò£¬Ê×ÏÈÒòΪcfengine ²¢²»ÊÇͨ³£µØÒâζ×ÅÊä³öÏûÏ¢£¬³ýÁËÌØÀýÇé¿öÏ¡£È»¶ø×÷Ϊһ¸ö³õ¼¶Ê¹ÓÃÕߣ¬ËüÊDZãÓÚ¸üºÃµÄ¿´µ½Ò»Ð©Êä³ö¡£
Èç¹ûÄãÁ¢¼´Öظ´ÏàͬµÄÃüÁ½«Ê²Ã´Ò²²»»á·¢Éú¡£µ«Èç¹ûÄãµÈÉÏÒ»·ÖÖÓ£¬Ëü½«»áÔٴεŤ×÷¡£ÒÔÏêϸµÄģʽ£¨Ê¹ÓÃ-v »òÕß--verbose £©ÔËÐÐÃüÁîÀ´¿´¿´ÊÇʲôÔÒò£º
/usr/local/sbin/cf-agent --verbose -f ~/test.cf
ÏÖÔÚÄ㽫¿´µ½ £º
cf3> =========================================================
cf3> reports in bundle hello (1)
cf3> =========================================================
cf3>
cf3> XX Nothing promised here [lock.hello.reports..Hello_worl] (0/1
minutes elapsed)
cf3>
Õâ¸æËßÄãcfengineÈÏÎªÖØ¸´Ö¸ÁîµÄʱ¼äÌ«¶ÌÁ˶ø²»ÐèÒªÔٴα£³Ö³Ðŵ¡£Õâ¸öʱ¼äÊÇÓɲÎÊýifelapsed¾ö¶¨µÄ£¬Ëü¿ÉÒÔ·Ö±ðΪÿһ¸ö³Ðŵµ¥¶ÀµÄÉèÖá£ÄãÒ²¿ÉÒÔʹÓÃ'-K'Ñ¡ÏîÈÃcfengine ºöÂÔÕâЩʱ¼äµÄÏÞÖÆ¡£
ÔÚ'Hello world 'Óï¾ä֮ǰ£¬Äã¿´¼ûÁËÀà±í´ï`cfengine_3::'¡£Õâ¾ÍÊÇcfengine ÈçºÎ×ö¾ö¶¨¡£Èç¹ûÌõ¼þÂú×㣬ÄÇôÊä³öÐÅÏ¢µÄ³Ðŵ½«»áÖ´ÐС£ÎªÁËÃ÷È·Õâ¸öÀàÊÇ·ñÕýÈ·À´Ö´ÐУ¬Äã¿ÉÒÔ¼üÈëÃüÁîÀ´¿´¿´ÏêϸµÄÊä³ö¡£Ä㽫»á¿´µ½ÏñÕâÑùµÄһЩÊä³ö£º
Defined Classes = ( any verbose_mode Tuesday Hr08 Morning Min48
Min45_50 Q4 Hr08_Q4 Day7 July Yr2009 Lcycle_2 GMT_Hr6 linux atlas
undefined_domain 64_bit linux_2_6_27_23_0_1_default x86_64
linux_x86_64 linux_x86_64_2_6_27_23_0_1_default
linux_x86_64_2_6_27_23_0_1_default__1_SMP_2009_05_26_17_02_05__0400
compiled_on_linux_gnu localhost_localdomain localhost net_iface_lo
net_iface_wlan0 ipv4_192_168_1_100 ipv4_192_168_1 ipv4_192_168
ipv4_192 fe80__21c_bfff_fe6e_70ef cfengine_3_0_2b4 cfengine_3_0
cfengine 3 SuSE lsb_compliant suse suse_n/a suse_11_1 suse_11
agent )
ÀýÈç, һϵÁÐĿǰÒѶ¨ÒåºÃµÄÀà¡£ÈÎºÎÆäÖеÄÒ»¸öÀࣨ»òÒ»¸ö×éºÏ£©±¾Äܹ»±»ÓÃÀ´±êʶ³Ðŵ¡£Õâ¾ÍÊÇcfengine ËùÖ¸µÄÄÄÖÖ³¡ºÏ±£³ÖÄÄÖÖ³ÐŵµÄ·½·¨¡£²¹³ä²Î¿¼¼ûÕ½Ú4.4¡£
×îºó¼Çסһ¼þÊ£ºÈç¹ûÄãÊÔͼÓÃÃüÁî`cf-promises -r' À´´¦ÀíÕâ¸ö£¬Ä㽫¿´µ½ÕâÑùµÄһЩÊä³ö£º
atlas$ ~/LapTop/Cfengine3/trunk/src/cf-promises -r -f ~/test.cf
Summarizing promises as text to ~/test.cf.txt
Summarizing promises as html to ~/test.cf.html
`-r' Ñ¡Ïî²úÉúÁËÒ»¸ö±¨¸æ¡£¼ì²éËù²úÉúµÄÎļþ£º
cat ~/test.cf.txt
firefox ~/test.cf.html
Ä㽫»á¿´µ½Ò»¸ö¹ØÓÚcfengine ÈçºÎ·ÒëÕâЩHTML»òtextÎļþµÄ×ܽᡣÔÚʹÓÃÕâ¸öÑ¡Ïîʱ£¬ËùÓеÄcfengine ×é¼þ½«²úÉú´øÓÐÀ©Õ¹ÊÓͼµÄµ÷ÊÔÎļþ£¨ÀýÈçΪÁËÅäÖÃÎļþ±»ÃüÃûΪ'promise_output_agent.h'£¬ËüÃǽ«´´½¨Îļþ'promise_output_agent.html' and 'promise_output_agent.txt' £©¡£
¼üÈëÏÂÃæµÄÀý×Ó£º
body common control
{
bundlesequence => { "test" };
}
bundle agent test
{
files:
# ÕâÊÇÒ»¸öÒ»´ÎÐÔµÄÆÀÂÛ£¬ÏÂÃæÊǾßÌåµÄ³Ðŵ
"/tmp/testfile" # ÐíŵÕß
comment => "This is for keeps...", # ¼´Ê±×¢ÊÍ
create => "true", # Ô¼ÊøÌõ¼þ 1
perms => p("612"); # Ô¼ÊøÌõ¼þ2, rw---x-w-
}
# ÕâÊÇÒ»¸öÆÕͨµÄÌî³äÄ£°å£¬ÈóÐŵÖ÷ÌåÓòÎÊýÀ´±íʾ£¬¸ü¼ÓÕû½à²¢¿ÉÔÙÀûÓÃ
# ³ÐŵÖ÷Ìåthe promise body tidier and re-usable
body perms p(x)
{
mode => "$(x)";
}
Õâ¸öÀý×ÓÏÔʾÁËÆäËûµÄÊôÐÔÈçºÎ¼ÓÈë³ÐŵµÄÖ÷Ìå¡£Perms ÉùÃ÷µÄÓÒ±ßÊÇÒ»¸öÎÒÃÇÒѾ¶¨ÒåΪ'p()'µÄÄ£°å£¬Ëüµ÷ÓÃÒ»¸ö²ÎÊý¡£Ä£°å±»¶¨ÒåÔÚÒªµ÷ÓÃËüµÄ³Ðŵ×éÏÂÃæ£¬ÏÔʾÎÒÃÇÈçºÎ´´½¨¿ÉÔÙÓõIJÎÊý×éºÏ¡£ÔÚÕâÖÖÇé¿öÏ£¬Àý×Ó²»ÖØÒª£¬µ«ÎÒÃǽö½öÖ»ÊÇ¿ªÊ¼¡£µ±ÊÂÇé±äµÃ¸üæµÊ죬ÎÒÃǽ«ÔÚÕâЩ²ÎÊýÖÐÒþ²Ø´óÁ¿µÄϸ½Ú£¬Òò´ËÈÃÖ÷ÒªµÄ³Ðŵ¸üÇåÎú²¢ÇÒÄ¿µÄ¸üÃ÷È·¡£
ÏÖÔÚÖ´ÐÐcf-agentÉϵijÐŵ£º
host$ /usr/local/sbin/cf-agent -f /tmp/test.cf -I
-> Object /tmp/testfile had permission 600, changed it to 612
host$ ls -l /tmp/testfile
-rw---x-w- 1 mark users 33 2009-06-30 06:06 /tmp/testfile
'-I ' ±êÖ¾¸æËßcfengine ֻ֪ͨÎÒÃǹØÓÚÒ»Çеı仯¡£Õâ¾ÍÌṩÁË¿ÉÀí½âµÄ´óÁ¿Êä³ö£¬²¢¶àÓÚĬÈÏÇé¿ö£¨Ö»±¨¸æ²»ÄÜÐÞ¸´µÄÎÊÌâ»òÕßÃ÷È·µÄ±¨¸æ£©¡£ÎÒÃÇ·¢ÏÖcfengine °´Ë³Ðò´´½¨Îļþ£¬²¢ÏàÓ¦µØÉèÖÃȨÏÞ¡£ÏÖÔÚÊÔͼ¸Ä±äȨÏÞ£º
host$ chmod 400 /tmp/testfile
host$ ls -l /tmp/testfile
-r-------- 1 mark users 33 2009-06-30 06:06 /tmp/testfile
host$ /usr/local/sbin/cf-agent -f /tmp/test.cf -I
-> Object /tmp/testfile had permission 400, changed it to 612
host$ ls -l /tmp/testfile
-rw---x-w- 1 mark users 33 2009-06-30 06:06 /tmp/testfile
ÔÙÀ´Ò»´Î£¬¼Ç×¡Ç°ÃæµÄÀý×Ó¹ØÓÚËø¶¨ºÍifelapsedµÄ×¢ÊÍ¡£
×¢ÒâÕâ¸ö³ÐŵûÓÐÒ»¸öÏñcfengine_3::µÄÀà±í´ï¡£Èç¹ûûÓÐÈκεÄÉùÃ÷£¬½«²ÉÓÃÕâ¸öĬÈϵÄÀàany:: £¬ËüÒâζ×ÅÈκεÄʱ¼ä£¬Èκεص㣬ÈκÎλÖá£
ΪÁ˸ıäϵͳµÄ³¬¼¶Óû§ÃÜÂ룬ÎÒÃÇÐèÒª±à¼Ò»¸öÎļþ¡£Ò»¸öÎļþÊÇÒ»¸ö¸´ÔÓµÄʵÌ壬һµ©´ò¿ª£¬Äǽ«ÊÇÒ»¸ö¾ÍËüÄÚÈÝÐíÏ¿ÉÄܳÐŵµÄÐÂÊÀ½ç¡£Cfengine ÓµÓÐÒ»×éÌØ±ðÓÃÀ´±à¼³Ðŵ¡£±¸·Ýshadow Îļþ²¢¸´ÖÆËüµ½'/tmp'ÒÔÖÂÄãÄÜʹÓÃËü¡£
body common control
{
bundlesequence => { "test" };
}
bundle agent test
{
files:
"/tmp/shadow"
comment => "Set the root password",
edit_line => SetPasswd("root","xyajd673j.ajhfu");
}
Õâ¾ÍÊÇÎÒÃÇÐèÒªÔÚµÚÒ»´Î¹Û²ìÖз¢ÏÖÈ¥Àí½âÒѾÐíϵijÐŵ¡£
ÏÂÃæµÄ´úÂëÊôÓÚ±ê×¼¾²Ì¬¿â£¬²¢¿ÉÔÙÀûÓÃÀ´È·±£ÒÔÉϳÐŵ¡£È»¶ø£¬ÓëÆäËûϵͳ²»Í¬£¬Äã¿ÉÒÔÓÃCfengine×Ô¼ºµÄÓïÑÔÀ´À©Õ¹Ëü. Äã²»ÐèÒª×Ô¼º±àд¸´ÔÓµÄËã·¨»òÕßÓµÓÐÒ»¸ö¿ª·¢»·¾³¡£
#
# Òþ²ØµÄ¾²Ì¬¿â´úÂë
#
bundle edit_line SetPasswd(user,value)
{
field_edits:
"$(user):.*"
# ÒÔÓû§Ãû¿ªÊ¼Æ¥ÅäÐÐ
# ÉèÖÃÎļþµÄµÚ¶þ¸ö²ÎÊý
# ÎļþÓµÓиñʽroot:HASH: »òÕß user:HASH:
comment => "Set field 2 of a colon-table",
edit_field => col(":","2","$(value)","set");
}
########################################
body edit_field col(split,col,newval,method)
{
field_separator => "$(split)";
select_field => "$(col)";
value_separator => ",";
field_value => "$(newval)";
field_operation => "$(method)";
extend_fields => "true";
}
ĬÈϵÄcfengine ÅäÖðüº¬ÁËÒ»×é³Ðŵ£¬Ëü°ÑcfengineµÄÔ´´úÂë¸´ÖÆµ½¸ßËÙ»º´æÄ¿Â¼²¢ÇÒ°Ñ·þÎñÆ÷ÉϵIJßÂÔÎļþ¸´ÖƵ½Ä¬ÈϵÄλÖá£Õâ¸öÀý×ÓÊÇÓÃÀ´ËµÃ÷ÔÚ±¾µØÎļþϵͳÉÏ´ÓÒ»¸öÎļþ¸´ÖƵ½ÁíÒ»¸öÎļþ¡£ºóÀ´£¬µ±ÎÒÃǽ¨Á¢Ò»¸ö·þÎñÆ÷×é¼þ£¬Ä㽫Äܹ»´ÓÔ¶³ÌµÄÖ÷»úÉϸ´ÖÆÎļþ¡£ÕâÊÇÒ»¸öÄܹ»×Ô¶¯¸üÐµĹ©Ó¦ÏµÍ³µÄ¼òµ¥ÊµÀý¡£
bundle agent update
{
vars:
# Ò»¸öÔ´¸´ÖƵãµÄ±ê׼λÖÃ
"master_location" string => "/var/cfengine/masterfiles";
files:
"/var/cfengine/inputs"
comment => "Update the policy files from the master",
perms => my_p("600"),
copy_from => my_cp("$(master_location)","localhost"),
depth_search => recurse("inf");
"/var/cfengine/bin"
comment => "Update the cached binaries from installation",
perms => my_p("700"),
copy_from => my_cp("/usr/local/sbin","localhost"),
depth_search => recurse("2");
}
ÕâЩ³ÐŵÔÚËüÃǵÄÖ÷ÌåÖаüº¬Á˼¸¸öÎÒÃÇ»¹Ã»¿´¼ûµÄ¡£copy_from ÊôÐÔ¸æËßcfengine ÈçºÎ´Ó·þÎñÆ÷¸´ÖÆÎļþ¡£depth_search ÊôÐÔ¸æËßËüÔÚ×ÓĿ¼¼°ÆäÎļþÖнøÐеݹéËÑË÷¡£
³¢ÊԸıäÔ´ÎļþºÍÖ´ÐдúÀí¡£
ÁíÍâÄÇÓпÉÔÙÓõľ²Ì¬¿âÄ£°å£º
body perms my_p(p)
{
mode => "$(p)";
}
#
body copy_from my_cp(from,server)
{
servers => { "$(server)", "failover.example.org" };
source => "$(from)";
compare => "digest";
}
#
body depth_search recurse(d)
{
depth => "$(d)";
exclude_dirs => { "\.X11", ".*kde.*", "logs", "log" };
}
Õâ¶ùÓиöÁ·Ï°£º³¢ÊÔʹÓòο¼ÊÖ²áÀ´²éÕÒÔÚÕâ¸öÀý×ÓÖеÄÔªËØ¡£¿´¿´ÄãÄÜ·ñÀí½âÈ«²¿¡£
Cfengine °üº¬ÁËÒ»¸ö³ÉΪ'cf-report 'µÄ±¨¸æÉú³ÉÆ÷ ¡£ËüÊÇͨ¹ýʹÓÿØÖƲÎÊýÀ´ÅäÖõģ¬Õⲿ·Ö½«ÔÚÏÂÕÂÃèÊö¡£³¢ÊÔÈçÏ£º
host$ /usr/local/sbin/cf-reports
host$ ls ~/.cfagent/reports
host$ mywebbrowser ~/.cfagent/reports/performance.html
´ó¶àÊýµÄÕâЩ±¨¸æÆð³õ¶¼Êǿհ׵쬳ý·ÇÄãÔÚcfengineÉÏÒѾÔËÐÐÁËÒ»Ð©ÖØÒªµÄ³Ðŵ¡£
Cfengine °üº¬ÁËÒ»Ïî·þÎñ£¬ËüÓÃÀ´ÔËÐгÆ×÷exec-daemonµÄ´úÀí£¬Õâ¸ö´úÀíÔÚĿ¼¡¯WORKDIR/inputs/promises.cf¡¯ ÒѾÓÐĬÈÏÅäÖá£Èç¹ûÄãÖ±½ÓÖ´ÐÐÔ´´úÂ룬Ëü½«Ö±½Ó½øÈëºǫ́²¢Ä¬ÈÏÿÎå·ÖÖÓÖ´ÐÐ'cf-agent'ÉϵÄĬÈϲßÂÔ¡£
Äã¿ÉÒÔ³¢ÊÔÔÚǰ̨³ÌÐòÖÐÔËÐУº
host$ /usr/local/sbin/cf-execd -F
µ±ÄãÏñÕâÑùÔËÐÐcfengine ,À´×ÔÓÚcfengineµÄÈκÎÊä³ö½«±»ÊÕ¼¯²¢·ÅÔÚÔÚ¡¯WORKDIR/outputs¡¯Ä¿Â¼ÖС£Èç¹ûÄãÒѾÅäÖÃÁËÒ»¸öÓʼþµØÖ·²¢ÇÒÄãµÄÖ÷»úÕýÔÚÔËÐÐSMTP·þÎñ£¬Õâ¸öÊä³ö½«ÒÔÓʼþÐÎʽ·¢ËͳöÈ¥¡£ÎªÁËÈç´ËÅäÖã¬ÄãÒªÔÚ¡®promises.cf¡¯ÎļþÖмÓÈëÒ»¸ö¿ØÖÆÖ÷Ìå¡£
body executor control
{
splaytime => "1";
mailto => "cfengine_mail@example.org";
smtpserver => "localhost";
mailmaxlines => "30";
}
ÕâЩÆäËûµÄÐиıäÁËÖ´ÐÐÕß¹ÌÓÐÐÐΪµÄ²»Í¬·½Ãæ¡£ÀýÈ磬ÔÚÖ´ÐдúÀíǰµÄÒ»¸ö¸ºÔØÆ½ºâµÄʱ¼äÑÓ³Ù£¬Ò»¸öÓÊÏ䵨ַ£¬SMTP Óʼþ·þÎñµÄ±ðÃûºÍIPµØÖ·£¬»¹Óб»°üº¬ÔÚ·¢³öµÄÈκÎÓʼþÖеÄÊä³öµÄ×î¶àÐÐÊý¡£
ͨ¹ýcfengineµÄÅäÖã¬ÄãÓ¦¸Ã¿ªÊ¼Ã÷°×ËüµÄģʽ¡£ÔÚÏÂÒ»Õ½ڣ¬ÎÒÃǽ«Á˽âÒ»ÏÂÕâЩһ°ãµÄ»ù±¾ÄÚÈÝ¡£
Cfengine 3ÖеÄÒ»Çж¼¿ÉÒÔ±»½âÊÍΪһ¸ö³Ðŵ¡£³Ðŵ¿ÉÒÔ±»Öƶ¨¹ØÓÚËùÓв»Í¬ÖÖÀàµÄÖ÷Ì⣬´ÓÎļþµÄÊôÐÔµ½ÃüÁîµÄÖ´Ðм°·ÃÎÊ¿ØÖƾö¶¨ºÍ֪ʶÁªÏµ¡£
Õâ¸ö¼òµ¥µ«Ç¿´óµÄÀíÄî±£³ÖÔÚcfengine Óï·¨ÉϵÄÒ»ÖÂÐÔ¡£ÔÚ±à³ÌÓïÑÔÖÐÖ»ÓÐΨһµÄÒ»¸öÓÃ×÷ÉùÃ÷µÄÓï·¨¸ñʽ£¬ÕâÊÇÐèÒªÄãÖªµÀµÄ¡£Ëü¿´ÉÏÈ¥Ò»°ãÏñÕâÑù£º
type:
classes::
"promiser" -> { "promisee1", "promisee2", ... }
attribute_1 => value_1,
attribute_2 => value_2,
...
attribute_n => value_n;
ÎÒÃÇ̸µ½³ÐŵÕߣ¨Öƶ¨³ÐŵµÄ³éÏóʵÌ壩£¬³ÐŵÈËÊdzÐŵ֯¶¨µÄ¶ÔÏóʵÌ壬²¢ÇÒÄÇÓÐһϵÁеĹØÏµ±í£¬ÎÒÃÇ³ÆÆäΪ³ÐŵµÄÖ÷Ìå¡£³ÐŵµÄÖ÷ÌåºÍ³ÐŵÕßµÄÀàÐ͸æËßÁËÎÒÃÇÆäÖеÄÒªÁì¡£
³ÐŵÕß×ÜÊDZ»³ÐŵӰÏìµÄ¶ÔÏó¡£
²¢²»ÊÇËùÓеÄÕâÐ©ÔªËØÃ¿´Î¶¼ÊDZØÒªµÄ¡£Ò»Ð©³Ðŵ°üº¬Á˺ܶàÒþº¬µÄÐÐΪ¡£ÔÚÆäËûÇé¿öÏÂÎÒÃÇ¿ÉÄÜÏë¸ü¼ÓÃ÷ȷЩ¡£ÀýÈ磬×î¼òµ¥µÄ±¨¸æ³ÐŵÈçÏ£º
reports:
"hello world";
×î¼òµ¥µÄÃüÁî³ÐŵÈçÏÂ:
Commands:
"/bin/echo hello world";
³ÐŵÓгýÁ˳ÐŵÕßÒÔΪµÄÆäËûÒ»ÇеÄĬÈÏÊôÐÔ£¬ÀýÈ磬ִÐгÐŵµÄÃüÁî´®£¬Ò»¸ö¸ü¸´ÔӵijÐŵ°üº¬Á˺ܶàÊôÐÔ£º
# ³ÐŵÀàÐÍ
files:
# ÐíŵÕß -> ³ÐŵÕß (Èç¹ûÖ»ÓÐÒ»ÐУ¬²»ÐèÒª»¨À¨ºÅ)
"/home/mark/tmp/test_plain" -> "system blue team",
# ÊôÐÔ => Öµ
comment => "This comment follows the rule for knowledge integration",
perms => users("@(usernames)"),
create => "true";
³ÐŵÕßµÄÁÐ±í±»ÓÃÀ´Ìá¹©ÖÆ×÷Îĵµ£¬¶ø²»±»cfengine ʹÓã¬ÕýÈçÃüÁîÊôÐÔ£¨¿ÉÒÔ±»Ìí¼Óµ½ÈκεijÐŵÖУ©³ýÁËÔÚ´íÎó¸ú×ÙºÍÉó²éÉϸøÓû§Ìṩ¸ü¶àµÄÐÅÏ¢Í⣬ûÓÐÆäËûʵ¼ÊµÄ¹¦ÄÜ¡£
ÔÚÕâ¸öÀý×ÓÖÐÄã¿´µ½¼¸¸ö²»Í¬ÀàÐ͵ÄʵÌå¡£ÔÚcfengine3ÖеÄËùÓÐ×Ö·û´®£¨ÀýÈç¡°true ¡±£©±ØÐë¼ÓÉÏÒýºÅ¡£ÕâÌṩÁ˾ø¶ÔµÄÒ»ÖÂÐÔ£¬Ê¹ÀàÐͼì²é¸ü¼òµ¥£¬´íÎó¾ÀÕýÄÜÁ¦¸üÇ¿´ó¡£ËùÓÐÀàËÆº¯ÊýµÄʵÌ壨ÀýÈç users("..")£©ÒªÃ´ÊÇǶÈëµÄÌØ±ðº¯Êý£¬ÒªÃ´ÊÇÔÚÓÒ²à´øÓÐÄÚÈݵIJÎÊý»¯Ä£°å¡£
Cfengine ×é¼þÖÆ¶¨µÄijЩ³ÐŵÒѾÔú¸ùÔÚËüÃǵĴúÂëÖС£ÀýÈ磬ͨ¹ýÓʼþ·¢ËÍÊä³öµ½Ò»¸öÕýÈ·µØÖ·µÄ³Ðŵ£¬»òÔÚÖØ¸´¼ì²éÒ»¸ö³Ðŵ֮ǰ£¨ifelapsed£©µÄµÈ´ýʱ¼ä³Ðŵ¡£ËäÈ»ÕâЩ³ÐŵÊǹÌÓе쬵«ËüÃǵÄÐÐΪ¿ÉÒÔ±»¸Ä±ä¡£ÔÚcfenigne , ÐÐΪ×ÜÊÇÊܵ½³ÐŵÖ÷ÌåµÄÔ¼Êø¡£Òò´Ë¹ÌÓеÄÐÐÎªËæ×Åÿ¸ö¿ØÖÆÖ÷ÌåµÄ¸Ä±ä¶ø¸Ä±ä¡£ÄãÄÜÔڲο¼ÊÖ²áÖÐÕÒµ½ÕâЩ¿É¸Ä¶¯µÄ²ÎÊý¡£
Common ×éÊÇ×îÖØÒªµÄ×飬Äܱ»ËùÓÐcfengineµÄ×é¼þ¶ÁÈ¡¡£Ëü°üº¬Á˳Ðŵ×éµÄÁÐ±í£¬Õâ¸öÁбíÓ¦¸Ã±»¶ÁÈë²¢Òò³Ðŵ½¨Òé¶ø±»¼ì²é¡£ÔÚ`promises.cf 'ÎļþÖУº
body common control
{
bundlesequence => {
"update",
"garbage_collection",
"main",
"cfengine"
};
inputs => {
"update.cf",
"site.cf",
"library.cf"
};
}
#######################################################
body agent control
{
#Èç¹ûĬÈÏÔËÐÐʱ¼äÊÇ5·ÖÖÓ£¬ÎªÁ˳¤µÄ×÷ÒµÎÒÃÇÐèÒªÕⲿ·Ö
ifelapsed => "15";
}
#######################################################
body monitor control
{
forgetrate => "0.7";
histograms => "true";
}
#######################################################
body executor control
{
splaytime => "1";
mailto => "cfengine_mail@example.org";
smtpserver => "localhost";
mailmaxlines => "30";
}
#######################################################
body reporter control
{
reports => { "performance", "last_seen", "monitor_history" };
build_directory => "/tmp/nerves";
report_output => "html";
}
#######################################################
body runagent control
{
hosts => {
"127.0.0.1"
# , "myhost.example.com:5308", ...
};
}
#######################################################
body server control
{
allowconnects => { "127.0.0.1" , "::1" };
allowallconnects => { "127.0.0.1" , "::1" };
trustkeysfrom => { "127.0.0.1" , "::1" };
# ÈøüкÍÔËÐÐÒ»´ÎÐÔ·¢Éú
cfruncommand => "$(sys.workdir)/bin/cf-agent -f failsafe.cf &&
$(sys.workdir)/bin/cf-agent";
allowusers => { "root" };
}
±äÁ¿£¨»ò"±äÁ¿¶¨Òå"£©Ò²ÊdzÐŵ—±íʾËüÃÇÖµµÄ³Ðŵ¡£ÎÒÃÇ¿ÉÒÔÔÚÈκγÐŵ×éÖÐдÏÂÕâЩ¡£Cfengine ÈÏʶµ½Á½¸öʵÌåÀàÐÍ£º±êÁ¿ºÍÁÐ±í£¨ÁÐ×é°üÀ¨0»ò¸ü¶àµÄʵÌ壩£¬»¹ÓÐÈý¸öÊý¾ÝÀàÐÍ£¨×Ö·û´®£¬ÕûÊýºÍʵÊý£©¡£ÔÚcfengine µÄÊäдÊÇÁé»îµÄ£¬ÕýÈçÔÚPerl ºÍÆäËûµÄ½Å±¾ÓïÑÔÖС£Òò´ËÈκÎÊý¾ÝÀàÐ͵ıäÁ¿¿ÉÄܱ»µ±×÷×Ö·û´®¡£
±êÁ¿±äÁ¿ÓµÓÐÒ»¸öµ¥Ò»µÄÖµ¡£ÉùÃ÷ÈçÏÂ:
bundle <type> name
{
vars:
"my_scalar" string => "String contents...";
"my_int" int => "1234";
"my_real" real => "567.89";
}
`<type>' ±íʾÈκÎÀàÐ͵Ä×éÊÊÓÃÓÚÕâÀï¡£±êÁ¿±äÁ¿Í¨¹ý `$(name)' (or `${name}')±»ÒýÓ㬲¢ÇÒËüÃÇÿһ´Î´ú±íÒ»¸öµ¥Ò»µÄÖµ¡£
l ²»´ø»·¾³µÄ±êÁ¿ £¬ÀýÈç `$(myvar)' Ö»ÏÞÓÚµ±Ç°×é
l Èç¹ûÓÐÈËʹÓÃÁË»·¾³À´¼ìÑéËü£¬ÄÇô±êÁ¿ÔÚÈκ䦶¼¿ÉÓá£ÀýÈ磬`$(context.myvar)' ÓÃÓÚ·ÃÎʶÁÈ¡'context'×éÖеÄ'myvar'±äÁ¿.
Áбí±äÁ¿ÓµÓм¸¸öÖµ¡£ ÉùÃ÷ÈçÏ£º
bundle <type> name
{
vars:
"my_slist" slist => { "list", "of", "strings" };
"my_ilist" ilist => { "1234", "5678" };
"my_rlist" rlist => { "567.89" };
}
Ò»¸öÁбí»á´øÓзûºÅ`@'×÷Ϊ²Î¿¼£¬µ«ÊÇÔÚ×Ö·û´®ÖÐ,Õâ¸ö²Î¿¼Í¨³£Ã»ÓÐÈκÎÒâÒå¡£¾Ù¸öÀý×Ó:
reports:
cfengine_3::
"My list is @(my_slist)";
ÕâûÓÐÈκÎÒâÒå²¢ÇÒ²»ÄÜÕ¹¿ª£¨Ëü²»²úÉúÒ»¸ö´íÎ󣬵«Ïà·´²åÈëÎÄ×ÖÄÚÈÝ@(my slist)µ½×Ö·û´®ÖУ©£»µ«ÊÇÈç¹ûÎÒÃÇʹÓñêÁ¿ÒýÓõ½Ò»¸öÁбí±äÁ¿£¬cfengine½«ÔÚÕâ¸öÁбíÖÐÖØ¸´Õâ¸öÖµ£¬ÓбØÒª½«Ëü¹é½øÈëÒ»¸ö³ÐŵÁÐ±í¡£
¼ò¶øÑÔÖ®£º
l ±êÁ¿ÒýÓõ½local µÄÁбí±äÁ¿Òâζ×ŵü´ú¡£ÀýÈ磬¼ÙÉèÎÒÃÇÒѾÓб¾µØÁбí±äÁ¿`@(list)', ÄÇô±êÁ¿`$(list)' Òâζ×ÅÔÚÁбíÿһ¸öÖµµÄÒ»´Îµü´ú¡£
l Áбí¿ÉÔÚÈκλ·¾³ÖÐÈ«¾ÖͨÓ㬲¢ÇÒÓà `@(list)'±íʾ,
e.g.
vars:
"longlist" slist => { @(shortlist), "plus", "plus" };
"shortlist" slist => { "you", "me" };
ÉùÃ÷µÄ˳Ðò²»ÖØÒª—cfenging ½«Ö´ÐзÖÅä±äÁ¿`@(shortlist)'µÄ³Ðŵ£¬È»ºóÖ´ÐзÖÅä±äÁ¿ `@(longlist)' µÄ³Ðŵ¡£
l Ö»Óб¾µØÁбí¿ÉÒÔÖ±½ÓÕ¹¿ª¡£Òò´Ë`$(list)' ¿ÉÒÔ±»Õ¹¿ª¶ø²»ÊÇ`$(context.list)' ¡£Èç¹ûÄãÏëÓÃËüÃÇÀ´µü´ú£¬È«¾ÖÁбíÒýÓñØÐëÓ³Éäµ½Ò»¸ö±¾µØ»·¾³ÖС£ÎªÁ˸ü¶àµÄÁ˽âÇë¿´²Î¿¼Êֲᡣ
¹ØÁªµÄÊý×é±äÁ¿Ò²ÓµÓм¸¸öÖµ¡£ÉùÃ÷ÈçÏ£º
bundle <type> name
{
vars:
"switches[mellow]" int => "1";
"switches[relaxed]" int => "1";
"off_keys" slist => { "red", "grouchy", "coarse", "febrile" };
"switches[$(off_keys)]" int => "0";
}
ΪÁËÁË½â¹ØÁªÊý×é`getindices' µÄ¹¦ÄÜºÍÆäËûϸ½Ú²¿·Ö£¬Çë¿´²Î¿¼Êֲᡣ
CfengineµÄ¾ö¶¨ÊÇÔÚºǫ́×÷³öµÄ£¬È·¶¨µÄ¶Ô»ò´íÌáÒéµÄ½á¹û±»´¢´æÔÚ²¼¶ûÖµÖУ¬±»³ÆÎªÀà¡£
ÔÚcfengine ÖÐûÓÐif-then-else ÉùÃ÷Óï¾ä¡£ËùÓеľö¶¨ÊÇͨ¹ýÀàÀ´×÷³öµÄ¡£
Cfengine ÔÚÿһ̨µçÄÔÉ϶ÀÁ¢µØÔËÐУ¬Ã¿´Îµ±Ëü»½ÐÑDZÔÚµÄͨÓôúÀíÆ½Ì¨£¬ËüÄÜ·¢ÏÖÔËÐл·¾³»ò±³¾°µÄÌØÐÔ²¢ÇÒ½øÐйéÀà¡£
Àà·Ö³ÉÓ²¼þÐÍ£¨¹«¿ªµÄ£©ºÍÈí¼þÐÍ£¨×Ô¶¨ÒåµÄ£©¡£Ò»¸ö¼òµ¥µÄÓ²¼þÐÍÀà¿ÉÒÔÊǼ¸ÖÖÇé¿öµÄÆäÖÐÖ®Ò»£º
l Ò»¸ö²Ù×÷ϵͳ¼Ü¹¹µÄÃüÃû £¬ÀýÈç ultrix ,sun4µÈµÈ¡£
l Ò»¸öרÓÃÖ÷»úµÄδÏÞ¶¨Ãû×Ö¡£Èç¹ûÄãµÄϵͳ·µ»ØÒ»¸öÍêÈ«ÏÞ¶¨µÄÖ÷»úÓòÃû£¬cfengine½«ÉáÈ¥µÚÒ»²¿·Ö¡£×¢Ò⣺www.sales.company.com ºÍ www.research.company.com ÓÐÏàͬµÄδÏÞ¶¨Ãû×Ö¡£
l Ö÷»úµÄÒ»¸ö×Ô¶¨Òå×éµÄÃû×Ö
l Ò»ÐÇÆÚÖÐÒ»Ì죨ÒÔMonday, Tuesday, Wednesday, .. ¸ñʽ±íʾ£©
l Ò»ÌìÖеÄһСʱ£¬Ä¿Ç°Ê±Çø£¨ÒÔHr00, Hr01 ... Hr23 ¸ñʽ±íʾ£©
l Ò»ÌìÖеÄһСʱ£¬¸ñÁÖÍþÖÎʱ¼ä£¨ÒÔGMT_Hr00, GMT_Hr01 ... GMT_Hr23¸ñʽ±íʾ£©¡£ÕâÓëÊÀ½çͬ²½£¬ÒÔ·ÀÄãÐèÒª¸Ä±äºÏ×÷ʱ±£³Öʵ¼ÊµØÍ¬²½
l СʱÖеķÖÖÓ£¨ÒÔMin00, Min17 ... Min45¸ñʽ±íʾ£©
l СʱÖеÄ5·ÖÖÓ¼ä¸ô£¨ÒÔMin00_05, Min05_10 ... Min55_00¸ñʽ±íʾ£©
l ÿһ¿ÌÖÓ£¨ÒÔQ1, Q2, Q3, Q4¸ñʽ±íʾ£©
l Ò»ÔÂÖÐÒ»Ì죨ÒÔDay1, Day2, ... Day31¸ñʽ±íʾ£©
l Ò»¸öÔ£¨ÒÔJanuary, February, ... December¸ñʽ±íʾ£©
l Ò»Ä꣨ÒÔYr1997, Yr2004¸ñʽ±íʾ£©
l Ò¹Íí¡¢Ô糿¡¢ÏÂÎçºÍ°øÍíµÄÒ»¸öת»»£¬»®·ÖΪ6СʱµÄʱ¼ä¿é£¬ÒÔʱ¼ä00£º00¿ªÊ¼
l Ò»¸öÉúÃüÖÜÆÚµÄË÷Òý£¬¾ÍÊÇÄêÊýÒÔ3Ϊģ £¨Ê¹ÓÃÔÚ³¤ÆÚ×ÊÔ´µÄÄÚ´æÖУ©
l Ò»¸öÈÎÒâµÄ×Ô¶¨Òå´®
l ÈκÎÓÐЧ½Ó¿ÚµÄIP µØÖ·°Ëλ×飨ÒÔipv4_192_0_0_1,ipv4_192_0_0, ipv4_192_0, ipv4_192¸ñʽ±íʾ£©
À´¿´¿´ËùÓж¨ÒåÔÚרÓÃÖ÷»úÉϵÄÀà £¬ÔËÐÐ
host# cf-promises –v
×÷Ϊһ¸öÏíÓÐÌØÈ¨µÄÓû§¡£×¢ÒâÆäÖеÄһЩÀàÖ»ÓÐÔÚÓÃcfenvd½¨Á¢ÐÅÈÎÁ¬½ÓµÄÇé¿öϲÅÄÜÉ趨¡£ÀýÈ磬Èç¹û¶¼ÒÔÌØÈ¨ÔËÐУ¬ÄÇôÎļþ`/var/cfengine/state/env_data' Êǰ²È«µÄ¡£¸ü¶à¹ØÓÚÀàµÄÐÅÏ¢¿ÉÒÔ²ÎÓÐ¹Ø allclasses .
×Ô¶¨ÒåÐÍ»òÈí¼þÐÍÀà±»¶¨ÒåÔÚ×éÖС£ÀàÐÍcommonµÄ×é¿ÉÒÔÒÔÀà±íʾ£¬¾ßÓÐÈ«¾ÖÐÔ£¬È»ºóÔÚÆäËû×éÀàÐÍÖÐÊDZ¾µØ¿ÉÓõġ£µ±ÆÀ¹À×éʱ£¬Èí¼þÐ͵ÄÀàÒ²±»ÆÀ¹ÀÁË¡£ËüÃǿɻùÓÚ²âÊÔ¹¦ÄÜ»òÕßÀ´×ÔÆäËûÀàÐ͵ÄÀࣺ
bundle agent myclasses
{
classes:
"solinus" expression => "linux||solaris";
# Áгö¸ñʽÓÐÒæÓÚËù°üÀ¨µÄ¹¦ÄÜ
"alt_class" or => { "linux", "solaris", fileexists("/etc/fstab") };
"oth_class" and => { fileexists("/etc/shadow"), fileexists("/etc/
passwd") };
reports:
alt_class::
# Õ⽫ÔÚ linux, solaris,»òÈκÎϵͳÖÐÖ»±¨¸æ "Boo!"
# ϵͳÉϵÄÎļþ /etc/fstab ´æÔÚ
"Boo!";
}
Àà¿ÉÒÔÓëÔËËã·û½áºÏ£¬ÓÅÏȼ¶°´´Ó¸ßµ½µÍµÄ˳ÐòÁгö£º
`()' À¨ºÅ×éÔËËã·û
`!' ·ÇÔËËã·û
`.' Âß¼ÓëÔËËã·û
`&' Âß¼ÓëÔËËã·û (¶þѡһ)
`|' Âß¼»òÔËËã·û
`||' Âß¼»òÔËËã·û(¶þѡһ).
ËùÒÔÏÂÃæµÄ±í´ïÊÇÕýÈ·µÄ:ÔÚWindows XPϵͳÖÐÓÚÐÇÆÚÒ»»òÐÇÆÚÈýµÄÏÂÎç2µãµ½2£º59 :
(Monday|Wednesday).Hr14.WinXP::
¿´¿´ÏÂÃæ¸ü¸´ÔÓµÄÀý×Ó¡£ÔÚcommon ÀàÐÍ×éµÄ³Ðŵ¾ßÓÐÈ«¾ÖÐÔ£¬¶øËùÓÐÆäËûµÄ³ÐŵֻÏÞÓÚËûÃǸ÷×ÔµÄ×éÖС£
body common control
{
bundlesequence => { "g","ls_1", "ls_2" };
}
#################################
bundle common g
{
classes:
# "zero" ³Ðŵ×ÜÊÇÄÜÂú×㣬Ëü²»ÏÞ·¶Î§
"zero" expression => "any";
}
#################################
bundle agent ls_1
{
classes:
# "one" ³Ðŵ×ÜÊÇÄÜÂú×㣬ËüÖ»ÏÞÓÚls_1µÄ·¶Î§
"one" expression => "any";
}
#################################
bundle agent ls_2
{
classes:
# "two" ³Ðŵ×ÜÊÇÄÜÂú×㣬ËüÖ»ÏÞÓÚls_2µÄ·¶Î§
"two" expression => "any";
reports:
zero.!one.two::
# Õâ¸ö±¨¸æ@b½«»á±»Éú³É
"Success";
}
ÔÚÕâÀïÎÒÃÇ¿´µ½`zero'Àà¾ßÓÐÈ«¾ÖÐÔ¶ø`one'ÀàºÍ`two' ÀàÊÇÏÞÖÆÔÚ±¾µØÊ¹Óõġ£ÒòΪֻÓÐ `zero' and `two' ÔÚ`ls_2'×éµÄ·¶Î§ÄÚ¡££¬Òò´Ë`Success'µÄ±¨¸æ½á¹ûÊÇÕýÈ·µÄ result is therefore (²¢ÇÒ`ls_2' ×éµÄÀà±í´ïÒªÇó`zero'ºÍ`two' ¶¼ÊÇÕýÈ·µÄ£¬³ýÁË`one'Ö®Íâ)¡£
µ±ÄãÒÔ³ÌÐòÔ±µÄ˼άÀ´Ë¼¿¼£¬Èç¹ûÄãÔÚcfengine ÖÐѰÕÒÑ»·³ÌÐò£¬ÄÇôÎÒÃÇÐèÒª¶ÔÄã½øÐÐÒ»²¿·ÖµÄÏ´ÄÔ¡£Cfengine ²»ÊÇÒ»ÖÖÒâζןøÄãµÍ¼¶µÄ¿ØÖÆÈ¨Ï޵ıà³ÌÓïÑÔ£¬ËüÖ»ÊÇÒ»Ì×¾ßÌåÃèÊö¹ý³ÌµÄÉùÃ÷¡£Õâ¾ÍÏ൱ÓÚ×ÔÐгµÉϵijÝÂֺʹ«ËÍÉ豸ÉϵÄ×Ô¶¯´«ËÍ´øµÄÇø±ðÖ®´¦¡£
ÔÚcfengine ÖÐÑ»·³ÌÐòÊÇÒþº¬Ö´Ðе쬵«Ã»ÓпɼûµÄ»úÖÆ£¬ÒòΪÕâÑù»á·ÖÉ¢Á˶ԳÐŵÒâͼµÄ×¢ÒâÁ¦¡£±í´ïËûÃǵķ½Ê½ÊÇͨ¹ýÁÐ±í¡£
Ñ»·³ÌÐòȷʵÊÇÒ»ÖÖÔÚÒ»¸öÁбíÖеü´úÒ»¸ö±äÁ¿µÄ·½·¨¡£¿´¿´Ï±ߡ£
body common control
{
bundlesequence => { "example" };
}
###########################################################
bundle agent example
{
vars:
# ÕâÊÇÒ»¸öÁбí
"component" slist => { "cf-monitord", "cf-serverd", "cf-execd" };
#ÕâÊÇÒ»¸ö¹ØÁªÊý×é
"array[cf-monitord]" string => "The monitor";
"array[cf-serverd]" string => "The server";
"array[cf-execd]" string => "The executor, not executionist";
reports:
cfengine_3::
"$(component) is $(array[$(component)])";
}
Êä³öÈçÏÂËùʾ£º
/usr/local/sbin/cf-agent -f ./unit_loops.cf -K
R: cf-monitord is The monitor
R: cf-serverd is The server
R: cf-execd is The executor, not executionist
Äã´ÓÕâÀï¿´µ½£¬Èç¹ûÎÒÃÇÉæ¼°µ½Ò»¸öʹÓñêÁ¿ÒýÓÃÔËËã·û'$()'µÄÁбí±äÁ¿£¬cfengine½«½øÐжԴ˱àÒ룬¼´µü´úÁбíÖÐËùÓеÄÖµ¡£Òò´ËΪÎÒÃÇÒѾÓÐÒ»¸ö·Ç³£ÓÐЧµÄ'foreach' Ñ»·£¬¶ø²»ÐèÒª¼ÓÈëÆäËûµÄÈκεÄÓï·¨¡£
ÒÔϵijÐŵÀàÐÍ¿ÉÒÔÔÚÈκÎ×éÖÐʹÓãº
vars Ò»¸ö±íʾֵµÄ±äÁ¿µÄ³Ðŵ
classes Ò»¸ö±íʾϵͳ״̬µÄ³Ðŵ
reports Ò»¸ö±¨¸æÐÅÏ¢µÄ³Ðŵ
ÕâЩÁíÍâµÄ³ÐŵÀàÐÍÖ»ÄÜÔÚ´úÀí×éÖÐʹÓãº
commands Ò»¸öÖ´ÐÐÃüÁîµÄ³Ðŵ
databases Ò»¸öÅäÖÃÊý¾Ý¿âµÄ³Ðŵ
files Ò»¸öÅäÖÃÎļþµÄ³Ðŵ£¬°üÀ¨ËüµÄ´æÔÚ£¬ÊôÐÔÒÔ¼°ÄÚÈÝ
interfaces Ò»¸öÅäÖÃÍøÂç½Ó¿ÚµÄ³Ðŵ
methods Ò»¸ö³Ðµ£Õû¸ö×éµÄ³Ðŵ
packages Ò»¸ö°²×°°üµÄ³Ðŵ
storage Ò»¸ö¼ìÑ鸽¼Ó´æ´¢Æ÷µÄ³Ðŵ
ÕâЩ³ÐŵÀàÐÍÊôÓÚÆäËûµÄ×é¼þ£º
access Ò»¸öÊÚȨ»ò¾Ü¾ø·ÃÎÊÔÚcf-serverdÖеÄÎļþ¶ÔÏóµÄ³Ðŵ
measurements Ò»¸ö´Óϵͳ¹ÀÁ¿Êý¾Ý»ò³éÑùÊý¾Ý³Ðŵ£¬ÓÃÀ´ÔÚ cf-monitord¼à²âºÍ±¨¸æ
(Cfengine ³õ¼¶°æ±¾ÒÔ¼°¸üеİ汾).
roles µ±ÔÚcf-serverdÉÏÔ¶³ÌµÄÔËÐÐcf-agent ,Ò»¸öÔÊÐíÌØ¶¨µÄÓû§¼¤»îÌØ¶¨
ÀàµÄ³Ðŵ
topics Ò»¸öÔÚcf-know½«ÖªÊ¶ÓëÃû×ÖºÍÆäËû¿ÉÄܵÄÖ÷ÌâÁªÏµÆðÀ´µÄ³Ðŵoccurrences Ò»¸öÔÚcf-knowÖÐÖ¸Ïò»òÉæ¼°ÖªÊ¶×ÊÔ´µÄ³Ðŵ
Unix µÄcronÃüÁîÊÇÓÐÓõ쬵«ËüʹÓÃÆðÀ´ÓÖÍùÍù·Ç³£±¿×¾¡£ Cfengine µÄÒ»´óÓŵã¾ÍÊÇËüÄÜʹÓÃÀಢͨ¹ýÒ»¸ö»òÕß¶à¸öÎļþʶ±ð²»Í¬µÄϵͳ¡£Ðí¶à¹ÜÀíÔ±ÈÏΪÈç¹ûcron½ø³ÌÒ²ÄÜÒÔÕâÖÖ·½Ê½¹¤×÷£¬ÄǸöàºÃ¡£ Ò»ÖÖ´ÓÈ«¾ÖÅäÖõĽǶÈÉèÖÃcronµÄ¿ÉÐз½·¨¾ÍÊÇʹÓÃcfengineµÄÎı¾±à¼¹¦ÄÜÀ´·Ö±ð±à¼Ã¿Ò»¸öcronÎļþ¡£µ«²»¹ÜÔõÑùÕâÖÖ·½·¨»¹ÊÇ´í¹ýÁËÒ»¸öºÜÃ÷ÏԵĻú»á¡£
Ò»¸ö¸üºÃµÄ·½·¨ÊÇʹÓÃcfengineµÄʱ¼äÀàÈÃcronÒÔÓû§½Ó¿ÚµÄ·½Ê½¹¤×÷¡£ ÕâÖÖ·½·¨¿ÉÒÔÈÃÄãÓµÓÐÒ»¸öµ¥¶ÀµÄ°üº¬ÁËϵͳËùÓÐcronÈÎÎñµÄcfengineµÄÖ÷ÒªÎļþ£¬²¢ÇÒ²»»áʧȥcronËùÌṩ¸øÄãµÄÖÕ¶Ë¿ØÖÆ¡£ÕâÖÖ·½·¨¾ß±¸ÁËËùÓÐÆÕ±éµÄÓŵã:
µ±Äã°ÑËùÓеĶ«Î÷¶¼·ÅÔÚÒ»´¦Ê±£¬ Ëü»áʹµÃ±£³Ö¸ú×ÙÄãµÄϵͳÕýÔÚÔËÐÐʲôÑùµÄcronÈÎÎñ±äµÄ¸üÈÝÒס£
Äã¿ÉÒÔʹÓÃËùÓÐÄ㾫ÐÄÉè¼ÆµÄ×éºÍÓû§¶¨ÒåµÄÀàÀ´Ê¶±ðÄÄÒ»¸öÖ÷»úµÃÒªÓÐÔËÐÐÄÄЩ³ÌÐò¡£
Õâ¸ö»úÖÆµÄºËÐÄ˼ÏëÊÇÔÚÿһ¸öϵͳÉÏÉèÖÃÒ»¸ö¹æÂɵÄcronÈÎÎñ,Õâ¸öÈÎÎñ»á°´Ò»¶¨µÄƵÂʼä¸ôÖ´ÐÐcfagent¡£ ÿ´Îcfagent Æô¶¯ºó£¬ Ëü»áÆÀ¹ÀÒ»ÏÂʱ¼äÀಢÇÒÖ´ÐÐÅäÖÃÎļþÖж¨ÒåµÄshellÃüÁͨ¹ýÕâÖÖ·½Ê½ ÎÒÃÇʹÓÃcfagent·â×°cronµÄ½Å±¾,´Ó¶ø¿ÉÒÔʹÓÃcfengineµÄÀàÀ´¿ØÖƶà¸öÖ÷»úµÄÈÎÎñ¡£ CfengineµÄʱ¼äÀàÖÁÉÙÓëcronµÄʱ¼ä˵Ã÷ÊéµÄ¹¦Äܲ¶àÇ¿´ó£¬ ËüÃÇ»¹Ôö¼ÓÇøÓò¿ØÖƵŦÄÜ¡£ÕâÒ»µãÍêÈ«²»»áÏÞÖÆÄ㣬¼ûÕ½Ú5.5 [´´½¨Áé»îµÄʱ¼äÀà]£¬µÚ32Ò³¡£×öÕâЩµÄΨһµÄ´ú¼Û¾ÍÊÇÐèÒª½âÎöcfenginÖÐÎ޹ؽôÒªµÄÎļþ¡£
ÎÒÊÇ·ñÐèҪʹÓÃCRON? ²»ÐèÒª¡£ÓÐÁËcfengineµÄ cf-execd, Äã¾Í²»ÐèҪʹÓÃcronÁË£¬cfengineÄܹ»×Ô¶¯°²ÅźÃÒ»ÇС£¹ØÓÚÊÇÑ¡ÔñÒÔºǫ́³ÌÐòµÄģʽ£¨daemon mode£©»¹ÊÇ·â×°µÄģʽ(wrapped mode)À´ÔËÐÐcf-execd£¬ÕâÍêÈ«ÓÉÄãÀ´¾ö¶¨¡£ÔÚcfengineµÄÉÌÒµ°æ±¾ÖУ¬¿ÉÖ´Ðеĺǫ́³ÌÐò(exec daemon)¾ß±¸Á˸ü¼Ó¾«Ï¸µÄ¿É¿¿ÐÔ¡£ÔÚ¿ªÔ´µÄ°æ±¾ÖУ¬ÄãÒ²Äܹ»·Ç³£ÊæÊʵÄʹÓÃcfengine¶ÀÁ¢µØ¼àÊÓϵͳ£¬ÓÈÆäÊÇÓöµ½Ô´´úÂë¸üеĹý³ÌÖгöÏÖµÄÔËÐгÌÐòÓÉÓÚ³ö´í¶øËÀ»úµÄÇé¿ö¡£
ΪÁËÄܸüÃ÷È·µÄ˵Ã÷£¬¼ÙÉèÎÒÃÇÔÚÄãµÄÍøÂçµÄÿһ̨Ö÷»úÉ϶¼°²×°ÁËÒÔÏ嵀 ¡®crontab¡¯Îļþ£º
#
# CronÈ«¾ÖÎļþ
#
*/5 * * * * /usr/local/sbin/cf-execd -F
Ò»¸ö³Ðŵ×éµÄ½á¹¹ÐèÒªÄÜ·´Ó³ÄãµÄϵͳÉÏÕýÔÚÔËÐеÄÈÎÎñµÄ²ßÂÔ¡£ÄãÐèÒª¸ù¾ÝÿÌìµÄʱ¼ä´ò¿ªÏà¹ØµÄÈÎÎñ²¢ÇҹرÕÄÇЩ²»ÏëÒªµÄÈÎÎñ¡£Õâ¸ö¹¤×÷¿ÉÒÔͨ¹ý°Ñ²»Í¬µÄ¶¯×÷·ÅÔÚÏàÓ¦µÄʱ¼äÀàÏÂÀ´ÊµÏÖ£¬ÕâЩʱ¼äÀàÄܹ»ÏÞÖÆÔÚʲôʱ¼äÀ´Ö´ÐÐÕâЩÈÎÎñ¡£
¡¡¡¡¡¡promise-type:
¡¡¡¡¡¡¡¡¡¡¡¡¡¡time-based classes::
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Promise
ÀýÈ磺
bundle agent example
{
commands:
# ÔÚÎçºóµÄµÚÒ»¸ö15·ÖÖÓÄÚÖ´ÐÐ
¡¡¡¡Hr12.Q1::
¡¡¡¡¡¡¡¡"/path/myscript -arg1 -arg2";
# ÔÚÈκÎʱ¼äµÄ15·ÖÖÓÄÚÖ´ÐÐ
¡¡¡¡Q2::
¡¡¡¡¡¡¡¡"/path/otherscript";
# ÔÚʱ¼ä¶Î 00:10 µ½ 00:15 ºÍ12:45 µ½12:55Ö´ÐÐ
# ÔÚÓ¢ÓïÓïÑÔÖбíʾΪ"ºÍ"£¬ µ«ÔÚÂß¼ÓïÑÔÖбíʾΪ"Ö»ÒªÂú×ãÆäÖÐÒ»¸öʱ¼ä¶Î"
¡¡Hr00.Min10_15||Hr12.Min45_55::
¡¡¡¡¡¡¡¡"/path/amongstourscripts";
}
Èç¹ûÄãÏëÒª¸ü»¨ÉÚÒ»µã£¬Äã¿ÉÒÔͬ´´½¨Ò»¸ö²ã´Î½á¹¹À´·ÅÖÃÖ´Ðнű¾µÄ²ÎÊý£¬Õâ¸ö²ã´Î½á¹¹Äܹ»ÏÞÖÆÊä³ö½á¹ûºÍÓÅÏȼ¶£¨Õâ¸ö¹¦ÄÜÖ»ÓÐrootÓû§¿ÉÒÔʹÓã¬ÒòΪֻÓÐrootÓû§ÓÐȨÀû¸Ä±äÓÅÏȼ¶£©¡£
bundle agent example
{
commands:
#ÔÚÎçºóµÄµÚÒ»¸ö15·ÖÖÓÄÚÖ´ÐÐ
¡¡¡¡Hr12.Q1::
¡¡¡¡¡¡"/path/myscript -arg1 -arg2",
¡¡¡¡¡¡contain => jail("nobody","true");
}
# ...
body contain jail(owner,devnull)
{
¡¡¡¡exec_owner => "$(owner)"; # ʹÓà setuidÔËÐÐ
¡¡¡¡no_output => "$(devnull)"; # ÀàËÆ > /dev/null 2>&1
¡¡¡¡umask => "77"; # ÉèÖÃÎļþȨÏÞÑÚÂë
}
`contain'·½·¨ÌåÌṩÁËÒ»¸ö°²È«Áé»îµÄ»·¾³À´Ç¶Èë½Å±¾¡£
ÀàµÄʱ¼ä·Ö±æÄÜÁ¦ÊÜÏÞÓÚÄã¶à¾ÃÔËÐÐÒ»´Îcfengine»òÕßcron»òÕßcf-execd¡£Í¨³££µ·ÖÖÓÊDZȽÏÍÆ¼öµÄʱ¼ä¼ä¸ô¡£
ÔÚÒ»¸ö³Éǧ̨¼ÆËã»úµÄÍøÂçÖУ¬Ðí¶à´úÀí£¨agents£©¿ÉÒÔͬʱ¿ªÊ¼Ö´Ðв¢´Ó·þÎñÆ÷ÉÏÏÂÔØ×ÊÔ´¡£ÀýÈ磬Èç¹ûÓÐһǧ̨cf-agents¶¼Í»È»Ïë´ÓÒ»¸ö·þÎñÔ´£¨master source£©Í¬Ê±¿½±´Ò»¸öÎļþ£¬Õ⽫»áµ¼Ö·þÎñÆ÷³ÐÔØÌ«´óµÄ¸ºÔØ¡£ÎÒÃÇ¿ÉÒÔͨ¹ýÒý½øÊ±¼äÑÓʱÀ´±ÜÃâÕâ¸öÎÊÌâµÄ²úÉú£¬Ê±¼äÑÓʱ¶ÔÓÚÿһ¸öÖ÷»ú¶¼ÊÇΨһµÄ²¢ÇÒ²»»á³¬¹ý¸ø¶¨µÄʱ¼ä¼ä¸ô£»cf-execd ʹÓÃÉ¢ÁÐËã·¨£¨hashing algorithm£©Éú³ÉÒ»¸öÊýÖµ£¬·¶Î§ÔÚ£°µ½ÄãËù¹æ¶¨µÄ·ÖÖÓÊýµÄ×î´óÖµÖ®¼ä£¬ÀýÈ磺
body executor control
{
¡¡splaytime => "10"; # Minutes
}
Èç¹ûÕâ¸öÊýÖµ·ÇÁ㣬cf-execd»áÔÚ½âÎöÁËÅäÖÃÎļþ²¢¶ÁÁËʱÖÓºó½øÈëÐÝÃß״̬¡£Ã¿Ò»Ì¨»úÆ÷µÄcf-execd¶¼»áÔÚ²»Í¬µÄʱ¼ä³¤¶Èºó½øÈëÐÝÃß״̬£¬Õâ¸öʱ¼ä³¤¶È²»»á³¬¹ý¹æ¶¨µÄʱ¼ä¡£
É¢ÁÐËã·¨£¨hashing algorithm£©£¬»ùÓÚÍêÈ«ºÏ¸ñµÄÖ÷»úÃû£¬±»ÓÃÀ´ÎªÃ¿Ì¨Ö÷»ú¼ÆË㲻ͬµÄʱ¼ä¡£¼ä¸ôʱ¼äÔ½¶Ì£¬Ö÷»úËùÊôµÄ×éÔ½¶à¡£¼ä¸ôʱ¼äÔ½³¤£¬Äã·þÎñÆ÷Ëù³Ðµ£µÄ¸ºÔØÔ½Çá¡£ÔËÐÐʱ¼äµÄ¡®Õ¹¿ª¡¯Äܹ»¼õÇá·þÎñÆ÷µÄ¸ºµ££¬¼´Ê¹ËüÃÇÀ´×ÔÓÚÄãËù²»ÄÜ¿ØÖƵÄÓò£¬µ«Ö»ÒªÓÐÀàËÆµÄcron²ßÂԾͿÉÒÔ¡£
ÿ´ÎcfengineÔËÐеÄʱºò£¬Ëü»á¶ÁȡϵͳʱÖÓ²¢»ùÓÚʱ¼äºÍÈÕÆÚÀ´¶¨ÒåÀࣨ¼û²Î¿¼Êֲᣩ¡£
ʱ¼äÀàÊÇ»ùÓÚcfagentÆô¶¯Ê±µÄ¾ßÌå·ÖÖÓ£¬µ«Ëü²»»áÖ±½Ó±»ÓÃÔÚ²ßÂÔÖУ¨³ý·Çcf-execdÖÐÒѾ¹æ¶¨ÁË£©¡£Ðí¶àÊÂÇé¿ÉÄÜÇ¡ÇÉ»áÑÓ³ÙcfengentÆô¶¯µÄ¾ßÌåʱ¼ä¡£Äܹ»¼à²â¾ßÌåÆô¶¯Ê±¼äµÄÖ÷ҪĿµÄÊÇΪÁËÄܹ»¶¨Ò幨ÓÚÈÎÒâʱ¼ä¼ä¸ôµÄ×éºÏÀࡣΪÁËʵÏÖÕâ¸ö¹¦ÄÜ£¬ÎÒÃÇʹÓÃÀà×éµÄÐÐΪÀ´´´½¨Ò»¸ö×éµÄʱ¼äÖµµÄ±ðÃû¡£½ÓÏÂÀ´ÊÇһЩºÜÓд´ÔìÐÔµÄÀý×Ó£º
¡¡¡¡¡¡¡¡classes: # synonym groups:
¡¡¡¡¡¡¡¡"LunchAndTeaBreaks" expression => "!(Saturday|Sunday).(Hr12|Hr10|Hr15)";
¡¡¡¡¡¡¡¡"NightShift" or => { "Hr22", "Hr23", "Night" };
¡¡¡¡¡¡¡¡"ConferenceDays" or => { "Day26", "Day27", "Day29", "Day30" };
¡¡¡¡¡¡¡¡"TimeSlices" or => { "Min01", "Min02", "Min03", "Min10_15"
¡¡¡¡¡¡¡¡"Min33", "Min34", "Min35" };
¡¡¡¡¡¡¡¡"Exception" not => "Hr12.Min15_20";
ÔÚǰÈý¸öÀý×ÓÖУ¬×ó±ßµÄ¸½Öµ¶ÔÓÚÓұߵÄORed½á¹û·Ç³£ÓÐЧ¡£Òò´ËÈç¹û»¨À¨ºÅÀïµÄÈκÎÀà±»¶¨ÒåÁË£¬ÄÇ×ó±ßµÄÄǸöÀà¾Í»á³ÉΪÒѶ¨ÒåµÄ¡£ÕâΪ¹æ¶¨Ò»¸ö³ÌÐòµÄʱ¼ä¼ä¸ôÌṩÁËÁé»îµÄ¿É¶ÁµÄ·½Ê½£¬¶ø²»ÔÙÐèÒªµ½´¦Ê¹Óá®|¡¯ ºÍ¡®.¡¯ÔËËã·û¡£
ÄãµÃ¶à¾ÃÒ»´Îµ÷ÓÃÄãµÄÈ«¾ÖcfengineÅäÖÃÄØ£¿ÓÐÈçϼ¸¼þÊÂÇéÄãµÃ¿¼ÂÇ£º
l ÄãÐèÒª¶àºÃµÄ¿ØÖÆ£¿Í¨³£Ã¿Ð¡Ê±ÔËÐÐÒ»´ÎcronÈÎÎñ¶ÔÓÚ´ó¶àÊýÈÎÎñÀ´ËµÒѾ×ã¹»ÁË£¬µ«Äã¿ÉÄÜÐèÒªÎªÒ»Ð©ÌØ±ðµÄÈÎÎñ×öÌØ±ðµÄ¸üºÃµÄ¿ØÖÆ¡£
l ÄãÊÇÒªÑéÖ¤Õû¸öµÄcfengineÅäÖÃÎļþ»¹ÊÇÖ»ÊÇÓÐÑ¡ÔñµÄ³Ðŵ£¿
cfengine ÓµÓÐÖÇÄܵÄËø²ßÂÔ(locking)ºÍ³¬³öʱ¼ä²ßÂÔ£¨timeout£©£¬ÕâЩ²ßÂÔ×ã¹»½«shellÃüÁî¹ÒÔØµ½Ö®Ç°µÄcron£¬ ´Ó¶ø²»»á²úÉú¸ôºÒ¡£
ÕâÒ»Õ½²ÊöÔõÑù´´½¨cfengineµÄÍøÂç·þÎñÀ´´¦ÀíÔ¶³ÌÎļþ·Ö²¼ÒÔ¼°Ô¶³ÌÖ´ÐÐcfengine£¬ ¶ø²»ÐèҪʹÄãµÄÖ÷»ú¿ÉÄÜÃæÁÙʹÓÃrshÐÒéµÄºÚ¿Í¹¥»÷¡£
ͨ¹ýÆô¶¯cf-serverd½ø³Ì£¬Äã¿ÉÒÔΪÖ÷»úÖ®¼ä´´½¨Í¨ÐÅÏß·£¬ÔÊÐíËüÃÇͨ¹ýÍøÂç½»»»Îļþ»òÕßÔÚÁíÒ»¸öϵͳÉÏÔ¶³ÌµØÖ´ÐÐcfengine¡£ CfengineÍøÂç·þÎñÊÇ»ùÓÚÒÔÏÂ×é¼þ´´½¨µÄ£º
Cf-agent ÒýÇæµÄÅäÖÃÓëÍøÂçµÄΨһÁªÏµ·½Ê½¾ÍÊÇͨ¹ýÔ¶³Ì¿½±´ÇëÇó¡£Ëü²»»áÒ²²»ÄÜÓ¦´ð
ºÎÀ´×ÔÍøÂçµÄ·ÃÎÊϵͳÇëÇó¡£ËüÖ»Äܹ»´Ó·þÎñÆ÷µÄ×é¼þÀ´ÇëÇó·ÃÎÊÎļþ¡£
Cf-serverd ÊÇÒ»¸ö¼È¿ÉÒÔ×÷ΪÎļþ·þÎñÆ÷Ò²¿ÉÒÔ×÷Ϊһ¸öÔ¶³ÌµÄcf-agentÖ´ÐÐÆ÷µÄºǫ́³Ì
Ðò£¨daemon£©¡£ Õâ¸öºǫ́³ÌÐò¿ÉÒÔÈÏÖ¤À´×ÔÍøÂçµÄÇëÇó²¢ÇÒ¸ù¾Ý·þÎñÆ÷µÄ¿ØÖÆ
Ì壨control body£©ºÍ°ü£¨bundles£©Öаüº¬µÄ·ÃÎʳÐŵ£¨access promises£©Ëù¶¨Òå
µÄ¹æÔòÀ´´¦ÀíÕâЩÇëÇó¡£
Cf-runagent ÕâÊÇÒ»¸ö¼òµ¥µÄ³õʼ»¯³ÌÐò£¬¿ÉÒÔ±»ÓÃÀ´ÔÚ¶à¸öÔ¶³ÌÖ÷»úÉÏÔËÐÐcf-agent¡£Ëü
²»Äܱ»ÓÃÀ´¸æËßcf-agent ×öʲô£¬ËüÖ»ÄÜÈÃÔ¶³ÌÖ÷»úÉϵÄcf-serverd¸ù¾ÝÏÖÓÐ
µÄÅäÖÃÀ´ÔËÐÐcf-agent¡£ ͨ¹ýÊÚȨ¸øÓû§À´Îª²¿·ÖÏÖÓеIJßÂÔÌṩһÖÖ»ùÓÚ½Ç
É«µÄ·ÃÎÊ¿ØÖÆ£¨RBAC£©¡£
ÓÐÁËÕâЩ×é¼þ£¬Äã¾ÍÓÐÁËËùÓÐÄãÐèÒªµÄ¶«Î÷¶ÔϵͳµÄ×ÊÔ´½øÐÐÓÐЧµØ·Ö²¼¡£
Õâ¸ö²¿·Ö½²ÊöÁËÔõÑù°Ñcf-serverd´´½¨³ÉÒ»¸öÔ¶³ÌµÄÎļþ·þÎñÆ÷£¬´Ó¶øÊ¹ÎļþÒÔÒ»ÖÖ°²È«¿É¿¿µÄ·½Ê½·Ö²¼µ½¿Í»§Ö÷»úÉÏ¡£
CfengineÓëÆäËüϵͳµÄÒ»¸öÖØÒªµÄ²»Í¬ÔÚÓÚÎļþ·Ö²¼µÄ·½Ê½¡£Cfengine ʹÓÃÁËÒ»ÖÖ¡®À¶¯¡¯£¨pull£©¶ø·Ç¡®Íƽø¡¯£¨push£©µÄÄ£ÐÍÀ´·Ö²¼ÍøÂçÎļþ¡£¶ø´ó¶àÊýµÄϵͳ£¬¿ÉÄÜͨ¹ýÇ¿ÆÈ·þÎñÆ÷ÉϵÄÒ»¸ö¾µÏñÎļþ·Ö²¼µ½ËùÓеĿͻ§»úÉÏ¡£ÕâÖÖ·½Ê½Ôںڿ͹¥»÷µÄʱºò³£³£·¢Éú––½ÓÊÕÕßȷʵ³£³£±»ÒªÇó´ò¿ª¸÷Öֶ˿ڲ¢ÇÒ½ÓÊÜËûÃÇËù½ÓÊÕµ½µÄËùÓÐÐÅÏ¢¡£ÔÔòÉϽ²£¬Cfengine ÊDz»»áÖ§³ÖÕâÖÖ¼¼ÊõµÄ¡£
ʹÓá®Íƶ¯¡¯µÄ·½·¨£¬Îļþ»áÔÚ·Ö²¼ÕßÏ£ÍûËü¸Ä±äµÄʱºò¸Ä±ä£¬¶ø¿Í»§È´Ã»ÓÐÑ¡ÔñµÄÓàµØ£¬Ö»ÄܽÓÊÜÕâÑùµÄºó¹û¡£Cfengine£¬´ÓÁíÒ»¸ö·½ÃæÀ´Ëµ£¬Í¨¹ý×ÔÔ¸Ð×÷£¨voluntary cooperation£©µÄ·½Ê½À´¹¤×÷¡£Ö÷»úÒ²±»ÔÊÐí±£³ÖËüÃǵķÀ»¤¿ØÖÆ£¬´Ó¶ø°´ÕÕËûÃÇ×Ô¼ºµÄÒâÔ¸À´±£»¤×Ô¼ºÃâÊܺڿ͹¥»÷ºÍ¡®Íƶ¯¡¯¡£
ÊÂʵÉÏ£¬(ÔÚÉè¼ÆÉÏ) cfengine²»ÄܰÑ×Ô¼ºµÄÒâ־ǿ¼Ó¸øÆäËûÖ÷»ú£¬Ëü×ÔÉíÒ²²»»á±»Ç¿ÆÈ¡£ ΪÁËÄÜÒÔ×îºÃµÄÐźŷֲ¼µ½ËùÓлúÆ÷ÉÏ£¬²¢ÇÒÈç¹ûÕâЩ»úÆ÷Ô¸Òâ²ÅÏòËüÃÇËѼ¯Îļþ¡£»»¾ä»°Ëµ£¬cfengineÄ£ÄâÁËÒ»ÖÖ¡®Íƽø¡¯Ä£ÐÍ£¬Ëüͨ¹ýÃñÒâµ÷²éÁ˽âÿ¸ö¿Í»§ÒÔ¼°ÆäÕýÔÚÔËÐеı¾µØµÄcfengineÅäÖýű¾£¬´Ó¶øÈÃÖ÷»úÓлú»áÄܹ»´ÓÔ¶³ÌµÄ·þÎñÆ÷¡®À¶¯¡¯ÈκÎÒѸüеÄÎļþ£¬µ«ÈÔÈ»Óɿͻ§»úÀ´¾ö¶¨ÊÇ·ñÒª½øÐиüС£
»¹ÓУ¬¶ÔÕÕһЩ³ÌÐò£¬Èçrdist£¬Ëü±»ÓÃÀ´·Ö²¼Îļþµ½Ðí¶àÖ÷»úÉÏ£¬¶øcfengine²»ÐèҪʹÓá®.rhosts¡¯Îļþ»òÕß¡®/etc/hosts.equiv¡¯ÎļþÀ´½øÐÐÈκεÄroot·ÃÎÊϵͳ¡£ÒÔroot Éí·ÝÔËÐкǫ́³ÌÐòÒѾ×ã¹»ÁË¡£µ«Äã²»ÄÜͨ¹ý°ÑËü¼Óµ½ÏµÍ³µÄ¡®/etc/inetd.conf¡¯ÎļþÖÐÀ´ÔËÐÐËü¡£ÕâÖÖ¶Ôºǫ́³ÌÐò¹¦ÄܵÄÏÞÖÆÄܹ»±£»¤ÄãµÄϵͳ£¬±ÜÃâʹÓÃrsh×÷ΪrootÔËÐÐͨ³£µÄÃüÁî¡£
ÒªÏëÔ¶³ÌµØ·ÃÎÊ·þÎñÆ÷ÉϵÄÎļþ£¬Äã¿ÉÒÔÔÚÒ»¸ö¡®files¡¯³ÐŵÖÐʹÓÃcopy_from attributeµÄÊôÐÔ£º
bundle agent example
{
files:
"/var/cfengine/inputs"
perms => my_p("600"),
copy_from => rcp("$(master_location)","localhost"),
depth_search => recurse("inf"),
action => immediate;
}
# ¿âÄ£°å
body copy_from rcp(file,server)
{
servers => { "$(server)", "failover.example.org"};
source => "$(file)";
}
¼ÙÉècf-serverdºǫ́½ø³ÌÕýÔËÐÐÔÚserver-hostÉÏ£¬cf-agent½«»áÓëÕâ¸öºǫ́½ø³ÌÁªÏµ²¢ÊÔͼ»ñµÃÎļþµÄÐÅÏ¢¡£ÔÚÕâ¸ö¹ý³ÌÖУ¬cfengine ÑéÖ¤ÁËÕâÁ½Ì¨Öð¼¶ÉϵÄϵͳʱÖÓÊÇͬ²½µÄ¡£Èç¹ûûÓÐͬ²½£¬Ëü²»»áÔÊÐíÔ¶³Ì¿½±´³ý·ÇÔÚ·þÎñÆ÷µÄ¿ØÖÆÌ壨control body£©ÖÐ denybadclocks ÊÇ false¡£
Èç¹ûcf-agent ¾ö¶¨Ò»¸öÎļþÐèÒª´ÓÔ¶³Ì·þÎñÆ÷Éϱ»¸üУ¬Ëü¾Í¿ªÊ¼ÔÚÒ»¸öÏàͬµÄÎļþϵͳÉÏ¿½±´Ô¶³ÌµÄÎļþµ½Ò»¸öеÄÎļþÀ´×÷ΪĿµÄÎļþ¡£Õâ¸öÎļþµÄºó׺ÃûÊÇ¡®.cfnew¡¯¡£
Ö»Óе±Îļþ±»³É¹¦µØËѼ¯ÁË£¬cf-agent ²Å»á¿½±´¾ÉµÄÎļþ£¬(¼û²Î¿¼ÊÖ²áµÄ´æ´¢(repository))£¬²¢ÇÒ¸øÐÂÎļþ¸ÄÃû×Ö¡£Éè¼ÆÕâÖÖÐÐΪÊÇΪÁ˱ÜÃâÍøÂçÁ¬½ÓÖеľºÕù״̬(race-condition£©£¬È·ÊµÈκβÙ×÷¶¼»áÕ¼ÓÃʱ¼ä¡£Èç¹ûÎļþÄܹ»ºÜ¼òµ¥µØ±»Ö±½Ó¿½±´µ½ËüÏëÒªµÄеÄÄ¿µÄµØ£¬¶øÒ»¸öÍøÂçÁ¬½ÓµÄ´íÎó¿ÉÄÜ»áÖжϴ«Êä´Ó¶øÖ»ÁôÏÂÒ»¸öÖжÏÁ˵ÄÎļþÔÚÄǶù¡£Cf-agent ¸øÍøÂçÁ¬½ÓÉèÖÃÁ˼¸ÃëÖÓµÄÖÐֹʱ¼äÀ´±ÜÃâÐü¹ÒµÄ½ø³Ì¡£
ͨ³£ºǫ́½ø³ÌÐÝÃߣ¬µÈ´ýÍøÂçÁ¬½Ó¡£ÕâÖÖÁ¬½Ó¿ÉÄÜ»áͨ¹ýÁíһ̨Ö÷»úÉϵÄÒ»¸öÔËÐеÄcf-agent³ÌÐòÇëÇóÔ¶³ÌÎļþ½øÐгõʼ»¯£¬»òÕßͨ¹ýcf-runagent¼òµ¥µØÒªÇóÖ÷»úºǫ́ÔËÐеĽø³ÌÀ´ÔËÐб¾µØµÄcf-agent »òcf-execd³ÌÐò½øÐгõʼ»¯¡£
ż¶ûÄãÏëÒªÁ¢¿ÌÔËÐÐcf-agentÔÚÒ»¸ö»ò¶à¸öÖ÷»úÉϾ¡¿ìµØÊµÏÖÅäÖõĸı䡣Èç¹ûͨ¹ýÊÖ¶¯µÇ¼ÿһ̨Ö÷»úÀ´×öÕâ¼þÊÂÇé»á·Ç³£²»·½±ã¡£
Èç¹ûÄã°²ÅŵÄʱ¼ä¼ä¸ô×ã¹»µÄ»°£¬Õâ¾ÍûÓбØÒªÁË£¬ÒòΪcfengine½«ÔÚÄãÊÔͼµÇ¼µÄʱºòÒѾÔËÐÐÁË– ÕâÖÖ²¢Ðз½Ê½±íÃ÷ÔÚÊý·ÖÖÓÖ®ÄÚÕû¸öÍøÂçÄܹ»±»¸Ä±ä¶øÃ»ÓÐÓÉÓڵȴýÖÐÐÄ¿ØÖƶø²úÉúÑÓ³Ù¡£
µ«Ò²ÐíÄãÏëÒª·¢ËÍÒ»Ð©ÌØ±ðµÄÐźţ¬ÀýÈ磬ÔËÐвßÂÔº¬ÓÐÒ»¸öÖ»Äܱ»Ò»Ð©»úÆ÷¼¤»îµÄÌØÊâÀà¡£ÄÇôһ¸ö¸üºÃµÄ·½Ê½¾ÍÊÇÔËÐÐÒ»¸ö¼òµ¥µÄÃüÁîÀ´ÓëÔ¶³ÌÖ÷»úÁªÏµ²¢ÇÒÔËÐоßÓлùÓÚ½ÇÉ«·ÃÎÊ¿ØÖÆ£¨RBAC£©µÄcf-agent£¬ÔÚÄã×Ô¼ºµÄÆÁÄ»ÉÏÄܹ»Á¢¼´ÏÔʾÊä³öµÄ½á¹û£º
host$ cf-runagent remote-host -v
output....
l ΪÁËÖØÐÂÅäÖÃÔ¶³ÌµÄÖ÷»úÄã²»ÐèÒªµÇ¼Զ³ÌµÄÖ÷»ú¡£
l Óû§¶ø·Çroot¿ÉÒÔÔËÐÐcf-agent À´½â¾öϵͳµÄÈκÎÎÊÌ⣬ËûÃÇÓÐȨÏÞ·ÃÎÊһЩ¸öÌåºÍÀà¡£
ÈκδËÀàϵͳµÄÒ»¸öDZÔÚȱÏÝÊÇһЩ¶ñÒâµÄÓû§Äܹ»ÔÚÔ¶³ÌÖ÷»úÉÏÔËÐÐcf-agent¡£ÊÂʵÉÏ·ÇrootÓû§Äܹ»ÔËÐÐcf-agent±¾Éí²¢²»³ÉÎÊÌ⣬±Ï¾¹ËûÃÇÄܹ»×öµÄ´ó²¿·ÖµÄ¶ñÒâʼþ¶¼Äܹ»±»ÏµÍ³ÅäÖüì²â³öÀ´²¢ÇÒÐÞ¸´¡£Ã»ÓÐÈËÄܸæËßcf-agentʹÓÃcfrun³ÌÐòÄܹ»×öʲô£¬ËüÖ»Äܹ»ÔËÐÐÒ»¸öÏÖÓеÄÅäÖᣵ«Ò»¸ö¸üÑÏÖØµÄÎÊÌâÊÇÓÐЩ¶ñÒâµÄÓû§¿ÉÄÜÊÔͼ¶à´ÎÔËÐÐcf-agent£¨ËùνµÄ¡®Denial of Service¡¯¹¥»÷£©£¬ÒÔÖÂϵͳÓÉÓÚÁ¬ÐøÔËÐÐcf-agent¶ø¸ºÔعýÖØ¡£ÎªÁ˱ÜÃâÕâÖÖÇé¿ö£¬·þÎñÆ÷ʹÓÃͬÑùµÄifelapsedËøÀ´¸¨Öú·ÃÎÊ¿ØÖÆ¡£
ΪÁËÄܹ»Á¬½Óµ½cfengine·þÎñÆ÷£¬ÄãÐèÒª
Ò»¶Ô¹«Ô¿Ë½Ô¿
ÏëÒª´´½¨Ò»¶ÔÃÜÔ¿£¬ÔËÐÐ cf-key
Ò»¸öIPv4»òÕßIPv6µØÖ·
Äã±ØÐëÔÚÏß²¢ÓµÓÐÒ»¸öÅäÖúõÄÍøÂçµØÖ·¡£
Ò»¸ö¿Í»§¶Ë³ÌÐò
Cf-agent ºÍ cf-runagent ¶¼ÊÇÄÜÁ¬½Óµ½·þÎñÆ÷µÄ¿Í»§¶Ë¡£
ÔÊÐíÁ¬½Óµ½·þÎñÆ÷£¬²¢ÇÒ
·þÎñÆ÷¿ØÖÆÌ壨control body£©±ØÐëÔÊÐí¶ÔÄã¼ÆËã»úºÍ»ùÓÚÃû×Ö»òÕßipµØÖ·µÄ¹«Ô¿µÄ·ÃÎÊ£¬Í¨¹ýÔÚÒ»¸öÁбíÖÐÏÔʾ³öÀ´£¨ÈçÏ£©¡£
ÄãµÄ¹«Ô¿±ØÐë±»·þÎñÆ÷ÐÅÈΣ¬²¢ÇÒÄã±ØÐëÐÅÈηþÎñÆ÷µÄ¹«Ô¿
ͨ¹ýÏ໥ÐÅÈα˴˵ÄÃÜÔ¿£¬¿Í»§¶ËÓë·þÎñÆ÷ͳһʹÓøÃÃÜÔ¿×÷Ϊ¼ÆËã»úµÄÒ»¸ö×ã¹»µÄ±êʾ·û¡£
ÔÊÐí·ÃÎÊһЩ¶«Î÷
ÄãµÄÖ÷»úÃû»òÕßIPµØÖ·±ØÐëÔÚÒ»¸öÄãÏëÒª·ÃÎʵÄÎļþËù²úÉúµÄ·þÎñÆ÷°ü(server bundle)µÄ·ÃÎʳÐŵ£¨access promise£© Öб»Ìá¼°¡£
Èç¹ûÒÔÉϵÄËùÓбê×¼¶¼´ïµ½ÁË£¬Á¬½Ó½«»á±»½¨Á¢²¢ÇÒÊý¾Ý»áÔÚ¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼ä±»´«Êä¡£¸ù¾ÝcfengineµÄÐÒ飬¿Í»§¶ËÖ»ÄÜ·¢Ëͼò¶ÌµÄÇëÇó¡£·þÎñÆ÷Äܹ»ÒÔ¶àÖÖÐÎʽ·µ»ØÊý¾Ý£¬Í¨³£ÊÇÎļþÐÎʽ£¬µ«ÓÐʱ»áÊÇÖÕ¶ËÊä³öÐÎʽ¡£
µ±´´½¨cf-serverd£¬ Äã¿ÉÄܻῴµ½´íÎóÐÅÏ¢¡¯Unspecified server refusal¡¯¡£
Õâ±íÃ÷ cf-serverd ²»ÄÜ»òÕß²»Ô¸ÒâÈÏÖ¤À´×ÔÄãµÄ¿Í»§¶Ë»úÆ÷µÄÁ¬½Ó¡£Õâ¸öÐÅÏ¢ÊÇÒ»°ãÐÔ´æÔڵģºËü¹ÊÒâ²»ÊÇרÃŵģ¬Òò¶øÈκÎÈËÏëÒª¹¥»÷»òÕßÀûÓÃÕâ¸ö·þÎñ½«²»»áµÃµ½¿ÉÄܶÔËûÃÇÓÐÓõÄÐÅÏ¢¡£Õâ¶ùÓÐÒ»¸ö¼òµ¥µÄ¼ì²éÁбíÀ´½â¾öÕâ¸öÎÊÌ⣺
1. È·±£ÔÚ±»¿Í»§¶ËºÍ·þÎñÆ÷¶ÁÈ¡µÄÅäÖÃÎļþÖÐÉèÖÃÓòÃû±äÁ¿£»»òÕßʹÓÃskipidentify ºÍ skipverify À´¼õÈõDNSµÄÈÏÖ¤¡£
2. È·±£ÄãÔÚ·þÎñÆ÷ʵÌå(server body)ÖÐÊÚȨ·ÃÎÊÄãµÄ¿Í»§¶Ë
body server control
{
allowconnects => { "127.0.0.1" , "::1" ...etc };
allowallconnects => { "127.0.0.1" , "::1" ...etc };
trustkeysfrom => { "127.0.0.1" , "::1" ...etc };
}
3. È·±£ÄãÒѾʹÓÃÁËcf-keyΪÖ÷»ú´´½¨ÁËÓÐЧµÄÃÜÔ¿¡£
4. Èç¹ûÄãÔÚʹÓð²È«¿½±´£¬È·±£Äã´´½¨ÁËÒ»¸öÃÜÔ¿Îļþ²¢ÇÒÄãÒѾÔÚËùÓвÎÓëµÄÖ÷»úȺ×éÖзֲ¼²¢°²×°ÁËÕâ¸öÃÜÔ¿Îļþ¡£
Ò»Ö±Òª¼ÇµÃÄã¼È¿ÉÒÔÒÔÈßÓàģʽ(verbose mode)ÔËÐÐcfengineÒ²¿ÉÒÔÒÔµ÷ÊÔģʽ(debugging mode)ÔËÐÐcfengineÀ´¿´ÈÏÖ¤¹ý³ÌÊÇÔõÑù·¢ÉúµÄ£º
Cf-agent -v
Cf-serverd –v
²»¹ÜÊÇʲô´íÎóÊôÐÔ£¬cf-agent¶¼»á±¨¸æ±»¾Ü¾øµÄ·ÃÎÊ£¬´Ó¶ø±ÜÃâй¶ÐÅÏ¢£¬¸øºÚ¿Í¿É³ËÖ®»ú¡£ÏëÒªÕÒµ½±»¾Ü¾øµÄÕæÕýÔÒò£¬Ê¹ÓÃÈßÓàģʽ¡®-v¡¯»òÕßµ÷ÊÔģʽ¡®-d2¡¯¡£
CfengineʹÓõÄÃÜÔ¿½»»»Ä£Ê½ÊÇ»ùÓÚOpenSSHµÄÃÜԿģʽ¡£ËüÊÇÒ»¸öµã¶Ôµã£¨peer to peer£©µÄ½»»»Ä£Ê½£¬¶ø²»ÊÇÒ»¸öÖÐÐÄ»¯µÄÈÏÖ¤ÊÚȨģʽ¡£ÕâÒâζ×ÅËüûÓпÉÀ©Õ¹ÐԵķ½ÃæµÄÆ¿¾±£¨ÖÁÉÙÉè¼ÆÉϽ²£¬Äã¿ÉÒÔ½éÉÜÄã×Ô¼ºµÄÏë·¨Èç¹ûÄãÏëÒªÒ»¸ö¹ý¶ÈÖÐÐÄ»¯µÄ½á¹¹£©¡£
ÃÜÔ¿·Ö²¼µÄÎÊÌâÊÇÿһ¸ö¹«Ô¿½á¹¹µÄÄÑÌâ¡£Cfengine ÄÜ×Ô¶¯ÊµÐн»»»ÃÜÔ¿£¬²¢ÇÒÄãËùÒª×öµÄÖ»ÊǾö¶¨¸ÃÏàÐÅÄǸöÃÜÔ¿¡£
µ±¹«Ô¿±»Ìṩ¸øÒ»¸ö·þÎñÆ÷£¬ËûÃÇ¿ÉÄÜ»á×Ô¶¯±»½ÓÊÜΪ¿ÉÒÔÐÅÈεģ¬ÒòΪûÓÐÈË¿ÉÒÔ¾ö¶¨ËüÃÇ¡£Õâ»áµ¼Ö¹ØÓÚµÚÒ»¸öÌá½»ÃÜÔ¿ÉêÃ÷µÄ¾ºÕù¡£
¼´Ê¹ÓÐDNSÀ´¼ìÑéÏà¹ØÃû×Ö»òÕßIPµØÖ·µÄÕýÈ·ÐÔ£¨¹Ø±Õskiperify£©£¬ËüÈÔÈ»¿ÉÄÜÌá½»¸ø·þÎñÆ÷Ò»¸ö´íÎóµÄÃÜÔ¿¡£
·þÎñÆ÷cf-serverd ĬÈÏÄܹ»×èÖ¹½ÓÊÜδ֪µÄÃÜÔ¿¡£ÎªÁËÄܹ»½ÓÊÜÒ»¸öеÄÃÜÔ¿£¬¼Ù¶¨µÄ¿Í»§¶ËµÄIPµØÖ·±ØÐë±»ÁÐÔÚtrustkeysfromÖС£Ò»µ©Ò»¸öÃÜÔ¿±»½ÓÊÜÁË£¬Ëü½«ÓÀÔ¶²»»á±»Ò»¸öеÄÃÜÔ¿ËùÌæ»»£¬Òò´Ë²»ÔÙÐèÒªÌṩ¸ü¶àµÄÐÅÈΡ£
Ò»µ©ÄãÒѾ°²ÅÅÁ¬½Óµ½·þÎñÆ÷£¬Äã±ØÐë¾ö¶¨ÄÄЩÖ÷»ú½«Òª·ÃÎÊÄÄЩÎļþ¡£Õ⽫ÓÉ·ÃÎʹæÔò£¨access rules£©À´¾ö¶¨¡£
bundle server access_rules()
{
access:
"/path/file"
admit => { "127.0.0.1", "127.0.0.2", "127.0.0.3" },
deny => { "192.*" };
}
ÔÚ¿Í»§¶Ë£¬ÀýÈ磬cf-runagent ºÍ cf-agent, ÓÐÈý¸öÎÊÌâÐèÒª¿¼ÂÇ£º
1. Ñ¡ÔñÁ¬½ÓÄĸö·þÎñÆ÷
2. ÐÅÈÎÈκÎÏÈǰδ֪·þÎñÆ÷µÄÉí·Ý£¬ÀýÈ磬ÐÅÈηþÎñÆ÷µÄ¹«Ô¿¾ÍÊǸ÷þÎñÆ÷µÄ¶ø²»ÊDZðÈ˵Ä(Õâµã¶ÔÓÚ·þÎñÆ÷Ò²ÊÇÒ»Ñù)¡£
3. Ñ¡ÔñÊý¾Ý´«ÊäÊÇ·ñÐèÒª¼ÓÃÜ£¨´øÃÜÂ룩¡£
ÒòΪÓÐÁ½¸ö¿Í»§¶ËÁ¬½Óµ½cf-serverd(cf-agent ºÍ cf-runagent)£¬ËùÒÔ¿Í»§¶Ë»¹ÊÇÓÐÁ½ÖÖ·½·¨À´¹ÜÀí·þÎñÆ÷ÃÜÔ¿µÄÐÅÈΡ£Ò»¸öÊÇ×Ô¶¯Ñ¡Ïî(automated option)£¬ÔÚÒ»¸öcopy_from ÖÐÉèÖÃtrustkey Ñ¡ÏÀýÈ磬
body copy_from example
{
# .. other settings ..
trustkey => "true";
}
ÁíÒ»ÖÖ·½·¨ÊÇÒÔ½»»¥µÄģʽÔËÐÐcf-runagent¡£µ±ÄãÔËÐÐcf-runagentʱ£¬Î´ÖªµÄ·þÎñÆ÷ÃÜÔ¿»á»¥¶¯µØÌṩ¸øÄ㣨ÀýÈçͨ¹ýssh£©£¬ÈÃÄãÄܹ»ÊÖ¶¯µØ½ÓÊÜ»òÕ߾ܾø£º
WARNING - You do not have a public key from host ubik.iu.hio.no =
128.39.74.25
Do you want to accept one on trust? (yes/no)
-->
Ò»µ©¹«Ô¿ÒѾ±»´Ó¿Í»§¶Ëµ½·þÎñÆ÷ºÍ´Ó·þÎñÆ÷µ½¿Í»§¶Ë½»»»£¬¸ù¾Ý¹«Ô¿ÈÏÖ¤»úÖÆ£¬ÐÅÈεÄÎÊÌâ¾ÍÒѾ½â¾öÁË¡£ÄãÖ»ÐèÒªµ£ÐÄÄÇЩ´ÓÒ»¶Ëµ½ÁíÒ»¶Ë´Óδ¼û¹ýµÄÁ¬½ÓÊÇ·ñÖµµÃÐÅÈΡ£
ͨ³£Äã»áÓÐÒ»¸öÖÐÐĵķþÎñÆ÷ºÍÐí¶à¿Í»§¶ËÎÀÐÇ¡£¶ø´«ÊäËùÓÐÃÜÔ¿µÄµÄ×îºÃ·½Ê½ÊÇÔÚ·þÎñÆ÷¶ËºÍ¿Í»§¶ËÉÏÉèÖÃtrustkey±êʶ£¬²¢ÓëÄãÖªµÀcf-agent ½«ÔËÐеÄʱ¼ä±£³ÖÒ»Ö£¬´Ó¶øÆÛÆÕ߾Ͳ»¿ÉÄܽøÐиÉÉæ¡£
ÕâÊÇÒ»¸öÒ»´ÎÐÔµÄÈÎÎñ£¬ºÚ¿ÍÄܹ»Î±×°³ÉÃÜÔ¿´«ÊäÕߵļ¸ÂʺÜС¡£ËüÐèÒª¼¼ÇÉÒÔ¼°¹ØÓÚ½»»»¹ý³ÌµÄÄÚ²¿ÐÅÏ¢£¬¶øÕâÒ×ÓÚ°µÊ¾ÐÅÈÎÄ£ÐÍÒÑ¾ÆÆÁÑ¡£
ÁíÒ»¸ö·½·¨ÊÇËùÓеÄÔÚÒ»×éµÄÖ÷»ú¶¼´ÓÖÐÐÄ·þÎñÆ÷ÔËÐÐcf-runagent ²¢ÇÒÖð¸öµØÊÖ¶¯½ÓÊÜÃÜÔ¿£¬¾¡¹ÜÕâÖÖ·½·¨Ëù»ñºÜÉÙ¡£
ÐÅÈÎÒ»¸öÖ÷»úÀ´½øÐÐÃÜÔ¿½»»»ÊDz»¿É±ÜÃâµÄ¡£Ã»Óиü´ÏÃ÷µÄ·½·¨À´±ÜÃâËü¡£¼´Ê¹Ê¹ÓôÅÅÌÀ´´«ÊäÎļþ£¬²¢¼ì²éÄãËùÓµÓеÄÿ̨¼ÆËã»úµÄÐòÁкţ¬Ö÷»úÒ²±ØÐëµÃÐÅÈÎÄã¸øËüµÄÐÅÏ¢¡£Õâ¶¼ÊÇ»ùÓÚ¼ÙÉè¡£Ä㼸ºõ²»Äܹ»Ê¹µÃÃÜÔ¿Ôì¼Ù»òÕß±»¹¥»÷£¬µ«ÄãÓÖ²»ÄÜʹËü¾ø¶Ô²»»á·¢Éú¡£°²È«ÊǹØÓÚÈçºÎºÏÀíµÄ¹ÜÀí·çÏճ̶ȣ¬¶ø²»ÊÇħÊõ¡£
ËùÓеݲȫ¶¼ÊÇ»ùÓÚij¸öʱ¿Ì¼°Ê±ÐÅÈÎij¸öµã¡£ÃÜÂëѧµÄÃÜÔ¿·½·¨ÖªÊ¶È¥³ýÁË·´¸´×öÐÅÈξñÔñµÄÐèÒª¡£ÔÚµÚÒ»´Î½»»»ºó£¬ÐÅÈβ»ÔÙÐèÒª£¬ÒòΪËûÃǵÄÃÜÔ¿ÔÊÐíÉí·Ý±»Êµ¼ÊÑéÖ¤¡£
¼´Ê¹Ä㿪·ÅÐÅÈεÄÑ¡ÏÄã²¢²»ÊÇäĿµØÐÅÈÎÄãÖªµÀµÄÖ÷»ú¡£Î¨Ò»µÄDZÔڵIJ»°²È«ÐÔÔÚÓÚÄÇЩÄãËù²»ÖªµÀµÄеÄÃÜÔ¿¡£Èç¹ûÄãÔÚÐÅÈιæÔòÖÐʹÓÃͨÅä·û»òÕßIPǰ׺£¬ÄÇÆäËûµÄÖ÷»ú¿ÉÄܾͻáÓÐһЩÆÛÆÐÐΪ£¬ÒòΪÄã¸øËûÃÇÁôÁËЩ³¨¿ªµÄ©¶´¡£Õâ¾ÍÊÇÎªÊ²Ã´ÍÆ¼ö£¬ÔÚÿ´Î´«ÊäÍêÃÜÔ¿ºó£¬¿Éͨ¹ý×¢ÊÍÐÅÈÎÑ¡Ïϵͳ»Ø¹éµ½Áã״̬¡£
ÎÒÃÇ¿ÉÒÔͨ¹ýһЩÓпÉÄܵ«·ÑÁ¦µÄ·½Ê½½«ÃÜԿͨ¹ý²»Í¬µÄƵµÀÐźŽøÐд«Ê䣬ͨ¹ý¿½±´¡®/var/cfengine/ppkeys/localhost.pub¡¯µ½¡®/var/cfengine/ppkeys/user-aaa.bbb.ccc.mmm¡¯(¼ÙÉèʹÓÃIPv4) ÔÚÁíһ̨Ö÷»úÉÏ¡£ÀýÈ磬
localhost.pub -> root-128.39.74.71.pub
Õâ¿ÉÄÜÊÇÒ»ÖֱȽÏÓÞ´ÀµÄ·½·¨ÔÚÄã×Ô¼º¿ØÖƵÄÁÚ½üÖ÷»úÖ®¼ä´«ÊäÃÜÔ¿£¬µ«Èç¹û´«Êäµ½Ô¶¾àÀ룬Զ³ÌµÄÖ÷»úÉÏ£¬Ëü¿ÉÄÜÊÇÒ»ÖÖ¹ÜÀíÐÅÈεļòµ¥·½·¨¡£
Cfengine ͨ³£ÒÔ¡®root¡¯Óû§ÔËÐУ¨³ýÔÚWindowsϵͳÉÏͨ³£Ã»ÓÐrootÓû§£©£¬ÀýÈ磬 Ò»¸ö¸ß¼¶È¨Ï޵ĹÜÀíÔ±¡£Èç¹ûÆäËûÓû§Ò²±»ÊÚȨ¿ÉÒÔ·ÃÎÊÕâ¸öϵͳ£¬ËûÃDZØÐëÒ²Éú³ÉÒ»¸öÃÜÔ¿²¢ÇÒ¾¹ýÏàͬµÄ¹ý³Ì¡£³ý´ËÖ®Í⣬Óû§»¹±ØÐë±»¼Óµ½·þÎñÆ÷µÄÅäÖÃÎļþÖС£
CfengineΪ´«Êä¹ý³Ì±£³ÖÎļþÄÚÈݵÄÒþ˽ÐÔÌṩÁ˼ÓÃÜ¡£Ëü¼ÙÉèÓû§Äܹ»Ã÷ÖǵØÊ¹Óá£Í¨¹ý¼ÓÃÜ´«ÊäµÄ¹«ÓÃÎļþ£¬¾Í²»Äܱ»ÇÔÈ¡Èκζ«Î÷ÁË–¹ý¶ÈʹÓüÓÃÜÖ»»áÔì³ÉÈ«Çò±äů£¬ºÄ·Ñ²»±ØÒªµÄCPU´¦Àíʱ¼ä¶ø²»ÄÜÌṩÈκΰ²È«¡£
ÅäÖùÜÀíÖмÓÃܵÄÖ÷Òª×÷ÓþÍÊÇÈÏÖ¤¡£Cfengine×ÜÊÇʹÓüÓÃÜÀ´½øÐÐÈÏÖ¤£¬Òò¶ø¼ÓÃÜÉèÖò»»áÓ°ÏìÈÏÖ¤°²È«¡£
Cfengine ¾ßÓÐÒ»¸ö·ÇͬѰ³£µÄÄÜÁ¦¾ÍÊÇËüÄܰÑ֪ʶ¹ÜÀíͳһµ½×Ô¶¯»¯¹ý³ÌÖ®ÖУ¬²¢½«ËüµÄÅäÖü¼Êõ×÷Ϊһ¸ö¡®ÓïÒåÉϵġ¯ÎļþÒýÇæ¡£
֪ʶ¹ÜÀíÊǶÔÎÒÃÇʱ¼äµÄÌôÕ½¡£×éÖ¯»ú¹¹ÀË·ÑÁËÄÑÒÔÏëÏñµÄ´óÁ¿µÄ¾«Á¦À´ÖØÐÂѧϰ¾ÉµÄ¿Î³ÌÒòΪÕâЩ¿Î³ÌûÓб»×ö³ÉÎļþÁô¸øºóÒ»´ú¡£ÏÖÔÚÄã¿ÉÒÔͨ¹ýһЩ¼òµ¥µÄ¹æÔòÀ´»º½âÕâ¸öÎÊÌâ²¢ÇÒÉõÖÁÄܽ¨Á¢³ÉÊìµÄÎļþË÷ÒýÊý¾Ý¿â¡£
ÕâЩÄêÀ´£¬ÅäÖùÜÀíϵͳµÄѧϰÇúÏßÒѾ³ÉΪÁ˾³£ÅúÆÀ¹ÛĦµÄ¶¯Á¦¡£Óû§±»ÆÚÍûÄܹ»ÒÔÒ»¸ö½Ïϸ½ÚµÄˮƽÀ´Ãæ¶ÔÐÅÏ¢µÄ¸´ÔÓÐÔ£¬»òÕßÄܹ»·ÅÆúÍêºÃͳһ¿ØÖƵÄÏë·¨¡£Õâµ¼ÖµÄÐÅÏ¢¹ýÔØ»òÕß¹ýÓÚ¼òµ¥»¯¡£Òò´ËÕâÖÖ´¦ÀíÐÅÏ¢¸´ÔÓÐÔµÄÄÜÁ¦³ÉΪÁËIT¹ÜÀíµÄ»ù´¡¡£
Cfengine ΪÅäÖøöÒýÈëÁ˳ÐŵģÐÍ£¬ÊÇΪÁËʹÕâ¸öѧϰÇúÏ߸üƽ̹¡£ÕâÄܹ»¼ò»¯Ê¹ÓõĹý³Ì£¬ÒòΪÐí¶àÐèҪ˼¿¼µÄ¹¤×÷ÒѾÍê³É²¢ÇÒ±»·â×°³ÉÁËÄ£ÐÍ¡£ËüµÄÒ»¸öÌØÊâÊôÐÔÊÇËü¼ÈÊÇÒ»¸öϵͳÐÐΪµÄÄ£ÐÍÒ²ÊÇÒ»¸ö֪ʶչÏÖµÄÄ£ÐÍ£¨ÕâÕýÊÇÉùÃ÷ÓïÑÔËùѰÇóµÄ£©¡£¸üÌØ±ðµÄÊÇ£¬Ëü°ÑÒ»¸öISOµÄ±ê×¼×Ó¼¯ºÏ²¢³ÉÁË¡®»°ÌâͼÐΡ¯£¨Topic Maps£©£¬ÕâÊÇÒ»¸öÓÃÓÚÐÅÏ¢×ÊÔ´µÄÓïÒåË÷ÒýµÄ¿ª·Å¼¼Êõ¡£Í¨¹ý°ÑÕâÁ½¸ö¼¼ÊõÈÚºÏÔÚÒ»Æð£¨ÕâÁ½¸ö¼¼ÊõÊǸ߶ȼæÈݵģ©£¬×îÖÕ£¬ÎÒÃÇÄܹ»½«Ç°¶Ë׼ȷÎÞÎóµØÎǺÏÔÚÒ»Æð²¢¿ÉÒÔä¯ÀÀϵͳÐÅÏ¢¡£
֪ʶ¹ÜÀí±¾Éí¾ÍÊÇÒ»¸öÑо¿ÁìÓò£¬ËüÉæ¼°ÁËÈËÓë¿Æ¼¼´óÁ¿µÄÏà¹ØÎÊÌâ¡£´ó²¿·ÖÈ˶¼»áÈÏ¿É֪ʶÊÇÊÂʵºÍ¹ØÏµµÄ×éºÏ£¬Òò´ËΪÁ˺ÏÀíµØÚ¹ÊÍ֪ʶ£¬¼ÈÐèÒªÇåÎúµÄ¶¨Ò壬ÓÖÐèÒªÓïÒåÄÚÈÝ£»µ«ÊÇÎÒÃÇÔõÑù²Å²»»áÄ£ÀâÁ½¿ÉµØ¶¨ÒåÔÐÅÏ¢£¿
֪ʶÓëÅäÖÃÓкܶàµÄ¹²Í¬Ö®´¦£ºµ½µ×ʲôÊÇ֪ʶ¶ø²»ÊÇÎÒÃÇ˼ÏëÖеÄÒ»ÖÖÀíÄîÅäÖ㬻òÕßÔÚһЩ±íÏÖý½éÉÏ£¨ÂÛÎÄ£¬¹èµÈ£©¡£ËüÊÇÒ»ÖÖ±»±àÂë¹ýµÄÐÎʽ£¬Í¨³£¸üÇãÏòÓÚÒ»ÖÖÎÒÃÇÄܹ»ÓëÆäËûÈË´ï³ÉÒ»ÖÂÒâ¼û²¢ÇÒ¹²ÏíµÄÐÎʽ¡£ÖªÊ¶ºÍÅäÖùÜÀí¶¼ÊǹØÓÚÃèÊöÑùʽ¡£Ò»¸ö¼òµ¥µÄ֪ʶģÐÍÄܹ»±»ÓÃÀ´±íʾһÖÖ²ßÂÔ»òÕßÅäÖã»Ïà·´µØ£¬Ò»¸ö¼òµ¥µÄ²ßÂÔÅäÖÃÄ£ÐÍÄܹ»²úÉúÒ»ÖÖ֪ʶ½á¹¹£¬¾ÍÈçͬËüÄܲúÉúÒ»¸öÎļþϵͳ»òÕßһϵÁеķþÎñ¡£
ÖªÊ¶ÕæÕý¿ªÊ¼ÓÚÎÒÃǼǼÏÂÊÂÇéµÄʱºò£º
l ½«Ä³Ð©¶«Î÷ÓÃÊéдÀ´±í´ïÄÜ´øÀ´Ò»ÖÖÏë·¨µÄ×ÔÂÉ£¬¶ø²»½öÖ»ÊÇʹһ¸öÏë·¨¸üÇåÎú¡£
l ÔÚÄãÊÔͼ½«Ò»¸öÏë·¨¼Ç¼³ÉÓïÑÔ֮ǰ£¬ÄãÊDz»»áÍêÈ«µØÕýÊÓÕâ¸öÏë·¨µÄ¡£
l ÈκÎÊéд¼Ç¼¶¼ÄÜʹµÃÆäËûÈËÔĶÁËü²¢Á÷´«ÖªÊ¶¡£
Âé·³µÄÊÇ£¬ÈËÃÇͨ³£²»Ï²»¶Ð´¶«Î÷£¬¶øÇÒÒ²ºÜÉÙÓÐÈËÊǷdz£Éó¤Ð´¶«Î÷µÄ¡£¶ÔÓÚÒ»¸ö¹¤³Ìʦ¶øÑÔ£¬Í¨³£»á¾õµÃÍ£ÏÂÕýÔÚ×öµÄÊÂÇé¶øÈ¥¼Ç¼Ëù×öµÄÊÂÇ飬¸Ð¾õÊÇÔÚÀË·Ñʱ¼ä£¬ÓÈÆäÊǵ±ÕâÌì±È½Ï·±Ã¦µÄʱºò¡£¶øÇÒ£¬Ð´¶«Î÷ÐèÒªÒ»ÖÖ´´ÐÂÐÔÏë·¨µÄÕÀ·Å£¬Ïà¶ÔÓÚдЩÁ÷³©µÄ¿´ËÆÈß³¤µÄÓïÑÔÐÎʽ£¬¹¤³ÌʦÃÇͨ³£¸üϲ»¶Ê¹Óü¼ÊõÐÔµÄģʽºÍ±ê¼Ç¡£
Cfengine ÊÔͼͨ¹ý¼ò»¯ÎĵµºÍ²¿·Ö¼¼ÊõÅäÖÃÀ´ÃÖ²¹Õâ¸ö²îÒì¡£Cfengine µÄ֪ʶ´úÀíʹÓÃAIºÍÍøÂç¿ÆÑ§Ëã·¨(network science algorithms)£¬»ùÓÚ¼¼Êõ×¢ÊÍÀ´´´½¨¿É¶ÁµÄÎĵµ¡£ËüÖ®ËùÒÔÄÜÕâÑù×öÊÇÒòΪÐí¶àÏë·¨ÔçÒѾÈÚÈëÁ˳ÐŵģÐ͵ÄÏë·¨Ö®ÖС£
֪ʶµÄ¿ªÊ¼ÊÇÄܹ»×¢Êͼ¼ÊõÎĵµ¡£¼Çסһ¸ö³ÐŵµÄÖØµãÊÇÒª±í´ïÒ»ÖÖÒâͼ¡£ÔÚд³ÐŵµÄʱºò£¬ÒªÑø³ÉÒ»¸öϰ¹ß£¬¾ÍÊÇÄܹ»¸øÃ¿¸ö³Ðŵһ¸öÆÀÂÛÀ´½âÊÍËüµÄÒâͼ¡£²¢ÇÒ£¬ÆÚÍûÄܹ»Ò»Ð©ÌØÊâµÄ³Ðŵ¾ä±ú(handles)£¬»òÕßÓÐÓõıêÇ©£¬Ê¹µÃÔÚÆäËû³ÐŵµÄÃèÊöÖÐÄܲο¼ÕâÐ©ÌØÊâµÄ³Ðŵ¡£Ò»¸ö¾ä±ú(handle)¿ÉÒÔÊÇһЩÈÎÒâµÄ´ÊÏñ¡®xyz¡¯£¬µ«ÊÇÄãµÃ¾¡Á¿Ê¹ÓÃһЩ¸üÓÐÒâÒåµÄ±êÇ©´Ó¶øÊ¹µÃ²Î¿¼¸ü¼ÓÇåÎú¡£
files:
"/var/cfengine/inputs"
handle => "update_policy",
comment => "Update the cfengine input files from the policy server",
perms => system("600"),
copy_from => rcp("$(master_location)","$(policy_server)"),
depth_search => recurse("inf"),
file_select => input_files,
action => immediate;
Èç¹ûÒ»¸ö³ÐŵÔÚij·½ÃæÓ°ÏìÁíÒ»¸ö³Ðŵ£¬Äã¿ÉÒÔʹÄǸö±»Ó°ÏìµÄ³Ðŵ³ÉΪÆäÖÐÖ®Ò»µÄ³ÐŵÕß
(the promisees)£¬ ÏñÕâÑù£º
access:
"/master/cfengine/inputs" -> { "update_policy", "other_promisee" },
handle => "serve_updates",
admit => { "217.77.34.*" };
Ïà·´µØ£¬Èç¹ûÒ»¸ö³ÐŵÔÚijЩ·½ÃæÒÀÀµÓÚÁíÒ»¸ö³Ðŵ£¨ÉõÖÁÊǼä½ÓµØ£©£¬Ò²°ÑËü¼Ç¼ÏÂÀ´¡£
files:
"/var/cfengine/inputs"
handle => "update_policy",
comment => "Update the cfengine input files from the policy
server",
depends_on => { "serve_updates" },
perms => system("600"),
copy_from => rcp("$(master_location)","$(policy_server)"),
depth_search => recurse("inf"),
file_select => input_files,
action => immediate;
×¢Ê͵ÄʹÓÃÊÇcfengingÖÐÎĵµµÄµÚÒ»¸ö²ã´Î¡£ÕâЩעÊÍ»áÔÚcfengine ÄÚ²¿ÓÃÓÚÌṩÓÐÒâÒåµÄ´íÎóÐÅÏ¢ÄÚÈݲ¢ÇÒÄܼÆËã³öÏà¹Ø¹ý³ÌÁ´´æÔÚµÄÒÀÀµ¹ØÏµ¡£ÕâЩ¿ÉÒÔ±»×ª»»³ÉÒ»¸ö»°ÌâͼÐΣ¨topic map£©ÓÃÓÚä¯ÀÀ²ßÂÔ¹ØÏµÊÇÒ»¸öÍøÒ³ä¯ÀÀÆ÷£¬Ê¹Óà cf-know¡£
ΪÁ˽¨Á¢Õâ¸ö֪ʶ¿â£¬Ä㽫ÐèҪһ̨ÔËÐÐApache ÍøÒ³·þÎñÆ÷µÄ¼ÆËã»ú£¬²¢ÔڸüÆËã»úÉϰ²×°PHP×é¼þ¡£Õâ¸ö֪ʶ»ùµØÒ²¿ÉÒÔÓëÁíÒ»Ì¨ÍøÒ³·þÎñÆ÷Ò»ÆðÔËÐУ¬Ö»ÒªApacheÊÇÕýÔÚÔËÐеġ£ÒªÉú³Éͼ½â±íʾ·¨£¬ÄãÐèÒªGraphViz °ü¡£¸ü¶àϸ½Ú¼û×îºóµÄannex¡£
ÉÌÒµ°æ±¾µÄcfengineÄܹ»×Ô¶¯Ìṩ²ßÂÔÎĵµ£¬Í¨¹ýʹÓÃÉÏÃæËùÌṩµÄ»ù±¾×¢ÊÍ×÷Ϊһ¸ö֪ʶͼÐΡ£ËüÃÇ»ù±¾²»ÐèÒªÓû§×öʲô¡£Èç¹ûÄãÕýÔÚʹÓÿªÔ´°æ±¾µÄCfengine£¬ËùÓеļ¼Êõ¶¼¿ÉÒÔ»ñµÃʹÓ㬵«ÄãµÃÊÖ¶¯À´Íê³ÉÕâ¸ö¹¤×÷¡£²»¹ÜÄÄÖÖÇé¿ö£¬Ò»µ©ÄãÊìϤÁË»°ÌâͼÐÎ(Topic Maps) µÄʹÓã¬Äã¾Í¿ÉÒÔÊÖ¶¯µØÍØÕ¹ÄãµÄ֪ʶ£¬²¢ÓëÒÔÏÂһЩÊÂÇé½áºÏÆðÀ´£º
l ±¾µØ²ßÂÔÎĵµ£¨¸ß²ã´ÎµÄ£©
l Ïà¹ØÊý¾Ý¿â£¬ÀýÈçCMDBs
ËùÒÔÈÃÎÒÃÇ»¨µãʱ¼äÀ´¿´¿´ÔõÑùʹÓÃcf-know½«ÖªÊ¶Ç¶Èëµ½»°ÌâͼÐÎÖС£
ÄãËùÆÚÍûµÄһЩ½á¹ûÔÚÏÂͼÖÐÏÔʾ¡£ ÕâЩʾÀýͼÏÔʾÁËÓÉ֪ʶ´úÀícf-knowÉú³ÉµÄµäÐ͵ÄÒ³Ãæ¡£µÚÒ»ÕÅͼÏÔʾÎÒÃÇÈçºÎÔÚcfengineÉÌÒµ°æ±¾Ö§³ÖÈë¿Ú'Copernicus'ÖÐʹÓü¼Êõ£¬´Ó¶øÊ¹ÍøÒ³ÖªÊ¶»ù´¡¸üÇ¿´ó¡£

ÔÚʹÓùý³ÌÖÐ, ËùÓеÄÊý¾Ý¶¼ÊÇ»ùÓÚcfengineÈí¼þµÄÎĵµ£¬²¢ÇÒËùÓеĹØÏµ¶¼ÊÇͨ¹ýÊÖ¶¯ÊäÈëµÄ¡£
ÔÚµÚ¶þ¸öÀý×ÓÖУ¬¿¼ÂÇÁËcfengineÊÇÔõÑùÉú³É¹ØÓÚÆäÅäÖõÄ֪ʶͼÐηÖÎö£¨×ÔÎÒ·ÖÎö£©¡£ ÏÂÃæÍ¼ÐÎÖеÄÊý¾ÝÃèÊöÁËcfengine ÅäÖóÐŵ¡£Ò»¸öÕâÑùµÄÒ³Ò»µ©Éú³É£¬ÀýÈ磬¶ÔÓÚÿһ¸ö²ßÂÔ³Ðŵ£¬»á´Ó²»Í¬µÄ¼ÆËã»úÉú³ÉÒ³ÃæÓÃÓÚ±¨¸æ¡£Ä㻹¿ÉÒÔΪÄãËùÓµÓеı¾µØ£¨ÆóÒµ£©ÐÅÏ¢´´½¨Äã×Ô¼ºµÄ¡®»°ÌâÒ³Ãæ¡¯¡£
ÔÚÕâ¸öÀý×ÓÖУ¬Ò»¸ö³Ðŵ±»¸øÓèÁËÒ»¸ö³Ðŵ¾ä±ú update_policy£¬²¢ÇÒÕâÖÖ¹ØÁªºÍͼÐαíÃ÷ÁËÕâ¸ö³Ðŵͨ¹ý´æµµµÄÒÀÀµ¹ØÏµÓëÆäËûµÄ³ÐŵÏà¹ØÁª£¨ÕâЩÒÀÀµ¹ØÏµÀ´×ÔÓÚ±»³ÐŵÕߵĴ浵£¬²¢ÇÒÒÀÀµÓÚÆäËû³ÐŵµÄÊôÐÔ£©¡£
ʾÀýÒ³ÃæÖÐÏÔʾÁËÁ½·ùͼÐΣ¬Ò»¸öÔÚÁíÒ»¸öµÄÉÏÃæ¡£ÔÚÉÏÃæµÄͼÏñ±íÃ÷ÁË30¸öÓë´ËÏà¹ØµÄ×î½Ó½üµÄ»°Ì⣨ÈκÎÐÎʽ£©¡£ÔÚ´ËÕâÖÖ¹ØÏµÃ»Óб»È·¶¨¡£Õâ¸öͼ±íÄܹ»±íʾһЩÒâÁÏÖ®ÍâµÄÏà¹ØÐÅÏ¢µÄ·¾¶£¬²¢ÇÒ˵Ã÷ËüÃÇÖ®¼äµÄ¹ØÏµ£¬´Ó¶øÍØ¿íÁËÎÒÃǶÔÓÚµ±Ç°³ÐŵÔÚÕû¸öͼ±íÖÐËù´¦Î»ÖõÄÀí½â¡£

¾¡¹ÜͼÐεÄ˵Ã÷Ö»ÊǸü³ä·ÖµØ±íÏÖÁËÎı¾ÖеÄÓïÒå¹ØÏµ£¬µ«ËûÃÇÔÚÏ໥¹ØÁªµÄÍøÂçÖл¹¿ÉÒÔÐéÄ⻯¼¸¸ö²ã´ÎµÄÉî¶È¡£ÕâÔÚ¼¯ÌåÌÖÂÛ»òÕßÍÆÀíʱ¿ÉÄÜ»á·Ç³£¾ªÈ˵ÄÓÐÓá£ÓÈÆäÊÇ£¬Èç¹ûÎÒÃǶԵ±Ç°µÄ³Ðŵ×öÁËһЩ¸Ä±ä£¬ÆäËûµÄһЩ³ÐŵҲ¿ÉÄÜ»áÊܵ½Ó°Ïì¡£ÕâÑùµÄÓ°Ïì·ÖÎö¶ÔÓÚ¸Ä±ä¼Æ»®ºÍ²ßÂÔ·¢²¼¹ÜÀí¿ÉÄÜÊǷdz£ÖØÒªµÄ¡£

Ò»¸ö֪ʶ¿âÊǶÔÓÚÒ»¸öISO±ê×¼¼¼ÊõµÄ»°ÌâͼÐΣ¨Topic Map£©µÄʵÏÖ¡£Ò»¸ö»°ÌâͼÐλáÏñÒ»¸öË÷ÒýÄÇÑù¹¤×÷£¬ËüÄܹ»Ö¸ÏòÐí¶à²»Í¬ÀàÐ͵ÄÍⲿ×ÊÔ´£¬²¢ÇÒ¿ÉÒÔ°üº¬ÄÚ²¿µÄ¼òµ¥Îı¾ºÍͼƬ¡£Òò´ËÄã¿ÉÒÔʹÓÃËüÀ´°ó¶¨ÈκÎÀàÐ͵ÄÎĵµ¡£Ò»¸öcfengineµÄ֪ʶ¿â²¢²»ÊÇÒ»¸öеÄÎĵµ¸ñʽ£¬ËüÊÇÒ»¸ö½«Ïë·¨ºÍ×ÊÔ´½áºÏÆðÀ´µÄµþ¼ÓͼÐΣ¬²¢ÇÒ¿ÉÒÔÏÔʾ¹ØÏµ¡£
Äã¿ÉÒÔʹÓÃcf-know ÒÔÎı¾£¨ÓÃÓÚÃüÁîÐУ©»òÕßHTMLµÄÐÎʽÀ´±íʾһ¸ö»°ÌâͼÐΣ¨ÓÃÓÚÍøÒ³ÏÔʾ£©¡£ÎÒÃÇÏÈÀ´ËµÃ÷Ò»ÏÂÎı¾ÏÔʾ£¬ÒòΪËü²»ÐèҪ̫¶àµÄ½á¹¹¡£ÄãÖ»ÐèÒªÒ»¸öÊý¾Ý¿â¡£
ÊÔ×ÅÊäÈëÏÂÃæµÄ֪ʶ³Ðŵ£º
body common control
{
bundlesequence => { "tm" };
}
body knowledge control
{
query_output => "text";
query_engine => "none";
sql_database => "test_map";
sql_owner => "mark";
sql_type => "mysql";
sql_passwd => ""; # No passwd for localhost
}
###################################################
bundle knowledge tm
{
topics:
any::
#ÎÒÃÇÐèÒª´Óij´¦¿ªÊ¼
"Processes" comment => "Programs running on a computer";
"Computers" comment => "Generic boxes",
association => a("run","Services","are run on");
Computers::
"server" comment => "Common name for a computer in a desktop";
"desktop" comment => "Common name for a computer for end users";
Programs::
"httpd" comment => "A web service process";
"named" comment => "A name service process";
Services::
"WWW" comment => "World Wide Web service",
association => a("is implemented by","httpd","implements");
"WWW" association => a("looks up addresses with","named","serves
addresses to");
#
occurrences:
httpd::
"http://www.apache.org"
represents => { "website" };
}
###################################################
body association a(f,name,b)
{
forward_relationship => "$(f)";
backward_relationship => "$(b)";
associates => { $(name) };
}
atlas$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.67 SUSE MySQL RPM
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database test_map;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE topics
-> (
-> topic_name varchar(256),
-> topic_comment varchar(1024),
-> topic_id varchar(256),
-> topic_type varchar(256)
-> );
Ò»µ©ÄãÒѾ´´½¨ÁËÊý¾Ý¿â£¬Äã¿ÉÒÔͨ¹ýÊäÈëÏÂÃæµÄÃüÁîÀ´Ìî³äËü£º
host$ /usr/local/sbin/cf-know -f ./unit_knowledge_txt.cf -s
Äã¿ÉÒÔÑéÖ¤Êý¾ÝÒѾ²åÈ룺
mysql> use test_map;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from topics;
+------------+-----------------------------------------+-----------
+------------+
| topic_name | topic_comment | topic_id |
topic_type |
+------------+-----------------------------------------+-----------
+------------+
| WWW | World Wide Web service | WWW |
Services |
| named | A name service process | named |
Programs |
| httpd | A web service process | httpd |
Programs |
| desktop | Common name for a computer for end users| desktop |
Computers |
| server | Common name for a computer in a datacent| server |
Computers |
| Computers | Generic boxes | Computers |
any |
| Processes | Programs running on a computer | Processes |
any |
+------------+-----------------------------------------+-----------
+------------+
´Ëºó£¬Äã¾Í²»ÐèÒª½âÎöÕû¸öµÄÊý¾ÝÀ´Ê¹ÓÃÕâ¸ö»°ÌâͼÐΡ£Äã¿ÉÒÔʹÓÃÒ»¸öÇáÊ¡µÄ
µÄ¡®Çý¶¯½Å±¾¡¯£¬Ëü×ã¹»¿ÉÒÔ²éѯÊý¾Ý¿âµÄ¹ØÏµ¡£
body common control
{
bundlesequence => { "tm" };
}
body knowledge control
{
query_output => "text";
query_engine => "none";
sql_database => "test_map";
sql_owner => "mark";
sql_type => "mysql";
sql_passwd => ""; # No passwd for localhost
}
###################################################
bundle knowledge tm
{
topics:
any::
"Nothing needed here -- we get everything from the db cache";
}
ÏÖÔÚÄã¿ÉÒÔÖ±½Ó´ÓÊý¾Ý¿â²éѯ»º´æµÄ»°ÌâͼÐΡ£¡®-t¡¯»òÕß¡®--topic¡¯Ñ¡Ïî¿ÉÒÔÓÃÀ´ÊäÈëÒ»¸ö»°ÌâµÄÃû×Ö¡£»¹¿ÉÒÔʹÓá®-r¡¯»òÕß¡®--regex¡¯Ñ¡ÏîÀ´ÊäÈëÈÎÒâ¹æÔòµÄ±íʾÀ´Æ¥ÅäÕâЩ»°Ìâ¡£

_ _ atlas$ ~/LapTop/Cfengine3/trunk/src/cf-know -f ./unit_knowledge_txt.cf
-t Computers
Topic "Computers" found in the context of "any"
Results:
Explanation: "Generic boxes" (Text)
Topics of the type Computers:
desktop
server
Associations:
Computers "run"
- Computers
Computers "are run on"
- any::Computers
Other topics of the same type (any):
Processes - Programs running on a computer
ÏÖÔÚÈç¹ûÎÒÃǰ´ÕÕÏÂÃæµÄ²½Ö裺

atlas$ ~/LapTop/Cfengine3/trunk/src/cf-know -f ./unit_knowledge_txt.cf
-t httpd
Topic "httpd" found in the context of "Programs"
Results:
Explanation: "A web service process" (Text)
website: http://www.apache.org (URL)
Topics of the type httpd:
(none)
Associations:
httpd "implements"
- Services::WWW
Other topics of the same type (Programs):
named - A name service process
ÔÚÕâ¸öÀý×ÓÖУ¬×¢ÒâÕâÁ½¸ö½á¹û£¬Ò»¸öÊÇURL£¬Ò»¸öÊÇÎÄ×ÖÎı¾×Ö·û´®¡£»¹ÓÐÒ»¸öÓëWWW·þÎñµÄ¹ØÁª¡£Èç¹ûÎÒÃǰ´ÕÕÏÂÃæµÄ²½Ö裺

atlas$ ~/LapTop/Cfengine3/trunk/src/cf-know -f ./unit_knowledge_txt.cf
-t WWW
Topic "WWW" found in the context of "Services"
Results:
Explanation: "World Wide Web service" (Text)
Topics of the type WWW:
(none)
Associations:
WWW "is implemented by"
- httpd
WWW "looks up addresses with"
- named
Other topics of the same type (Services):
£¨none£©
ΪÁËÄÜÒÔÍøÒ³¸ñʽÏÔʾÕâ¸ö£¬ÎÒÃǽ«²éѯµÄÊä³ö±ä³É¡®html¡¯£»cf-know ½«»áÏÔʾhtmlÒ³Ãæ¡£¿ÉÒÔͨ¹ýÒ»¸ö¼òµ¥µÄPHP½Å±¾´´½¨Ò»¸ö¼òµ¥µÄ·â×°½Å±¾À´Ê¹Ëü³ÉΪһ¸öÍøÒ³£¬ÀýÈ磺
<?php
$arg1 = $_GET['next'];
$cfknow = "/usr/local/sbin/cf-know";
$file = "/path/to/portal/overview.cf";
if ($arg1)
{
system("$cfknow -t $arg1 -f $file");
}
else
{
system("$cfknow -t some_start_topic -f $file");
}
?>
ÔÚÕâÀ²»×ãµÄ»°ÌâÒ²ÄܲúÉúһЩͼÐΡ£¡£µ«Ò»¸ö»°Ìâ±ØÐëÖÁÉÙÓÐÁ½¸ö¹ØÁª²ÅÄÜÈ·±£²úÉúÒ»¸öͼ±í¡£
»°ÌâͼÐÎÆäʵÊǵç×ÓË÷Òý£¬µ«ËüÃǵÄÐγɺ͹¤×÷·½Ê½ÀàËÆÓÚÍøÒ³¡£Ò»¸ö»°ÌâÊÇ´ú±íÁËÒ»¸ö¼¼ÊõµÄ¡®Ö÷Ì⡯£¬ÀýÈ磬ÈκÎÄã¿ÉÄÜÏëÒªÌÖÂÛµÄÊÂÇ飬ժҪµÄ»òÊÇÎïÖʵģ¬ÀýÈ磬һ¸ö¡®ÖªÊ¶ÕªÒª¡¯ÏîÄ¿£¬Ëü¿ÉÄÜÓÐÐí¶à¾ßÌåµÄ·¶Àý¡£Ëü¿ÉÄÜÊÇÒ»¸öÈË£¬Ò»Ì¨»úÆ÷£¬Ò»ÖÖÖÊÁ¿µÈ¡£
»°Ìâ¿ÉÒÔ±»·ÖÀà³É²»Í¬µÄÀàÐÍ£¬³ÆÎª topic-types£¬Òò¶øÏà¹ØµÄÊÂÇéÄܹ»±»ÕûÀí²¢ÇÒ²»Ïà¹ØÁªµÄÊÂÇé¿ÉÒÔ±»·Ö¿ª£¬ÀýÈ磬»°ÌâÀàÐÍÄܹ»ÈÃÎÒÃÇÇø·ÖUNIXÃüÁîµÄrmdirºÍUnixϵͳµ÷ÓõÄrmdir¡£
ÿһÖÖ±»·ÖÀàµÄ»°ÌâÄܹ»½øÒ»²½µØÖ¸Ïò´óÁ¿µÄ²Î¿¼»òÕß·¶Àý£¬³ÆÎªÊ¼þ£¨occurrences£©¡£ÀýÈ磬һ¸ö»°Ìâ¡®computer¡¯µÄʼþ¿ÉÄܰüÀ¨Êé£¬ÍøÒ³Îĵµ£¬Êý¾Ý¿âÌõÄ¿£¬ÎïÖʵÄÏÔÏÖ£¬»òÕßһЩÆäËûµÄÐÅÏ¢¡£Ò»¸öʼþÊÇÒ»¸öÄܹ»¾ÙÀýÖ¤Ã÷ÕªÒª»°ÌâµÄ²Î¿¼¡£Ê¼þ²Î¿¼£¨Occurrence references£©ÀàËÆÓÚË÷ÒýÖеÄÒ³Âë¡£
Ò»±¾ÊéµÄË÷Òýͨ³£ÓС®²Î¼û¡¯(¡®see also¡¯)µÄ²Î¿¼£¬Ëü¿ÉÒÔ´ÓÒ»¸ö»°ÌâÖ¸ÏòÁíÒ»¸ö»°Ìâ¡£»°ÌâͼÐÎÔÊÐíÎÒÃǶ¨ÒåÈκÎÀàÐ͵ϰÌâÖ®¼äµÄ¹ØÁªÐÎʽ¡£ÓëÒ»¸öÆÕͨµÄË÷Òý²»Í¬µÄÊÇ£¬Ò»¸ö»°ÌâͼÐÎÓи÷ÖַḻµÄ£¨¿ÉÄÜÊÇÎÞÏ޵쩽»´íµÄ²Î¿¼ÀàÐÍ¡£ÀýÈ磬
topic_1 ``is a kind of'' topic_2
topic_1 ``is improved by'' topic 2
topic_1 ``solves the problem of'' topic_2
Òò¶øÕâ¸ö»°ÌâͼÐεÄÄ£ÐÍÓÐÈý¸ö²ã´ÎµÄÈÝÆ÷£º
ÀàÐÍ ÎÒÃǽ«Ò»¸ö»°Ìâ»®·Ö³É²»Í¬µÄÀàÐÍ´Ó¶øÏû³ýÁ˾ßÓÐÏàͬÃû×ֵIJ»Í¬»°ÌâÖ®¼ä²úÉú
µÄÆçÒå¡£
»°Ìâ Ò»¸öÖ÷ÌâµÄ±íÏÖ£¨Ò»¸öË÷Òý´Ê£©
ʼþÀàÐÍ
ÓÃÓÚ½âÊÍÒ»¸öÕæÕýµÄÎĵµÊ¼þÊÇÔõÑùÓë»°ÌâÏàÁªÏµµÄ£¬¸ÃÊõÓïÓÃÓÚÉùÃ÷һЩ¶«Î÷£¬
ÀýÈ磨½²Ò壬Êֲᣬ»òÕßʾÀý£¬¶¨Ò壬ÕÕÆ¬Ïà²áµÈ£©
ʼþ רÃŵÄÐÅÏ¢×ÊÔ´£ºÕâЩÊÇÖ¸ÏòÎÒÃÇÏë¶ÁµÄÄÇЩʵ¼ÊÎĵµµÄÖ¸Õ루ÀàËÆÓÚË÷ÒýÖеÄÒ³
Â룩¡£
ÎÒÃÇ¿ÉÒÔºÜÈÝÒ׵ؽ«»°Ìâ¼ÓÈëµ½cfengineµÄÀàÖС£»°ÌâͼÐÎÒ²ÄܺÜÈÝÒ׵ļÓÈëµ½³ÐŵÕßÖС£Ê¼þÒ²Äܹ»Ó³Éäµ½²»Í¬ÀàÐ͵ijÐŵÕßÖС£ÕâÈý¸ö±êÇ©Çø·ÖÁ˲»Í¬ÒâÒåµÄ¼ä¸ô³ß¶È²ã´Î¡£ÀàÐÍ´ú±íÁËһϵÁеϰÌ⣬ÕâЩ»°Ì⻹°üº¬Ò»ÏµÁеÄʼþ¡£ÆäÖУ¬Ö÷ÒªµÄ»°ÌâÀ´×ÔÓÚËûÃÇͨ¹ý¹ØÁªÐÔÀ´ÐγÉÍøÂçµÄÄÜÁ¦¡£
ÐÅϢģÐÍ»¯µÄ¾µä·½·¨Êǽ¨Á¢·Çµþ¼ÓµÄ¶ÔÏóµÄ²ã´Î»¯·Ö½â½á¹¹¡£Êý¾Ý±»Ç¿ÖƵطÖÔڷǵþ¼ÓµÄÈÝÆ÷ÖУ¬ÕâЩÈÝÆ÷ͨ³£ÊǾßÓйý¶ÈµÄÏÞÖÆÐԵġ£»°ÌâͼÐÎʹµÃÎÒÃÇÄܹ»±ÜÃâ¸÷ÖÖÀàÐ͵ĴíÎó£¬ÀýÈçµ¼ÖÂÀàËÆ´øÓгÉǧÉÏÍòÑϸñµÄ·Çµþ¼ÓÀàÐÍ·ÖÀàµÄ¹²Í¬ÐÅϢģÐÍ£¨CIM£©µÄ»ûÐΡ£
ÿ¸ö»°ÌâʹµÃÎÒÃÇÄܹ»ÓÐЧµØ¡®±íÏÖ¡¯ÐÅϢʼþ´Ó¶øÍ»³ö¹ØÓڸû°ÌâµÄÇ¡µ±µÄ¸ÅÄî¡£
CfengineµÄ֪ʶ´úÀíÆ÷ cf-know ʹµÃÄãÄܹ»¶ÔÓÚ֪ʶºÍËüÃǵÄÄÚ²¿¹ØÏµ×÷³ö³Ðŵ¡£Ëü²»ÊÇרÃŵØÒ»¸öͨÓõϰÌâͼÐÎÓïÑÔ£º¶øÊÇËüÄܹ»Îª¹ÜÀíÒ»¸ö֪ʶ¿âÌṩһÖÖÇ¿´óµÄÅäÖÃÓïÑÔ£¬´Ó¶ø°ÑËü±àÒë³ÉÒ»ÖÖ»°ÌâͼÐΡ£
Ò»¸ö±ê×¼µÄISO»°ÌâͼÐÎÄ£ÐÍÓÉÓÚÌ«·á¸»¶ø²»ÄܳÉΪһ¸öϵͳ֪ʶ¹ÜÀíµÄÓÐÓù¤¾ß¡£È»¶ø£¬Õâ¾ÍÊÇÇ¿´óµÄÅäÖùÜÀíÄܹ»°ïÖú¼ò»¯Õâ¸ö¹ý³ÌµÄËùÔÚÖ®´¦£ºÎªÒ»¸ö»°ÌâͼÐαàÂëÊÇÅäÖÃÖÐÒ»¸ö¸´ÔÓµÄÎÊÌ⣬¶øcfengine Ç¡ºÃÄܽâ¾öÕâ¸öÎÊÌâ¡£CfengineµÄ»°ÌâͼÐγÐŵÓÐÏÂÃæµÄÐÎʽ£º
bundle knowledge example
{
topics:
topic_type_context:: #±ê×¼µÄÈÝÆ÷
"Topic name" #¼ò¶ÌµÄ»°ÌâÃû³Æ
comment => "Use this for a longer description",
association => a("forward assoc to","Other topic","backward assoc");
"Other topic";
occurrences:
Topic_name:: # Topic
"http://www.example.org/document.xyz" # URI to instance
represents => { "Definition", "Tutorial"}; # sub-types
}
¹ØÁªÌåµÄÄ£°åÈçÏ£º:
body association a(f,name,b)
{
forward_relationship => "$(f)";
backward_relationship => "$(b)";
associates => { $(name) };
}
³ÐŵÀíÂÛ¸ø»°ÌâͼÐα¾ÌåÔö¼ÓÁËÒ»¸öÇåÎúµÄ¹¹¼Ü£¬ÕâÊǷdz£ÓÐÓõ쬾Ñé±íÃ÷´àÈõµÄ¸ÅÄîÄ£ÐͻᵼÖºܲîµÄ֪ʶͼÐΡ£
ÔÚcfengineÖÐÎÒÃÇÄܹ»½«»°ÌâͼÐÎËÜÔì³É³ÐŵģÐÍ£»Ê£ÏµÄÎÊÌâ¾ÍÊǹØÓÚÔõÑùʹÓû°ÌâͼÐÎÐγÉÄ£ÐÍÅäÖôӶøcfengineµÄʹÓÃÕßÄܹ»Ê¹ÓÃÍøÒ³ä¯ÀÀÆ÷²éÕÒä¯ÀÀ´æµµµÄ³Ðŵ£¬²¢ÇÒÄܹ»¿´ÇåÔ±¾¹ÂÁ¢ºÍ±»·Ö¸îµÄ¹æÔòÖ®¼äµÄËùÓйØÏµ¡£Õâ¸ö½«ÎªcfengineµÄÈí¼þÐγɻù±¾µÄÓïÒåÅäÖùÜÀíÊý¾Ý¿â£¨sCMDB£©¡£ÊµÏÖÕâ¸öÄ¿±êµÄ¹Ø¼üÊǽ«»°ÌâͼÐεÄÅäÖÿ´³É»°Ìâ³éÏó¿Õ¼äÉú³ÉµÄ´óÁ¿³Ðŵ£¬²¢ÇÒÄܹ»½«Ã¿¸ö³Ðŵ±ä³ÉÒ»¸ö³ÐŵԪ×飨meta-promise£©£¬´Ó¶ø½«ÅäÖÃÄ£ÐͳÉÒ»¸ö´øÓи÷ÖÖ¹ØÁªµÄ»°Ìâ¡£¿´ÒÔϵÄCfengineµÄ³Ðŵ¡£
bundle agent update
{
files:
any::
``/var/cfengine/inputs'' -> { ``policy_team'', ''dependent'' },
comment => ``Check policy updates from source'',
perms => true,
mode => 600,
copy_from => true,
copy_source => /policy/masterfiles,
compare => digest,
depth_search => true,
depth => inf,
ifelapsed => 1;
}
Cfengine¿ÉÒÔ½«ÏµÍ³ÅäÖóÐŵӳÉäµ½´óÁ¿µÄÆäËû³ÐŵÌáÒ飬ÓÃÓÚcf-know µÄ´úÀíÆ÷¡£Òþ²ØÒ»Ð©Ï¸½Ú£¬ÎÒÃÇÓУº
type_files::
"/var/cfengine/inputs"
association => a("promise made in bundle","update","bundle
contains promise");
"/var/cfengine/inputs"
association => a("specifies body type","perms","is specified in");
"/var/cfengine/inputs"
association => a("specifies body type","mode","is specified in");
"/var/cfengine/inputs"
association => a("specifies body type","copy_from","is specified
in");
# etc ...
occurrences:
_var_cfengine_inputs::
"promise_output_common.html#promise__var_cfengine_inputs_update_cf_13"
represents => { "promise definition" };
ÔÚ¸ÃÓ³ÉäÖÐҪעÒ⣬ʵ¼ÊµÄ³Ðŵ£¨±»¿´×÷Ò»¸öÏÖʵÊÀ½çµÄʵÌ壩ÊÇÒ»¸ö»°Ìâ¡®³Ðŵ¡¯Ê¼þ£»Í¬Ê±Ã¿¸ö³Ðŵ×÷Ϊһ¸ö²»Í¬µÄ»°ÌâÌÖÂÛ£¬Ê¹µÃʵÌå¹ØÏµÄ£ÐÍÐγÉÏÖʵÊÀ½çÊý¾ÝµÄÄ£ÐÍÔª×é¡£Ïà·´µÄ£¬»°Ìâ±¾Éí³ÉÁ˸óÐŵģÐÍÖеÄÅäÖÃÏîÄ¿»òÕß¡®³ÐŵÕß¡¯¡£×÷ÓÃÊÇ´´½¨Ò»¸öä¯ÀÀ²ßÂԵĵ¼º½ÓïÒåÍøÒ³£»Õâ¿ÉÒÔʹÓÃÒ»¸öСµÄ±ê×¼¸ÅÄîµÄʵÌåÀ´´æµµ²ßÂԵĽṹºÍÄ¿µÄ£¬²¢ÇÒÄܱ»ÈËÀàÓòÃûר¼ÒÃÇÎÞÏ޵ؽøÐÐÍØÕ¹¡£
ÄãÐèҪһ̨µçÄÔÀ´ÔËÐÐÒ»¸öapacheµÄÍøÒ³·þÎñÆ÷£¬²¢¾ßÓÐһЩ¼¤»îµÄ·þÎñÆ÷Ò³Ãæ¼¼Êõ×÷ΪcfengineµÄ·â×°¡£ÎÒÃÇʾÀý¼ÙÉèÕâ¸ö·â×°ÊÇÒ»¸öʹÓÃPHPµÄÍøÒ³·þÎñÆ÷¡£Ä㻹ÐèÒªÒ»¸öºó¶ËµÄÒ»¸öSQLÊý¾Ý¿â£¨ÓÃÓÚcfengine¶ø²»ÊÇPHP£©¡£Cfengineµ±Ç°Ö§³ÖMySQLºÍPostreSQL¡£Ò»¸öPHP¼¤»îµÄË÷ÒýÒ³Ãæ°üº¬ÁËÒ»¸ö·â×°£¬Äܹ»ÔËÐÐcf-know×é¼þ£¬²¢ÇÒ½«Õâ¸öÒ³ÃæÌá¸øÍøÒ³ä¯ÀÀÆ÷¡£
ΪÁËÄܹ»¹¤×÷£¬Äã´´½¨cfengine½øÐбàÒëµÄʱºòÐèÒªÊý¾Ý¿âµÄÖ§³Ö¡£MySQLºÍPostgreSQLÊý¾Ý¿âĿǰÊÇÖ§³ÖµÄ¡£ÄãÔÚ°²×°phpµÄʱºò²»ÐèÒªÕâЩÊý¾Ý¿âµÄÄ£¿é£¬ÒòΪcfengineÄܹ»Ö±½ÓÓëÊý¾Ý¿â¶Ô»°£¬µ«cfengineÔÚ±àÒëµÄʱºòÐèÒªÊý¾Ý¿âµÄÖ§³Ö¡£