
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼mec8  ã            	   @   sd  U d 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	 ddl
mZmZ ddl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mZmZ ddlm Z  dZ!dgZ"d&Z#dZ$ddde$ege e	dƒe	dƒgdgdœZ%e%ee%ƒZ ej&e'ƒZ(G dd„ dƒZ)ee*dœdd„Z+dd„ Z,e!dddfed œd!d"„Z-e*eee.dd#œd$d%„Z/dS )'z+Puppet: Install, configure and start puppeté    N)Úsuppress)ÚStringIO)Údedent)ÚListÚUnion)ÚhelpersÚsubpÚ
temp_utilsÚ
url_helperÚutil)ÚCloud)ÚConfig)Ú
MetaSchemaÚget_meta_doc)ÚALL_DISTROSÚDistroÚPackageInstallerError)ÚPER_INSTANCEzKhttps://raw.githubusercontent.com/puppetlabs/install-puppet/main/install.shz--testúpuppet-agentÚpuppeta>  This module handles puppet installation and configuration. If the ``puppet``
key does not exist in global configuration, no action will be taken. If a
config entry for ``puppet`` is present, then by default the latest version of
puppet will be installed. If the ``puppet`` config key exists in the config
archive, this module will attempt to start puppet even if no installation was
performed.

The module also provides keys for configuring the new puppet 4 paths and
installing the puppet package from the puppetlabs repositories:
https://docs.puppet.com/puppet/4.2/reference/whered_it_go.html
The keys are ``package_name``, ``conf_file``, ``ssl_dir`` and
``csr_attributes_path``. If unset, their values will default to
ones that work with puppet 3.x and with distributions that ship modified
puppet 4.x that uses the old paths.
Z	cc_puppetZPuppetz#Install, configure and start puppeta`              puppet:
                install: true
                version: "7.7.0"
                install_type: "aio"
                collection: "puppet7"
                aio_install_url: 'https://git.io/JBhoQ'
                cleanup: true
                conf_file: "/etc/puppet/puppet.conf"
                ssl_dir: "/var/lib/puppet/ssl"
                csr_attributes_path: "/etc/puppet/csr_attributes.yaml"
                exec: true
                exec_args: ['--test']
                conf:
                    agent:
                        server: "puppetserver.example.org"
                        certname: "%i.%f"
                    ca_cert: |
                        -----BEGIN CERTIFICATE-----
                        MIICCTCCAXKgAwIBAgIBATANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
                        Fw0xMDAyMTUxNzI5MjFaFw0xNTAyMTQxNzI5MjFaMA0xCzAJBgNVBAMMAmNhMIGf
                        MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu7Q40sm47/E1Pf+r8AYb/V/FWGPgc
                        b014OmNoX7dgCxTDvps/h8Vw555PdAFsW5+QhsGr31IJNI3kSYprFQcYf7A8tNWu
                        1MASW2CfaEiOEi9F1R3R4Qlz4ix+iNoHiUDTjazw/tZwEdxaQXQVLwgTGRwVa+aA
                        qbutJKi93MILLwIDAQABo3kwdzA4BglghkgBhvhCAQ0EKxYpUHVwcGV0IFJ1Ynkv
                        T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwDwYDVR0TAQH/BAUwAwEB/zAd
                        BgNVHQ4EFgQUu4+jHB+GYE5Vxo+ol1OAhevspjAwCwYDVR0PBAQDAgEGMA0GCSqG
                        SIb3DQEBBQUAA4GBAH/rxlUIjwNb3n7TXJcDJ6MMHUlwjr03BDJXKb34Ulndkpaf
                        +GAlzPXWa7bO908M9I8RnPfvtKnteLbvgTK+h+zX1XCty+S2EQWk29i2AdoqOTxb
                        hppiGMp0tT5Havu4aceCXiy2crVcudj3NFciy8X66SoECemW9UYDCb9T5D0d
                        -----END CERTIFICATE-----
                csr_attributes:
                    custom_attributes:
                        1.2.840.113549.1.9.7: 342thbjkt82094y0uthhor289jnqthpc2290
                    extension_requests:
                        pp_uuid: ED803750-E3C7-44F5-BB08-41A04433FE2E
                        pp_image_name: my_ami_image
                        pp_preshared_key: 342thbjkt82094y0uthhor289jnqthpc2290
            zŒ            puppet:
                install_type: "packages"
                package_name: "puppet"
                exec: false
            )ÚidÚnameÚtitleÚdescriptionZdistrosZ	frequencyZexamplesZactivate_by_schema_keysc               @   s   e Zd Zdd„ ZdS )ÚPuppetConstantsc             C   s8   || _ || _tjj|dƒ| _tjj| jdƒ| _|| _d S )NZcertszca.pem)Ú	conf_pathÚssl_dirÚosÚpathÚjoinÚssl_cert_dirÚssl_cert_pathÚcsr_attributes_path)ÚselfZpuppet_conf_fileZpuppet_ssl_dirr"   © r$   ú/usr/lib/python3.6/cc_puppet.pyÚ__init__t   s
    zPuppetConstants.__init__N)Ú__name__Ú
__module__Ú__qualname__r&   r$   r$   r$   r%   r   s   s   r   )ÚcloudÚactionc             C   sd   d}xBt D ]:}y| jj||› d�ƒ |}P W q
 tjk
rB   Y q
X q
W |s`tjd|djt ƒƒ dS )z8Attempts to perform action on one of the puppet servicesÚ z.servicez0Could not '%s' any of the following services: %sz, N)ÚPUPPET_PACKAGE_NAMESÚdistroZmanage_servicer   ZProcessExecutionErrorÚLOGÚwarningr   )r*   r+   Zservice_managedÚpuppet_namer$   r$   r%   Ú_manage_puppet_services�   s    

r2   c             C   s   t j | dd|gƒ\}}|jƒ S )z›Get the config value for a given setting using `puppet config print`
    :param puppet_bin: path to puppet binary
    :param setting: setting to query
    ÚconfigÚprint)r   Úrstrip)Ú
puppet_binZsettingÚoutÚ_r$   r$   r%   Úget_config_value“   s    r9   T)r.   c       	      C   s–   g }|dk	rd|g}|dk	r(|d|g7 }|r6|dg7 }t j|dd�j}tj| jƒ dd��4}tjj|d	ƒ}t	j
||d
d� tj|g| dd�S Q R X dS )a—  Install puppet-agent from the puppetlabs repositories using the one-shot
    shell script

    :param distro: Instance of Distro
    :param url: URL from where to download the install script
    :param version: version to install, blank defaults to latest
    :param collection: collection to install, blank defaults to latest
    :param cleanup: whether to purge the puppetlabs repo after installation
    Nz-vz-cz	--cleanupé   )ÚurlZretriesT)ÚdirZ	needs_exezpuppet-installiÀ  )ÚmodeF)Úcapture)r
   ZreadurlÚcontentsr	   ZtempdirZget_tmp_exec_pathr   r   r   r   Ú
write_filer   )	r.   r;   ÚversionÚ
collectionÚcleanupÚargsZcontentZtmpdZtmpfr$   r$   r%   Úinstall_puppet_aioœ   s    
rE   )r   Úcfgr*   rD   Úreturnc           
   C   s8  d|krt jd| ƒ d S |d }tj|ddƒ}tj|dd ƒ}tj|dd ƒ}tj|ddƒ}tj|d	dƒ}	tj|d
dd�}
tj|ddd�}tj|dtd�}|dkr¬d}d}d}nd}d}d }tj|d|ƒ}| rÜ|rÜt jdƒ nè|�rÄt jd|rð|nd|ƒ |dk�r–|d k�rrxJtD ]B}tt	ƒ�. |�r0||ggn|g}|j
j|ƒ |}P W d Q R X �qW |�s”t jddjtƒƒ n"|�r‚||ggn|g}|j
j|ƒ n.|dk�r´t|j
||||	ƒ nt jd|ƒ d}
tj|dt|dƒƒ}tj|dt|dƒƒ}tj|dt|dƒƒ}t|||ƒ}d |k�rXtj|jƒ}tjƒ }d!d"„ |jƒ D ƒ}d#j|ƒ}|jt|ƒ|jd$� xü|d  jƒ D ]ì\}}|d%k�rÔtj|jd&ƒ tj|j|dƒ tj|jƒ tj|j|dƒ tj|j|ƒ tj|j|dƒ nXxV|jƒ D ]J\}}|d'k�r|jd(tj ƒ ƒ}|jd)|j!ƒ ƒ}|j"ƒ }|j#|||ƒ �qÞW tj$|jd*|j ƒ tj|j|j%ƒ ƒ �qhW d|k�r~tj|j&t'j(|d dd+�ƒ |�rŽt)|d,ƒ |
�r$t jd-ƒ |d.g}d/|k�r|d/ }t*|t+t,fƒ�rÔ|j-|ƒ n6t*|t.ƒ�rð|j-|j/ƒ ƒ nt jd0t0|ƒƒ |j-t1ƒ n
|j-t1ƒ t2j2|dd1� |�r4t)|d2ƒ d S )3Nr   z9Skipping module named %s, no 'puppet' configuration foundÚinstallTrA   rB   Úinstall_typeZpackagesrC   ÚexecF)ÚdefaultZstart_serviceÚaio_install_urlZaioÚrootz/opt/puppetlabs/bin/puppetzpuppet-agentÚpackage_namez@Puppet install set to false but version supplied, doing nothing.z'Attempting to install puppet %s from %sZlatestz+No installable puppet package in any of: %sz, z Unknown puppet install type '%s'Ú	conf_filer3   r   Zssldirr"   Zcsr_attributesZconfc             S   s   g | ]}|j ƒ ‘qS r$   )Úlstrip)Ú.0Úir$   r$   r%   ú
<listcomp>(  s    zhandle.<locals>.<listcomp>Ú
)ÚsourceZca_certiù  Zcertnamez%fz%iz%s.old)Zdefault_flow_styleÚenablezRunning puppet-agentZagentZ	exec_argszOUnknown type %s provided for puppet 'exec_args' expected list, tuple, or string)r>   Ústart)3r/   Údebugr   Zget_cfg_option_boolZget_cfg_option_strÚAIO_INSTALL_URLr0   r-   r   r   r.   Zinstall_packagesr   rE   r9   r   Z	load_filer   r   ZDefaultingConfigParserÚ
splitlinesZ	read_filer   ÚitemsZ
ensure_dirr   Zchownbynamer    r@   r!   ÚreplaceÚsocketZgetfqdnZget_instance_idÚlowerÚsetÚrenameZ	stringifyr"   ÚyamlÚdumpr2   Ú
isinstanceÚlistÚtupleÚextendÚstrÚsplitÚtypeÚPUPPET_AGENT_DEFAULT_ARGSr   ) r   rF   r*   rD   Z
puppet_cfgrH   rA   rB   rI   rC   ZrunZstart_puppetdrL   Zpuppet_userr6   Zpuppet_packagerN   r1   Z
to_installrO   r   r"   Zp_constantsr?   Zpuppet_configZcleaned_linesZcleaned_contentsZcfg_nameÚoÚvÚcmdZcmd_argsr$   r$   r%   ÚhandleÀ   sÜ    


















rn   )r   r   )0Ú__doc__Zloggingr   r]   Ú
contextlibr   Úior   Útextwrapr   Ztypingr   r   ra   Z	cloudinitr   r   r	   r
   r   Zcloudinit.cloudr   Zcloudinit.configr   Zcloudinit.config.schemar   r   Zcloudinit.distrosr   r   r   Zcloudinit.settingsr   rY   rj   r-   ZMODULE_DESCRIPTIONÚmetaZ	getLoggerr'   r/   r   rg   r2   r9   rE   rd   rn   r$   r$   r$   r%   Ú<module>	   sN   '
