܍~c! UdZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m Z ddlmZddlmZdd lmZmZdd lmZmZdd lmZdd lmZmZdd lmZmZdddeegdge de de dgdZ ee!d<ee Ze e"Z#dZ$Gddej%Z&Gdde&Z'Gdde&Z(de)ded ed!ed"e*d#df d$Z+de,fd%Z-de,d#e,fd&Z.d'e&de,fd(Z/de,de&fd)Z0de,de&fd*Z1dS)+z9ansible enables running on first boot either ansible-pullN)deepcopy)Logger getLogger)dedent)Optional)Cloud)Config) MetaSchema get_meta_doc) ALL_DISTROSDistro) PER_INSTANCE)subpwhich)Versionget_cfg_by_path cc_ansibleAnsiblezConfigure ansible for instanceansiblea 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 )idnametitle frequencydistrosactivate_by_schema_keys descriptionexamplesmetaansible_configceZdZdefdZdeefdZdefdZ dZ de fdZ d Z ejd Zejd efd Zd S) AnsiblePulldistrocdg|_ddg|_||_tj|_d|_|jdd|jd<dS)Nz ansible-pullz --versionHOMEz/root)cmd_pull cmd_versionr"osenvironenvrun_userget)selfr"s =/usr/lib/python3/dist-packages/cloudinit/config/cc_ansible.py__init__zAnsiblePull.__init__CsT'( *K8 :'+  8<<88returnc||j\}}|d}t jd|}|r)|d}tj|SdS)Nrz ([\d\.]+)) do_asr& splitlinespopresearchgrouprfrom_str)r,stdout_ first_linematchesversions r- get_versionzAnsiblePull.get_versionNsyJJt/00 &&((,,Q// )L*55  -mmA&&G#G,, ,tr/cH|g|j|\}}|SN)r2r%)r,argsr9r:s r-pullzAnsiblePull.pullWs)JJ66677  r/cL|stddS)Nz!command: ansible is not installed) is_installed ValueErrorr,s r- check_depszAnsiblePull.check_deps[s2  "" B@AA A B Br/commandc ^|js|j|fi|S|jj||jfi|Sr@)r*rr"r2r,rHkwargss r-r2zAnsiblePull.do_as_sG} 049W//// / t{ $-BB6BBBr/c *t|fd|ji|S)Nr))rr)rJs r-rzAnsiblePull.subpdsG444V444r/cdSr@rFs r-rDzAnsiblePull.is_installedg r/pkg_namecdSr@rNr,rPs r-installzAnsiblePull.installkrOr/N)__name__ __module__ __qualname__r r.rrr>strrBrGlistr2rabcabstractmethodrDrSrNr/r-r!r!Bs 9v 9 9 9 9Xg.SBBBCTCCCC 555            r/r!cLeZdZdedeeffd ZdefdZdefdZ xZ S)AnsiblePullPipr"userc:t|||_|tjddg\}}|d}|jd}|r!d||g|jd<dS||jd<dS)Nz-cz('import site; print(site.getuserbase())'z/bin/PATH:) superr.r*r2sys executabler)r+join)r,r"r] user_baser: ansible_pathold_path __class__s r-r.zAnsiblePullPip.__init__qs     zz ^T#M N  1$*** 8<<''  ,"xx<(@AADHV   +DHV   r/rPcf|s ddl}n4#t$r'|j|jjYnwxYwt jdddg}|jr| d| g|dd| g||dSdS)zishould cloud-init grow an interface for non-distro package managers? this seems reusable rN-mpiprSz--userz --upgrade) rDrk ImportErrorr"install_packagespip_package_namerbrcr*appendr2)r,rPrkcmds r-rSzAnsiblePullPip.installs  "" ) K  K K K ,,T[-IJJJJJ K>4 :C} % 8$$$ JJ11k151 2 2 2 JJ''h' ( ( ( ( ( ) )s.A  A r0cV|tjdddg\}}d|vS)NrjrkrXr)r2rbrc)r,r9r:s r-rDzAnsiblePullPip.is_installeds-JJeVDEE F""r/) rTrUrVr rrWr.rSboolrD __classcell__)rhs@r-r\r\ps ,v ,Xc] , , , , , ,))))) #d########r/r\c&eZdZdefdZdefdZdS)AnsiblePullDistrorPcf|s|j|dSdSr@)rDr"rmrRs r-rSzAnsiblePullDistro.installs<  "" 3 K ( ( 2 2 2 2 2 3 3r/r0c:ttdS)Nr)rrrrFs r-rDzAnsiblePullDistro.is_installedsE)$$%%%r/N)rTrUrVrWrSrrrDrNr/r-rurusJ33333&d&&&&&&r/rurcfgcloudlogrAr0c|di}|d}|d}|d}|d} |d} |dd} |rt||j} |d krt| |} nt | } | | | |d d}|r|| jt<| rt| | | rt| t| |rt|| dSdSdS) Nrr*install_methodsetup_controllergalaxyrB package_namerkr) r+validate_configr"r\rurSrGr) CFG_OVERRIDEansible_galaxyrun_ansible_pullransible_controller)rrxryrzrA ansible_cfg ansible_userr|r} galaxy_cfgpull_cfgrr"rrs r-handlers 2..K??:..L __%566N"'9::**Jv&&H??>266L: $$$ U " "$V\::GG'//G %%%$)92>>  7(6GK %  0 :w / / /  : Whx&8&8 9 9 9  : / 9 9 9 9 9/::, : :r/cd}|D]'}t||std|d|(|dr*dD]'}t||std|d|(|d}|rIt|d|dgstd ||d }|d vrtd dS) N)r|rzMissing required key 'z' from rB)zpull/urlzpull/playbook_namer} repositories run_ansiblezMissing required key from r|)rkr"z Invalid install method {install})rrEr+any)rx required_keyskeycontroller_cfgrSs r-rrsNMIIsC(( IGcGG#GGHH H I wwvM3 M MC"3,, M !K#!K!Kc!K!KLLL MWW/00NL"">22""=11    L J.JJKK K"#G''';<<<('r/c>d|DS)zremove boolean false valuescJi|] \}}|du |dd|!S)Fr:-)replace.0rvalues r- zfilter_args..sA    S%    Cu   r/)items)rxs r- filter_argsrs+  IIKK   r/rBc |d}|}|stdnR|t dddkr=|dr(t d|jd|jd|j d |j gd t| D|R}|r"tj|dSdS) N playbook_namezCannot parse ansible versionrdiffzAnsible version .z%doesn't support --diff flag, exiting.c6g|]\}}|durd|d|nd|S)T--=rNrs r- z$run_ansible_pull..sR   U#(t"3"3   u   c   r/)r4r>LOGwarningrr+rEmajorminorpatchrBrrrbr9write)rBrxrvr9s r-rrs<11M A  23333 WQ1     776?? 81788QW88qw888 TY  )#..4466     F& F%%%%%&&r/c|dg}|std||D]}||dS)NactionszInvalid config: %s)r+rrr2)rxrrrHs r-rrs`ggi$$G / (#... gr/c|dgD]'}|dd|d|dg(|dgD]r}|d}|d}d |gd t|D}||| sdS) Nrgitclonesourcepathr playbook_dirrzansible-playbookc$g|] \}}d|d|S)rrrNrs r-rz&ansible_controller..s- M M MZS% 3    M M Mr/)cwd)r+r2r4rr)rxr repositoryrArrrHs r-rr sggnb11   GZ1:f3E F     r**11xx// 11   N M;t3D3D3J3J3L3L M M M   g< 000011r/)2__doc__rYr'r5rbcopyrloggingrrtextwraprtypingrcloudinit.cloudrcloudinit.configr cloudinit.config.schemar r cloudinit.distrosr r cloudinit.settingsrcloudinit.subprrcloudinit.utilrrr__annotations__rTrrABCr!r\rurWrXrdictrrrrrrNr/r-rs*??? %%%%%%%%!!!!!!######<<<<<<<<11111111++++++&&&&&&&&33333333   -} ){6          '((j(((T ,t  i + + + + + #'+ + + \"#"#"#"#"#["#"#"#J&&&&& &&&$: $:$:#($:/5$:=A$: $:$:$:$:N=====8Td&;&T&&&&0{ 1D 1; 1 1 1 1 1 1r/