jenkins에서 아래와 같은 Exception이 발생했다.


sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

PKIX path building failed 




원인은 http 사이트에서 https 로 접속하려 할 때 자바에서 발생하는 에러이다. 이를 간단히 해결하려면


젠킨스 관리 -> Configure Global Security -> Plugin Manager -> Use browser for metadata download 를 체크 on한다.


앤서블을 사용해 자동화하는 경우라면 다음 코드를 실행한다. https가 아닌 http로 변경하는 것이다.


- name: Change Update-Center protocol - "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"

  replace:

    path: "{{ jenkins_home }}/hudson.model.UpdateCenter.xml"

    regexp: 'https://updates.jenkins.io/update-center.json'

    replace: 'http://updates.jenkins.io/update-center.json'


Posted by '김용환'
,



무척 간결한 앤서블의 jenkins_script  모듈이다.

혹시 젠킨스에서 암호 없이 접근한데 4xx 에러가 난다면. 이는 분명 proxy 이슈이다.



https://github.com/ansible/ansible/pull/19640/files


from ansible.module_utils.basic import AnsibleModule

from ansible.module_utils.urls import fetch_url

try:

    # python2

    from urllib import urlencode

except ImportError:

    # python3

    from urllib.parse import urlencode


def main():


    module = AnsibleModule(

        argument_spec = dict(

            script = dict(required=True, type="str"),

            url   = dict(required=False, type="str", default="http://localhost:8080"),

            validate_certs = dict(required=False, type="bool", default=True),

            user   = dict(required=False, no_log=True, type="str",default=None),

            password   = dict(required=False, no_log=True, type="str",default=None),

            args   = dict(required=False, type="dict", default=None)

        )

    )



    if module.params['user'] is not None:

        if module.params['password'] is None:

            module.fail_json(msg="password required when user provided")

        module.params['url_username'] = module.params['user']

        module.params['url_password'] = module.params['password']

        module.params['force_basic_auth'] = True



    if module.params['args'] is not None:

        from string import Template

        script_contents = Template(module.params['script']).substitute(module.params['args'])

    else:

        script_contents = module.params['script']



    resp, info = fetch_url(module,

                           module.params['url'] + "/scriptText",

                           data=urlencode({'script': script_contents}),

                           method="POST")


    if info["status"] != 200:

        module.fail_json(msg="HTTP error " + str(info["status"]) + " " + info["msg"])


    result = resp.read()


    if 'Exception:' in result and 'at java.lang.Thread' in result:

        module.fail_json(msg="script failed with stacktrace:\n " + result)


    module.exit_json(

        output = result,

    )




if __name__ == '__main__':

    main()


Posted by '김용환'
,

앤서블로 jenkins 플러그인 목록을 웹이 아닌 API 형태로 출력하려면 다음과 같이 호출할 수 있다.


- name : get plugins
environment:
no_proxy: "localhost"
uri:
url: "http://localhost:8080/scriptText"
method: POST
return_content: yes
HEADER_Content-Type: "application/json"
body: "println(Jenkins.instance.pluginManager.plugins)"


Posted by '김용환'
,


DNS는 하나 이상의 레코드를 호스트 이름과 연결해 동작한다. 가장 일반적으로 사용되는 DNS 레코드 타입은 A 레코드와 CNAME 레코드다. A 레코드는 호스트 이름을 IP 주소에 연결하는 것이고, CNAME 레코드는 호스트 이름을 다른 호스트 이름으로 앨리어스로 지정한 것을 말한다.

DNS 프로토콜은 TXT 레코드라는 호스트 이름과 연결할 수 있는 다른 타입의 레코드를 지원한다. TXT 레코드는 호스트 이름에 연결할 수 있는 임의의 문자열이다. TXT 레코드를 호스트 이름과 연결하면 누구나 DNS 클라이언트를 사용해 텍스트를 검색할 수 있다.


예를 들어 github.com 도메인을 소유하고 있기에 해당 도메인의 모든 호스트 이름과 관련된 TXT 레코드를 생성할 수 있다. TXT 레코드를 이 책의 ISBN 번호가 포함된 github.com 호스트 이름과 연결했다. 

dig 커맨드라인 툴을 사용해 TXT 레코드를 조회할 수 있다.

$ dig +short github.com TXT

"MS=ms44452932"

"docusign=087098e3-3d46-47b7-9b4e-8a23028154cd"

"v=spf1 ip4:192.30.252.0/22 ip4:208.74.204.0/22 ip4:46.19.168.0/23 include:_spf.google.com include:esp.github.com include:_spf.createsend.com include:servers.mcsv.net ~all"

"MS=6BF03E6AF5CB689E315FB6199603BABF2C88D805"

"MS=ms58704441"



dnstxt 조회는 DNS 서버에 호스트와 관련된 TXT 레코드를 쿼리한다. 플레이북에서 이와 같은 태스크를 생성한다.


- name: look up TXT record

debug: msg="{{ lookup('dnstxt', 'github.com') }}"






Posted by '김용환'
,