
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me7  ã               @   s
  U d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ dZeddddddgƒZedgƒZdZdZdZ dZ!dZ"dZ#ddde dde#ddddddœZ$e%dgƒZ&e%d d!d"d#d$d%d&gƒZ'e%ej(e$j)ƒ e&e'd'd(d)d*d+gƒƒZ*d,Z+d-Z,ed.d/d0d1d2gƒZ-eZ.d3gZ/ej0e1ƒZ2d4d5d6ed7ƒe/ed8ƒge.d9gd:œZ3e3ee3ƒZ d;d<„ Z4d=d>„ Z5e6eee7dd?œd@dA„Z8dBdC„ Z9ee7dDœdEdF„Z:dRedGœdHdI„Z;edJœdKdL„Z<ee6 dMœdNdO„Z=dPdQ„ Z>dS )Sz7Chef: module that configures, starts and installs chef.é    N)Údedent)ÚList)ÚsubpÚ
temp_utilsÚ	templaterÚ
url_helperÚutil)ÚCloud)ÚConfig)Ú
MetaSchemaÚget_meta_doc)ÚDistro)Ú
PER_ALWAYSz1.8z	/etc/chefz/var/log/chefz/var/lib/chefz/var/cache/chefz/var/backups/chefz/var/run/chefz#https://www.chef.io/chef/install.shé   z/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)Zssl_verify_modeZ	log_levelÚlog_locationÚvalidation_keyÚvalidation_certÚ
client_keyÚjson_attribsÚfile_cache_pathZfile_backup_pathÚpid_fileÚ	show_timeÚencrypted_data_bag_secretr   r   r   r   r   r   r   r   Ú
server_urlÚ	node_nameÚenvironmentÚvalidation_nameZchef_licensez/etc/chef/client.rbz/usr/bin/chef-clientz-dz-iZ1800z-sZ20ÚallZcc_chefZChefz0module 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-validatorÚchef)ÚidÚnameÚtitleÚdescriptionÚdistrosZexamplesÚ	frequencyZactivate_by_schema_keysc             C   s.   t j| ddd�}|r*tjjtƒr*tjtƒ d S )NZdelete_validation_post_execF)Údefault)r   Úget_cfg_option_boolÚosÚpathÚisfileÚCHEF_VALIDATION_PEM_PATHÚunlink)Úchef_cfgZ
delete_pem© r.   ú/usr/lib/python3.6/cc_chef.pyÚpost_run_chef˜   s    r0   c             C   s®   t jƒ }xf|jƒ D ]Z\}}|tkr0tjd|ƒ q|d krBd ||< q|tkr\tj||ƒ||< qtj	||ƒ||< qW |j
tjƒ tj	|d| d�tj	|ddd�|d |d dœƒ |S )	Nz'Skipping unknown chef template key '%s'r   )r&   r   r   r   r   )Zgenerated_byr   r   r   r   )ÚCHEF_RB_TPL_DEFAULTSÚcopyÚitemsÚCHEF_RB_TPL_KEYSÚLOGÚdebugÚCHEF_RB_TPL_BOOL_KEYSr   r'   Úget_cfg_option_strÚupdateZmake_header)Úiidr-   ÚparamsÚkÚvr.   r.   r/   Úget_template_params    s&    


r>   )r!   ÚcfgÚcloudÚargsÚreturnc             C   s  d|krt jd| ƒ dS |d }tj|dƒ}|s8ttƒ}xtj|tƒD ]}tj	|ƒ qFW |j
dtƒ}|j
dƒ}|r |dkrˆtj||ƒ ntjj|ƒs t jd|ƒ |jd	ƒ}	|	�rt|jjƒ ƒ}
t|
|ƒ}tƒ }x2|jƒ D ]&\}}|tkoê|rØ|jtjj|ƒƒ qØW tj|ƒ tj|	t|ƒ nt jd
tƒ tj|dt d�}|�sJt j!dƒ nbi }d|k�rd|d |d< d|k�rš|d }x"t|j"ƒ ƒD ]}|| ||< �q„W tj|t#j$|ƒƒ tj%|ddd�}t&j't(ƒ}| �sÔ|�ràt)||ƒ}n|�røtj%|ddd�}nd}|�rt*|ƒ t+|ƒ dS )z'Handler method activated by cloud-init.r   z8Skipping module named %s, no 'chef' key in configurationNZdirectoriesr   r   ÚsystemzWchef validation_cert provided as 'system', but validation_key path '%s' does not exist.zchef_client.rbz&No template found, not rendering to %sZfirstboot_path)r&   z7First boot path empty, not writing first boot json fileZrun_listÚinitial_attributesÚforce_installFÚexec),r5   r6   r   Zget_cfg_option_listÚlistÚ	CHEF_DIRSÚ	itertoolsÚchainÚREQUIRED_CHEF_DIRSZ
ensure_dirÚgetr+   Ú
write_filer(   r)   r*   ÚwarningZget_template_filenameÚstrZ
datasourceZget_instance_idr>   Úsetr3   ÚCHEF_RB_TPL_PATH_KEYSÚaddÚdirnameZensure_dirsr   Zrender_to_fileÚCHEF_RB_PATHr8   ÚCHEF_FB_PATHÚinfoÚkeysÚjsonÚdumpsr'   r   Zis_exeÚCHEF_EXEC_PATHÚinstall_chefÚrun_chefr0   )r!   r?   r@   rA   r-   Z	chef_dirsÚdZ	vkey_pathZvcertZtemplate_fnr:   r;   Zparam_pathsr<   r=   Zfb_filenameZinitial_jsonrD   rE   Z	installedÚrunr.   r.   r/   ÚhandleÃ   sj    






r_   c             C   sˆ   t jdƒ tg}d| krl| d }t|ttfƒr:|j|ƒ qvt|tƒrP|j|ƒ qvt j	dt
|ƒƒ |jtƒ n
|jtƒ tj|dd� d S )NzRunning chef-clientZexec_argumentszRUnknown type %s provided for chef 'exec_arguments' expected list, tuple, or stringF)Úcapture)r5   r6   rZ   Ú
isinstancerG   ÚtupleÚextendrO   ÚappendrN   ÚtypeÚCHEF_EXEC_DEF_ARGSr   )r-   ÚcmdZcmd_argsr.   r.   r/   r\     s    



r\   )ÚdistrorA   c             K   sp   |j ƒ }|jddƒ}tj|jƒ dd��@}tjj||ƒ}|jd|ƒ t	j
|| dd� tjf d|i|—ŽS Q R X d	S )
a  Write 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_exer   iÀ  )ÚmoderA   N)r2   Úpopr   ZtempdirZget_tmp_exec_pathr(   r)   ÚjoinÚinsertr   rM   r   )Úblobrh   rA   Úkwargsri   ZtmpdZtmpfr.   r.   r/   Úsubp_blob_in_tempfile+  s    rq   )rh   c             C   sP   |dkrt }|dkrt}|dkr&g }nd|g}tj||d�j}t| ||ddd�S )ag  Install 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)ÚurlÚretrieszchef-omnibus-installF)rh   ro   rA   ri   r`   )ÚOMNIBUS_URLÚOMNIBUS_URL_RETRIESr   ZreadurlÚcontentsrq   )rh   rr   rs   Úomnibus_versionrA   Zcontentr.   r.   r/   Úinstall_chef_from_omnibus>  s    rx   )r@   c             C   sÆ   t j|ddƒ}t j|ddd�}|dkrbt j|dd ƒ}t j|dtƒ}t||| jƒ t j|dd	d�}n`|dkrz| jjd
gƒ nH|dkr²t j|dƒ}t| jt j|dƒt j|dƒ|d� nt	j
d|ƒ d}|S )NÚinstall_typeZpackagesrF   F)r&   ZgemsÚversionÚruby_versionTr   Zomnibusrw   Zomnibus_urlZomnibus_url_retries)rh   rr   rs   rw   zUnknown chef install type '%s')r   r8   r'   ÚRUBY_VERSION_DEFAULTÚinstall_chef_from_gemsrh   Úinstall_packagesrx   Zget_cfg_option_intr5   rN   )r@   r-   ry   r^   Úchef_versionr{   rw   r.   r.   r/   r[   ]  s*    




r[   )rB   c             C   s&   d|  d|  g}| dkr"|j dƒ |S )Nzruby%sz
ruby%s-devz1.8úlibopenssl-ruby1.8úrubygems1.8)r€   r�   )rc   )rz   Zpkgsr.   r.   r/   Úget_ruby_packages~  s    
r‚   c          
   C   s’   |j t| ƒƒ tjjdƒs*tjd|  dƒ tjjdƒsFtjd|  dƒ |rptjdddd| dd	d
ddg	dd� ntjddddd	d
ddgdd� d S )Nz/usr/bin/gemz/usr/bin/gem%sz/usr/bin/rubyz/usr/bin/ruby%sZinstallr   z-v %sz--no-riz	--no-rdocz--bindirz/usr/binz-qF)r`   )r~   r‚   r(   r)   Úexistsr   Zsym_linkr   )r{   r   rh   r.   r.   r/   r}   †  s6    
r}   )NNN)?Ú__doc__rI   rX   Zloggingr(   Útextwrapr   Ztypingr   Z	cloudinitr   r   r   r   r   Zcloudinit.cloudr	   Zcloudinit.configr
   Zcloudinit.config.schemar   r   Zcloudinit.distrosr   Zcloudinit.settingsr   r|   rb   rH   rK   rt   ru   r+   ZCHEF_ENCRYPTED_DATA_BAG_PATHZCHEF_ENVIRONMENTrU   r1   Ú	frozensetr7   rQ   rJ   rW   r4   rT   rZ   rf   r%   r$   Z	getLoggerÚ__name__r5   Úmetar0   r>   rO   rG   r_   r\   rq   rx   r[   r‚   r}   r.   r.   r.   r/   Ú<module>	   sª   


	#R!