Ansible의 slack 모듈을 사용할 때 필요한 "token"으로 빠진 이야기 외 [token/토큰의 ​​취급과 변수의 default값 등]

소개



Ansible의 slack 모듈에서 slack에 알릴 때 토큰 설정에 오류가 발생했습니다.
이 기사에서는 오류 내용과 문제 해결을 공유합니다.

환경/버전 정보


  • Ubuntu19.04 (Disco Dingo) (로컬)
  • ansible 2.9.1
  • python version = 2.7.16 (default, Oct 7 2019, 17:36:04) [GCC 8.3.0]


  • 오류 메시지



    토큰 값이 잘못되었음을 지적했습니다.
    TASK [Use the attachments API] **********************************************************************
    fatal: [localhost]: FAILED! => {"changed": false, "msg": "Slack has updated its webhook API.  You need to specify a token of the form XXXX/YYYY/ZZZZ in your playbook"}
    
    

    ※여기서 사용하고 있던 token은 slack에서 bot를 만들 때 생성되는 xoxb로 시작하는 문자열입니다.
    gkz@localhost ~$ tail ~/.bashrc | grep SLACKBOT_TOKEN
    export SLACKBOT_TOKEN='xoxb-xxx'
    
    

    올바른 토큰



    slack의 incoming webhook url의 services/에서 뒤의 xxxx/yyyy/zzzz입니다.

    htps // // 뽀오 ks. scck. 코 m / 세 r
    gkz@localhost ~$ cat ~/.bashrc | grep SLACKFORMAT
    export INCOMING_WEBHOOK_URL_SLACKFORMAT='xxxx/yyyy/zzzz'
    
    

    ※incoming webhook url의 취득 장소
    htps : // 아피. scck. 코 m / 아 ps / $ {아 p_이 D} / 닌코 민 g ぇ b 호오 ks


    참고: reddit QA

    You need to copy token from webhook url (open webhook settings and you will see it). In fact, token is just part of url

    Slack Usage with Ansible? Token error etc.

    참고: 소스 코드 주석

    token:
    description:
    - Slack integration token. (전략) In 1.8 and above, ansible adapts to the new slack API where tokens look like C webhook tokens.

    ansible/slack.py at devel · ansible/ansible

    무사히 Ansible의 play-book에서 slack에게 메시지를 보낼 수 있었습니다.



    위와 같이 slack에게 스마트한 메시지를 보내기까지 고생한 점이 몇 가지 있었으므로, 소화로서 다루겠습니다.
    - 토큰/토큰은 환경 변수로 취급한다
    - 변수에 default 값을 채택
    - attachments 옵션의 short가 False인 경우, title와 value 하나 하나는 접히지 않는다

    playbook은 이런 느낌입니다. ↓↓
    ---
    - hosts: all
      connection: local
      gather_facts: no
      become: no
    
      tasks:
        - shell: ping -c 5 -w 5 localhost
          register: result_shell
          failed_when: >
              ("No such file or directory" in result_shell.stdout) or
              (result_shell.stderr != '') or
              (result_shell.rc == 10)
          changed_when: false
    
        - name: debug result_shell.stdout
          debug:
            msg: "{{ result_shell.stdout | default('None', true) }}"
        - name: debug result_shell.stderr
          debug:
            msg: "{{ result_shell.stderr | default('None', true) }}"
    
        - name: Use the attachments API
          slack:
            username: "{{ lookup('env', 'SLACKBOT_NAME') | default('ansibleBot')  }}"
            token: "{{ lookup('env', 'INCOMING_WEBHOOK_URL_SLACKFORMAT') }}"
            channel: "{{ lookup('env', 'DST_CHANNEL') }}"
            attachments:
              - title: Display Result Ping Communicate
                text: "{{ inventory_hostname }}"
                color: "#ff00dd"
                fields:
                  - title: "[STDOUT] Ping Communicate"
                    value: "{{ result_shell.stdout | default('None', true)}}"
                    #short: True
                    short: False
                  - title: "[STDERR] Ping Communicate"
                    value: "{{ result_shell.stderr | default('None', true)}}"
                    #short: True
                    short: False
    
    

    token/토큰은 환경 변수로 취급한다



    token이나 투고처 등 호스트(Ansible 서버)에서 지정하는 값이나 playbook에 공개하고 싶지 않은 값은 환경 변수로 건네주는 것이 베터가 아닐까 생각합니다.
    username: "{{ lookup('env', 'SLACKBOT_NAME') }}"
    

    참고 : env – read the value of environment variables — Ansible Documentation

    ※환경 변수의 참조처가 호스트(Ansible 서버)가 아니라 타겟(Ansible의 설정처)인 경우, ansible_env를 사용하면 좋을 것 같습니다.

    참고 : [Ansible] 환경 변수를 얻는 ansible_env.hoge와 lookup("env", "hoge")의 차이점

    변수에 default 값을 채택



    변수에 default 값을 채택할 수 있지만 true로 작성해야 하는 경우에는 그렇지 않은 경우가 있습니다.
  • 변수가 정의되지 않은 경우 default(hogehoge) 및 true는 필요하지 않습니다.
  • 사용 사례 : Ansible 서버가 환경 변수로 정의되어 있는지 확인할 수없는 경우

  • username: "{{ lookup('env', 'SLACKBOT_NAME') | default('ansibleBot')  }}"
    

  • 정의된 변수의 값이 Color, False이면 default('hogehoge', true) 및 true가 필요합니다.
  • 유스 케이스 : 디버깅 할 값이 컬러 인 경우 컬러라고 명시하는 경우

  • fields:
        - title: "[STDERR] Ping Communicate"
          value: "{{ result_shell.stderr | default('None', true)}}"
          #short: True
          short: False
    

    참고 : Filters — Ansible Documentation

    attachments 옵션의 short가 False이면 title 및 value 하나는 접히지 않습니다.


        - name: Use the attachments API
          slack:
            username: "{{ lookup('env', 'SLACKBOT_NAME') }}"
            token: "{{ lookup('env', 'INCOMING_WEBHOOK_URL_SLACKFORMAT') }}"
            channel: "{{ lookup('env', 'DST_CHANNEL') }}"
            attachments
              - title: Display Result Ping Communicate
                text: "{{ inventory_hostname }}"
                color: "#ff00dd"
                fields:
                  - title: "[STDOUT] Ping Communicate"
                    value: "{{ result_shell.stdout | default('None', True)}}"
                    short: True
                    #short: False
                  - title: "[STDERR] Ping Communicate"
                    value: "{{ result_shell.stderr | default('None', True)}}"
                    short: True             ##title/valueで定義された値は複数列で記載(値は折返す)
                    #short: False          ##title/valueで定義された値は1列で記載(値は折返さない)
    
    



    참고 : Attaching content and links to messages | Slack

    샘플 코드



    Sample Ansible Playbook

    P.S. Twitter도 하고 있으므로 팔로우해 주시면 울고 기뻐합니다 :)



    @gkzvoice

    #gkz

    좋은 웹페이지 즐겨찾기