HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-10-0-8-47 6.8.0-1021-aws #23~22.04.1-Ubuntu SMP Tue Dec 10 16:31:58 UTC 2024 aarch64
User: ubuntu (1000)
PHP: 8.1.2-1ubuntu2.22
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/cloudinit/config/__pycache__/cc_ansible.cpython-310.pyc
o

�Adx!�@s�UdZddlZddlZddlZddlZddlmZddlmZm	Z	ddl
mZddlm
Z
ddlmZddlmZdd	lmZmZdd
lmZmZddlmZddlmZmZdd
lmZmZdddeegdged�ed�ed�gd�Z ee!d<ee �Ze	e"�Z#dZ$Gdd�dej%�Z&Gdd�de&�Z'Gdd�de&�Z(de)ded ed!ed"e*d#dfd$d%�Z+de,fd&d'�Z-de,d#e,fd(d)�Z.d*e&de,fd+d,�Z/de,de&fd-d.�Z0de,de&fd/d0�Z1dS)1z9ansible enables running on first boot either ansible-pull�N)�deepcopy)�Logger�	getLogger)�dedent)�Optional)�Cloud)�Config)�
MetaSchema�get_meta_doc)�ALL_DISTROS�Distro)�PER_INSTANCE)�subp�which)�Version�get_cfg_by_path�
cc_ansible�AnsiblezConfigure ansible for instance�ansiblea        This module provides ``ansible`` integration for
        augmenting cloud-init's configuration of the local
        node.


        This module installs ansible during boot and
        then uses ``ansible-pull`` to run the playbook
        repository at the remote URL.
        z�            ansible:
              install_method: distro
              pull:
                url: "https://github.com/holmanb/vmboot.git"
                playbook_name: ubuntu.yml
            z�            ansible:
              package_name: ansible-core
              install_method: pip
              pull:
                url: "https://github.com/holmanb/vmboot.git"
                playbook_name: ubuntu.yml
            )�id�name�title�	frequency�distros�activate_by_schema_keys�description�examples�meta�ansible_configc@szeZdZdefdd�Zdeefdd�Zdefdd�Z	d	d
�Z
defdd
�Zdd�Z
ejdd��Zejdefdd��ZdS)�AnsiblePull�distrocCs>dg|_ddg|_||_tj|_d|_|j�dd�|jd<dS)Nzansible-pullz	--version�HOMEz/root)�cmd_pull�cmd_versionr �os�environ�env�run_user�get)�selfr �r*�=/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py�__init__Cs
zAnsiblePull.__init__�returncCsF|�|j�\}}|���d�}t�d|�}|r!|�d�}t�|�SdS)Nrz	([\d\.]+))	�do_asr#�
splitlines�pop�re�search�groupr�from_str)r)�stdout�_�
first_line�matches�versionr*r*r+�get_versionNs

zAnsiblePull.get_versioncGs|�g|j�|��\}}|S�N)r.r")r)�argsr5r6r*r*r+�pullWszAnsiblePull.pullcCs|��std��dS)Nz!command: ansible is not installed)�is_installed�
ValueError�r)r*r*r+�
check_deps[s�zAnsiblePull.check_deps�commandcKs0|js|j|fi|��S|jj||jfi|��Sr;)r'rr r.�r)rB�kwargsr*r*r+r._szAnsiblePull.do_ascKst|fd|ji|��S)Nr&)rr&rCr*r*r+rdszAnsiblePull.subpcC�dSr;r*r@r*r*r+r>g�zAnsiblePull.is_installed�pkg_namecCrEr;r*�r)rGr*r*r+�installkrFzAnsiblePull.installN)�__name__�
__module__�__qualname__rr,rrr:�strr=rA�listr.r�abc�abstractmethodr>rIr*r*r*r+rBs	
rcsFeZdZdedeef�fdd�Zdefdd�Zdefd	d
�Z	�Z
S)�AnsiblePullPipr �usercsht��|�||_|�tjddg�\}}|�d�}|j�d�}|r-d�||g�|jd<dS||jd<dS)Nz-cz('import site; print(site.getuserbase())'z/bin/�PATH�:)	�superr,r'r.�sys�
executabler&r(�join)r)r rR�	user_baser6�ansible_path�old_path��	__class__r*r+r,qs
�
zAnsiblePullPip.__init__rGcCs�|��sAzddl}Wnty|j�|jj�Ynwtjdddg}|jr+|�	d�|�
g|�d�d��|�
g|�|��dSdS)zishould cloud-init grow an interface for non-distro package
        managers? this seems reusable
        rN�-m�piprIz--userz	--upgrade)r>r_�ImportErrorr �install_packages�pip_package_namerVrWr'�appendr.)r)rGr_�cmdr*r*r+rI�s�
�zAnsiblePullPip.installr-cCs |�tjdddg�\}}d|vS)Nr^r_rNr)r.rVrW)r)r5r6r*r*r+r>�szAnsiblePullPip.is_installed)rJrKrLrrrMr,rI�boolr>�
__classcell__r*r*r\r+rQpsrQc@s(eZdZdefdd�Zdefdd�ZdS)�AnsiblePullDistrorGcCs|��s|j�|�dSdSr;)r>r rarHr*r*r+rI�s�zAnsiblePullDistro.installr-cCsttd��S)Nr)rerr@r*r*r+r>�szAnsiblePullDistro.is_installedN)rJrKrLrMrIrer>r*r*r*r+rg�srgr�cfg�cloud�logr<r-cCs�|�di�}|�d�}|�d�}|�d�}|�d�}	|�d�}
|�dd�}|rkt|�|j}|d	kr8t||�}
nt|�}
|
�|�|
��|�d
d�}|rR||
jt<|	rYt	|	|
�|
rbt
|
t|
��|rmt||
�dSdSdS)Nrr'�install_method�setup_controller�galaxyr=�package_name�r_r)
r(�validate_configr rQrgrIrAr&�CFG_OVERRIDE�ansible_galaxy�run_ansible_pullr�ansible_controller)rrhrirjr<�ansible_cfg�ansible_userrkrl�
galaxy_cfg�pull_cfgrnr rrr*r*r+�handle�s4







�rycCs�d}|D]}t||�std|�d|����q|�d�r/dD]}t||�s.td|�d|����q|�d�}|rIt|�d�|�d�g�sItd	|����|d
}|dvrUtd��dS)
N)rkrnzMissing required key 'z' from r=)zpull/urlzpull/playbook_namerl�repositories�run_ansiblezMissing required key from rk)r_r z Invalid install method {install})rr?r(�any)rh�
required_keys�key�controller_cfgrIr*r*r+rp�s,
�

�
���rpcCsdd�|��D�S)zremove boolean false valuescSs&i|]\}}|dur|�dd�|�qS)Fr6�-)�replace��.0r~�valuer*r*r+�
<dictcomp>�s��zfilter_args.<locals>.<dictcomp>)�items)rhr*r*r+�filter_args�s�r�r=cCs�|�d�}|��}|st�d�n|tddd�kr/|�d�r/td|j�d|j�d|j	�d	���|j
gd
d�t|���D��|�R�}|rMt
j�|��dSdS)N�
playbook_namezCannot parse ansible version��r�diffzAnsible version �.z%doesn't support --diff flag, exiting.cSs2g|]\}}|durd|�d|��nd|���qS)T�--�=r*r�r*r*r+�
<listcomp>�s ��z$run_ansible_pull.<locals>.<listcomp>)r0r:�LOG�warningrr(r?�major�minor�patchr=r�r�rVr5�write)r=rhr��vr5r*r*r+rs�s&

�
����rscCs4|�dg�}|st�d|�|D]}|�|�qdS)N�actionszInvalid config: %s)r(r�r�r.)rhrr�rBr*r*r+rrs�rrcCs�|�dg�D]}|�dd|d|dg�q|�dg�D]"}|�d�}|�d�}d	|gd
d�t|���D��}|j||d�qdS)
Nrz�git�clone�source�pathr{�playbook_dirr�zansible-playbookcSs g|]\}}d|�d|���qS)r�r�r*r�r*r*r+r�s z&ansible_controller.<locals>.<listcomp>)�cwd)r(r.r0r�r�)rhr�
repositoryr<r�r�rBr*r*r+rts�

���rt)2�__doc__rOr$r1rV�copyr�loggingrr�textwrapr�typingr�cloudinit.cloudr�cloudinit.configr�cloudinit.config.schemar	r
�cloudinit.distrosrr�cloudinit.settingsr
�cloudinit.subprr�cloudinit.utilrrr�__annotations__rJr�rq�ABCrrQrgrMrNry�dictrpr�rsrrrtr*r*r*r+�<module>sr�
�	���*.%	�����
�'