U 'Dg@slUdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z ddlmZddlmZddlmZdd lmZmZdd lmZdd lmZd eegd gdZeed<eeZdZ Gdddej!Z"Gddde"Z#Gddde"Z$e%eee&ddddZ'e(dddZ)e(e(dddZ*e"e(d d!d"Z+e(e"d#d$d%Z,e(e"d#d&d'Z-dS)(z9ansible enables running on first boot either ansible-pullN)deepcopy)Optional) lifecyclesubp)Cloud)Config) MetaSchema) ALL_DISTROSDistro) PER_INSTANCE)get_cfg_by_pathZ cc_ansibleansible)idZ frequencyZdistrosZactivate_by_schema_keysmetaansible_configc@s|eZdZedddZeejdddZe dddZ d d Z e d d d Z ddZejddZeje dddZdS) AnsiblePull)distrocCs<dg|_ddg|_||_i|_d|_tjdd|jd<dS)Nz ansible-pullz --versionHOMEz/root)cmd_pull cmd_versionrenvrun_userosenvironget)selfrr=/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py__init__ s  zAnsiblePull.__init__returncCsH||j\}}|d}td|}|rD|d}tj |SdS)Nrz ([\d\.]+)) do_asr splitlinespopresearchgrouprVersionZfrom_str)rstdout_Z first_lineZmatchesversionrrr get_version+s   zAnsiblePull.get_versioncGs||j|\}}|SN)r!r)rargsr(r)rrrpull4szAnsiblePull.pullcCs|stddS)Nz!command: ansible is not installed) is_installed ValueErrorrrrr check_deps8szAnsiblePull.check_deps)commandcKs(|js|j|f|S|jj||jf|Sr,)rrrr!rr3kwargsrrrr!<szAnsiblePull.do_ascKstj|fd|ji|S)NZ update_env)rrr4rrrrAszAnsiblePull.subpcCsdSr,rr1rrrr/DszAnsiblePull.is_installedpkg_namecCsdSr,rrr7rrrinstallHszAnsiblePull.installN)__name__ __module__ __qualname__r rrrr'r+strr.r2listr!rabcabstractmethodr/r9rrrrrs   rcsDeZdZeeedfdd ZedddZeddd Z Z S) AnsiblePullPip)rusercsft|||_|tjddg\}}|d}|jd}|rXd||g|jd<n ||jd<dS)Nz-cz('import site; print(site.getuserbase())'z/bin/PATH:) superrrr!sys executablerrjoin)rrrB user_baser)Z ansible_pathZold_path __class__rrrNs    zAnsiblePullPip.__init__r6cCs|sz ddl}Wn&tk r:|j|jjgYnXtjdddg}tj tj t ddrp|d|jr|d ||d |||fdS) zishould cloud-init grow an interface for non-distro package managers? this seems reusable rN-mpipr9ZstdlibzEXTERNALLY-MANAGEDz--break-system-packagesz--user --upgrade)rNrM)r/rM ImportErrorrinstall_packagesZpip_package_namerFrGrpathexistsrH sysconfigZget_pathappendrr!)rr7rMcmdrrrr9]s*   zAnsiblePullPip.installrcCs |tjdddg\}}d|kS)NrLrMr>r )r!rFrG)rr(r)rrrr/xszAnsiblePullPip.is_installed) r:r;r<r rr=rr9boolr/ __classcell__rrrJrrAMsrAc@s(eZdZedddZedddZdS)AnsiblePullDistror6cCs|s|j|gdSr,)r/rrPr8rrrr9~szAnsiblePullDistro.installrcCsttdS)Nr )rVrZwhichr1rrrr/szAnsiblePullDistro.is_installedN)r:r;r<r=r9rVr/rrrrrX}srX)namecfgcloudr-r cCs|di}|d}|d}|d}|d}|d} |dd} |rt||j} |d krpt| |} nt| } | | | |d d} | r| | jt<|rt || | rt | t | |rt || dS) Nr rinstall_methodsetup_controllerZgalaxyr. package_namerMr) rvalidate_configrrArXr9r2r CFG_OVERRIDEansible_galaxyrun_ansible_pullransible_controller)rYrZr[r-Z ansible_cfgZ ansible_userr\r]Z galaxy_cfgZpull_cfgr^rr rrrrhandles0            rerZcCsd}|D]"}t||std|d|q|dr^dD]"}t||s:td|d|q:|d}|rt|d|dgstd ||d }|d krtd dS) N)r\r^zMissing required key 'z' from r.)zpull/urlzpull/playbook_namer] repositories run_ansiblezMissing required key from r\)rMrz Invalid install method {install})r r0rany)rZZ required_keyskeyZcontroller_cfgr9rrrr`s&    r`)rZr cCsdd|DS)zremove boolean false valuescSs&i|]\}}|dk r|dd|qS)Fr)-)replace.0rjvaluerrr s zfilter_args..)itemsrfrrr filter_argssrr)r.rZcCs|d}|}|s"tdn>|tdddkr`|dr`td|jd|j d|j d |j d d t | D|f}|rtj|dS) N playbook_namezCannot parse ansible versionrZdiffzAnsible version .z%doesn't support --diff flag, exiting.cSs2g|]*\}}|dk r$d|d|nd|qS)T--=rrmrrr sz$run_ansible_pull..)r#r+LOGwarningrr'rr0majorminorZpatchr.rrrqrFr(write)r.rZrsvr(rrrrcs"    rc)rZr cCs4|dg}|std||D]}||q dS)NactionszInvalid config: %s)rrzr{r!)rZr rr3rrrrbs   rbcCs|dgD]}|dd|d|dgq |dgD]D}|d}|d}d |fd d t|D}|j||d q8dS) NrgZgitZclonesourcerQrh playbook_dirrszansible-playbookcSs g|]\}}d|d|qS)rwrxrrmrrrrysz&ansible_controller..)cwd)rr!r#rrrq)rZr Z repositoryr-rrsr3rrrrds  rd).__doc__r?Zloggingrr$rFrScopyrtypingrZ cloudinitrrZcloudinit.cloudrZcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosr r Zcloudinit.settingsr Zcloudinit.utilr r__annotations__Z getLoggerr:rzraABCrrArXr=r>redictr`rrrcrbrdrrrrs>        .0 %