2016-03-21 2 views
0

В promises.cf моей Cf-ServerD, я есть связка, какКак использовать параметризованные пакеты в cf-serverd?

bundle server host_rules(key, host) { 
    access: 
     "/srv/cfengine3/$(host)" 
     admit_keys  => { "$(key)" }; 
} 

Я попытался создать экземпляр его

body common control { 
     bundlesequence => 
     { 
     generic_rules, 
     host_rules("MD5=362c5fcf568b492f78ae392229299c05", "foo.example.com"), 
     }; 
} 

Но (с Cfengine-3.8.1), это, кажется, не имеют эффект. Например. cf-serverd -v сообщает только о правилах доступа в пакете generic_rules и предоставляется доступ к файлам foo.example.com.

generic_rules (который представляет собой простой комплект bundle server generic_rules { ... }), по-видимому, оценивается, если не указан общий bundlesequence.

Как я могу расширить комплект host_rules в настройке cf-serverd?

EDIT:

Я намерен дать доступ к некоторым каталогам только к соответствующему хосту, который идентифицируется по ключу. Я знаю, что можно использовать $(connection.key) в путевом имени, но не нравится это, потому что

  • это неразборчивое (имея десятки каталогов с бессмысленными MD5=... имен делает его трудности, чтобы найти каталог, принадлежащий к «foo.example .com ')

  • Это создает проблемы при изменении ключа клиента (например, потому что это было скомпрометировано или потому, что хост будет переустановлен). 'git' ( , используемый для организации моих правил cfengine) не поддерживает переименование файлов/каталогов , и я бы потерял историю изменений с помощью 'git mv'.

ответ

0

Для справки: https://groups.google.com/forum/#!topic/help-cfengine/ba5i_1UXPrU

Соединение переменных расширяется cf-serverd при подключении клиентов. В случае connection.hostname переменная расширяется до имени хоста соединительного агента, как определено обратным DNS-обращением от cf-serverd. Поэтому вам нужно убедиться, что у вас есть правильное обратное разрешение dns, чтобы использовать это. Если вместо организации файлов по имени хоста, вы организовали их по ключевым ша вы должны быть в состоянии позволить каждому хосту иметь доступ к своей директории, используя что-то вроде следующего:

bundle server my_special_access_rules 
    { 
    access: 
     # /srv/cfengine3/MD5=0a9082478b1a1466f6e56fd5e48db8c4/directory full of files 
     "/srv/cfengine3/$(connnection.key)" 
      shortcut => "host_cfinput", 
      admit_keys => { $(connetion.key) }; 
    } 

И тогда в качестве агента расслоении вы можете сделать это:

bundle agent have_a_copy_of_my_files 
    { 
    files: 
     # Using the shortcut 
     "/tmp/myfiles/." 
      copy_from => remote_dcp("host_cfinput", $(sys.policy_hub)), 
      depth_search => recurse(inf); 

     # Without using the shortcut 
     "/tmp/another_myfiles/." 
      copy_from => remote_dcp("/srv/cfengine3/$(sys.key_digest)/.", $(sys.policy_hub)), 
      depth_search => recurse(inf); 
    } 

Теперь вы можете иметь каталог для каждого хоста в /srv/cfengine3/ имени для открытого ключа ша хозяина. Каждому хосту разрешен доступ только к его собственному каталогу, поскольку вы сопоставили каталог с admit_keys в соотношении 1: 1.

+0

спасибо за эту идею, но мне не нравится иметь ключ в пути. Я обновил свой вопрос с подробностями. – ensc

0

Как было превращено out, что ср-ServerD не поддерживает такие связки, я стремящейся осуществить это путем перебора списка:

bundle server host_list { 
    vars: 
     "keymap" data => parsejson(' 
     { 
     "foo.example.com" : ["MD5=362c5fcf568b492f78ae392229299c05"], 
     }'); 

     "hosts" slist => maparray("$(this.k)", keymap); 

    access: 
     "/srv/cfengine3/$(hosts)" 
     admit_keys  => { $(keymap[${hosts}]) }; 

     "/srv/cfengine3/KEYS/$(hosts)" 
     admit_keys  => { $(keymap[${hosts}]) }; 
} 

Ярлыки могут быть определены

 "/srv/cfengine3/$(connection.hostname)" 
     admit_hostnames => { }, 
     shortcut  => "host_cfinput"; 

Представляется важным, что присутствует тег admit_hostnames; иначе $(connection.hostname) не будет расширен.

1

Для справки: https://groups.google.com/d/msg/help-cfengine/ba5i_1UXPrU/xaWciJoIDQAJ

bundle server my_host_access_rules 
{ 
    vars: 
    # You can build a map of hostname to keys. 
    # You might prefer to do this in an external data file formated as 
JSON and 
    # use readjson to read it in. 
    # 
    # { 
    # "hub":  "SHA=e...", 
    # "host001": "SHA=b..." 
    # } 

    "name_to_key[hub]" string => 
"SHA=ee29780b3c86d486699f97e30c5924431475b1b06e02c2724dd925c1524afef6"; 
    "hosts" slist => getindices(name_to_key); 

    access: 
    # Grant access to the directory named for the currently iterated 
host to the public key sha for that host. 
    "/srv/cfengine3/$(hosts)/." 
     admit_keys => { "$(name_to_key[$(hosts)])" }; 
} 

Я испытал это на пре-релиз сборки 3.7.3, и я не должен иметь пустое имя хоста.

+0

Существование (по крайней мере) пустых 'admit_hostnames' интересно для случая' shortcut' с '$ (connection.hostname)', являющегося частью имени хоста. Я тестировал его только с 3.8.1, а не с 3.7.x – ensc

+1

. Было бы осторожно использовать ярлык, расширяющий любые неконнекторы, которые, как вы ожидаете, будут отличаться между соединительными агентами для данного пути. –

0

Попробуйте это:

bundle server host_list { 
    vars: 
     # Each host should only have one key 
     "keymap" data => parsejson(' 
     { 
      "foo.example.com" : "MD5=362c5fcf568b492f78ae392229299c05", 
     }'); 

     "hosts" slist => getindices(keymap); 

    access: 
     "/srv/cfengine3/$(hosts)" 
     admit_keys  => { $(keymap[${hosts}]) }; 

     "/srv/cfengine3/KEYS/$(hosts)" 
     admit_keys  => { $(keymap[${hosts}]) }; 
} 
Смежные вопросы