3 \me7 @s UdZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z m Z mZddlmZddlmZddlmZmZdd lmZdd lmZd Zed d ddddgZed gZdZdZdZ dZ!dZ"dZ#ddde dde#dddddd Z$e%dgZ&e%d d!d"d#d$d%d&gZ'e%ej(e$j)e&e'd'd(d)d*d+gZ*d,Z+d-Z,ed.d/d0d1d2gZ-eZ.d3gZ/ej0e1Z2d4d5d6ed7e/ed8ge.d9gd:Z3e3ee3Zd;d<Z4d=d>Z5e6eee7dd?d@dAZ8dBdCZ9ee7dDdEdFZ:dRedGdHdIZ;edJdKdLZdS)Sz7Chef: module that configures, starts and installs chef.N)dedent)List)subp temp_utils templater url_helperutil)Cloud)Config) MetaSchema get_meta_doc)Distro) PER_ALWAYSz1.8z /etc/chefz /var/log/chefz /var/lib/chefz/var/cache/chefz/var/backups/chefz /var/run/chefz#https://www.chef.io/chef/install.shz/etc/chef/validation.pemz#/etc/chef/encrypted_data_bag_secret_defaultz/etc/chef/firstboot.jsonz :verify_nonez:infoz/var/log/chef/client.logz/etc/chef/client.pemz/var/run/chef/client.pidT) Zssl_verify_modeZ log_level log_locationvalidation_keyvalidation_cert client_key json_attribsfile_cache_pathZfile_backup_pathpid_file show_timeencrypted_data_bag_secretrrrrrrrr server_url node_name environmentvalidation_nameZ chef_licensez/etc/chef/client.rbz/usr/bin/chef-clientz-dz-iZ1800z-sZ20allZcc_chefZChefz0module that configures, starts and installs chefa This module enables chef to be installed (from packages, gems, or from omnibus). Before this occurs, chef configuration is written to disk (validation.pem, client.pem, firstboot.json, client.rb), and required directories are created (/etc/chef and /var/log/chef and so-on). If configured, chef will be installed and started in either daemon or non-daemon mode. If run in non-daemon mode, post run actions are executed to do finishing activities such as removing validation.pem.a chef: directories: - /etc/chef - /var/log/chef validation_cert: system install_type: omnibus initial_attributes: apache: prefork: maxclients: 100 keepalive: off run_list: - recipe[apache2] - role[db] encrypted_data_bag_secret: /etc/chef/encrypted_data_bag_secret environment: _default log_level: :auto omnibus_url_retries: 2 server_url: https://chef.yourorg.com:4000 ssl_verify_mode: :verify_peer validation_name: yourorg-validatorchef)idnametitle descriptiondistrosZexamples frequencyZactivate_by_schema_keyscCs.tj|ddd}|r*tjjtr*tjtdS)NZdelete_validation_post_execF)default)rget_cfg_option_boolospathisfileCHEF_VALIDATION_PEM_PATHunlink)chef_cfgZ delete_pemr./usr/lib/python3.6/cc_chef.py post_run_chefs r0cCstj}xf|jD]Z\}}|tkr0tjd|q|dkrBd||<q|tkr\tj||||<qtj ||||<qW|j tj tj |d|dtj |ddd|d|dd|S) Nz'Skipping unknown chef template key '%s'r)r&rrrr)Z generated_byrrrr) CHEF_RB_TPL_DEFAULTScopyitemsCHEF_RB_TPL_KEYSLOGdebugCHEF_RB_TPL_BOOL_KEYSrr'get_cfg_option_strupdateZ make_header)iidr-paramskvr.r.r/get_template_paramss&    r>)r!cfgcloudargsreturncCsd|krtjd|dS|d}tj|d}|s8tt}xtj|tD]}tj |qFW|j dt }|j d}|r|dkrtj ||nt jj|stjd||jd } | rt|jj} t| |} t} x2| jD]&\} }| tko|r| jt jj|qWtj| tj| t| n tjd ttj|d t d }|sJtj!d nbi}d|krd|d|d<d|kr|d}x"t|j"D]} || || <qWtj |t#j$|tj%|ddd }t&j't(}| s|rt)||}n|rtj%|ddd }nd}|rt*|t+|dS)z'Handler method activated by cloud-init.rz8Skipping module named %s, no 'chef' key in configurationNZ directoriesrrsystemzWchef validation_cert provided as 'system', but validation_key path '%s' does not exist.zchef_client.rbz&No template found, not rendering to %sZfirstboot_path)r&z7First boot path empty, not writing first boot json fileZrun_listinitial_attributes force_installFexec),r5r6rZget_cfg_option_listlist CHEF_DIRS itertoolschainREQUIRED_CHEF_DIRSZ ensure_dirgetr+ write_filer(r)r*warningZget_template_filenamestrZ datasourceZget_instance_idr>setr3CHEF_RB_TPL_PATH_KEYSadddirnameZ ensure_dirsrZrender_to_file CHEF_RB_PATHr8 CHEF_FB_PATHinfokeysjsondumpsr'rZis_exeCHEF_EXEC_PATH install_chefrun_chefr0)r!r?r@rAr-Z chef_dirsdZ vkey_pathZvcertZ template_fnr:r;Z param_pathsr<r=Z fb_filenameZ initial_jsonrDrEZ installedrunr.r.r/handlesj                 r_cCstjdtg}d|krl|d}t|ttfr:|j|qvt|trP|j|qvtj dt ||jt n |jt t j |dddS)NzRunning chef-clientZexec_argumentszRUnknown type %s provided for chef 'exec_arguments' expected list, tuple, or stringF)capture) r5r6rZ isinstancerGtupleextendrOappendrNtypeCHEF_EXEC_DEF_ARGSr)r-cmdZcmd_argsr.r.r/r\s       r\)distrorAc Ksp|j}|jdd}tj|jdd@}tjj||}|jd|t j ||ddt j fd|i|SQRXd S) aWrite blob to a tempfile, and call subp with args, kwargs. Then cleanup. 'basename' as a kwarg allows providing the basename for the file. The 'args' argument to subp will be updated with the full path to the filename as the first argument. basenameZ subp_blobT)dirZ needs_exeri)moderAN) r2poprZtempdirZget_tmp_exec_pathr(r)joininsertrrMr)blobrhrAkwargsriZtmpdZtmpfr.r.r/subp_blob_in_tempfile+s  rq)rhcCsP|dkr t}|dkrt}|dkr&g}nd|g}tj||dj}t|||dddS)agInstall an omnibus unified package from url. @param url: URL where blob of chef content may be downloaded. Defaults to OMNIBUS_URL. @param retries: Number of retries to perform when attempting to read url. Defaults to OMNIBUS_URL_RETRIES @param omnibus_version: Optional version string to require for omnibus install. Nz-v)urlretrieszchef-omnibus-installF)rhrorArir`) OMNIBUS_URLOMNIBUS_URL_RETRIESrZreadurlcontentsrq)rhrrrsomnibus_versionrAZcontentr.r.r/install_chef_from_omnibus>s rx)r@cCstj|dd}tj|ddd}|dkrbtj|dd}tj|dt}t|||jtj|dd d}n`|dkrz|jjd gnH|d krtj|d }t|jtj|d tj|d|dnt j d|d}|S)N install_typeZpackagesrFF)r&Zgemsversion ruby_versionTrZomnibusrwZ omnibus_urlZomnibus_url_retries)rhrrrsrwzUnknown chef install type '%s') rr8r'RUBY_VERSION_DEFAULTinstall_chef_from_gemsrhinstall_packagesrxZget_cfg_option_intr5rN)r@r-ryr^ chef_versionr{rwr.r.r/r[]s*       r[)rBcCs&d|d|g}|dkr"|jd|S)Nzruby%sz ruby%s-devz1.8libopenssl-ruby1.8 rubygems1.8)rr)rc)rzZpkgsr.r.r/get_ruby_packages~s rc Cs|jt|tjjds*tjd|dtjjdsFtjd|d|rptjdddd|dd d d d g d dntjddddd d d d gd ddS)Nz /usr/bin/gemz/usr/bin/gem%sz /usr/bin/rubyz/usr/bin/ruby%sZinstallrz-v %sz--no-riz --no-rdocz--bindirz/usr/binz-qF)r`)r~rr(r)existsrZsym_linkr)r{rrhr.r.r/r}s6   r})NNN)?__doc__rIrXZloggingr(textwraprZtypingrZ cloudinitrrrrrZcloudinit.cloudr Zcloudinit.configr Zcloudinit.config.schemar r Zcloudinit.distrosr Zcloudinit.settingsrr|rbrHrKrtrur+ZCHEF_ENCRYPTED_DATA_BAG_PATHZCHEF_ENVIRONMENTrUr1 frozensetr7rQrJrWr4rTrZrfr%r$Z getLogger__name__r5metar0r>rOrGr_r\rqrxr[rr}r.r.r.r/ s          #R!