AnsibleずChatOps、たたは100以䞊のチャットサヌバヌの管理方法

曎新日2017幎2月21日



StackStorm、Slack、Hubotを䜿甚したしたAnsibleずChatOps

ChatOpsずは䜕ですか



ChatOpsは、むンフラストラクチャでの䜜業が䞀般的なチャットに移行されるずきに、DevOpsの䞖界ではただ新鮮で珍しい出来事です。 開発者/システム管理者はチャットから盎接コマンドを実行でき、開発者/システム管理者はリアルタむムで䜕が起こっおいるかを確認し、倉曎履歎を衚瀺し、チヌムを実行し、仕事に関するコミュニケヌションを維持し、経隓を共有するこずさえできたす。 したがっお、情報ずワヌクフロヌはチヌム党䜓に属し、これには倚くの利点がありたす。



コヌドの展開やチャットからのサヌバヌの展開、監芖スケゞュヌルの衚瀺、SMSの送信、クラスタヌの管理、シェルコマンドの実行などを考えるこずができたす。 ChatOpsは、非垞に耇雑なCI / CDシステムの高レベルの衚珟であり、次のようなチャットコマンドでシンプルさをもたらしたす。 このアプロヌチは、可芖性を改善し、展開プロセスの耇雑さを軜枛するこずには驚異的です。





ChatOpsの改善



StackStormは、自動化ずChatOpsに特に重点を眮いたオヌプン゜ヌスプロゞェクトです。 このプラットフォヌムは、構成管理、監芖、グラフ、アラヌトなどの膚倧な数の既存のDevOpsツヌルを接続したす。 䞀緒に、単䞀のチェックポむントからすべおを支配できたす。 たた、これはChatOpsの芳点から理想的です。チャットから盎接ツヌルボックスを制埡するこずで、考えられるワヌクフロヌず考えられないワヌクフロヌを䜜成および自動化できたす。



StackStormにはAnsibleが統合されおおり、バヌゞョン1.0以降では、より倚くのChatOps機胜が1.2および1.4リリヌスで远加され、ボットを䜿甚しお面癜い猫の写真を投皿するだけでなく、ChatOpsの実際のアプリケヌションぞの道を開きたす。 この蚘事では、StackStormプラットフォヌムを䜿甚しおChatOpsずAnsibleを動䜜させる方法を説明したす。

ちなみに、StackStormはAnsibleのように、Pythonで蚘述された宣蚀型であり、Yaml + Jinjaを䜿甚しおいたす。これにより、わかりやすくなりたす。




蚈画



最初に、Ubuntu 14で実行される制埡マシンをむンストヌルしたす。次に、Hubotフレヌムワヌクを備えたAnsibleおよびChatOpsコントロヌルパックを含むStackStormプラットフォヌムを構成したす。 最埌に、システム党䜓をSlackチャットに接続し、Ansibleのむンタラクティブな䜿甚の簡単だが実際の䟋をいく぀か瀺したす。



始めたしょう。同時に、どこたで進んだか、 技術的な特異点が来たかどうかを確認し、チャットボットぞのルヌトアクセスを蚱可し、100以䞊のサヌバヌやデヌタセンタヌを管理できるようにしたすちなみに、RackSpaceはChatOpsず連携したす。



ステップ0. Slackを準備する



すでに述べたように、チャットプラットフォヌムずしおSlack.comを䜿甚したす他の統合も利甚可胜です。 Slackアカりントをただお持ちでない堎合は登録しおください。 蚭定でHubot統合を有効にしたす。

Hubot - ChatOps専甚に蚭蚈されたGitHubボットフレヌムワヌク


SlackでHubot統合を有効にする

その結果、Slackは次のようなAPIトヌクンを提䟛したす。

 HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu
      
      





次に、StackStormプラットフォヌムを構成し、実際の䜿甚䟋を瀺したす。もちろん、独自のChatOpsコマンドを䜜成する方法を説明したす。

しかし、埅っお、簡単な方法がありたす



最も怠Forな



怠け者ほずんどのDevOps開発者には、Vagrantを䜿甚しお特別に準備されたリポゞトリがあり、シンプルなbashスクリプトの助けを借りお必芁なものをすべおむンストヌルし、スタヌトラむンからフィニッシュラむンに盎接移動しお、自動むンストヌル埌にショヌケヌス SlackチャットからChatOpsコマンドをすぐに起動できたす-ansible-chatops 

 #     export HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu git clone https://github.com/StackStorm/showcase-ansible-chatops.git cd showcase-ansible-chatops vagrant up
      
      





詳现に興味がある人のために-自動モヌドから手動モヌドに切り替えお、すべおのステップを実行したす。 うたくいかない堎合は泚意しおください-ansiblechatopsデモリポゞトリの䟋をご芧ください。



ステップ1. StackStormをむンストヌルする



むンストヌルは簡単です。 1チヌムのみ

 curl -sSL https://stackstorm.com/packages/install.sh | sudo bash -- --user=demo --password=demo
      
      





これはデモンストレヌション甚であるこずを忘れないでください。 運甚環境を展開するずきは、 Ansible Playbookを䜿甚しお眲名を確認し 、むンストヌルコマンドを1行で信頌しないでください むンストヌルの詳现は、ドキュメントに蚘茉されおいたす docs.stackstorm.com/install/deb.html




ステップ2. StackStormプラグむンのむンストヌルAnsible



StackStormの統合パックプラグむンのアむデアは、システムを他のツヌルや倖郚サヌビスず接続するずいうものです。

そのため、Ansibleパックが必芁です。むンストヌル

 st2 pack install ansible
      
      





Ansible自䜓はPython virtualenvで利甚可胜になりたす /opt/stackstorm/virtualenvs/ansible





統合の完党なリスト exchange.stackstorm.org 、その䞭 AWS



、 GitHub



、 RabbitMQ



、 Pagerduty



、 Jenkins



、 Nagios



、 Docker



、合蚈で100以䞊




ステップ3. ChatOpsを構成する



次に、環境倉数を䜿甚しお/opt/stackstorm/chatops/st2chatops.env



ファむルを構成する必芁がありたす。 stanley



ずいう名前のSlackボットを探す方法は次のずおりです。

 # Bot name export HUBOT_NAME=stanley export HUBOT_ALIAS='!' # StackStorm API key # Use: `st2 apikey create -k` to generate # Replace with your key (!) export ST2_API_KEY="123randomstring789" # ST2 AUTH credentials # Replace with your username/password (!) export ST2_AUTH_USERNAME="demo" export ST2_AUTH_PASSWORD="demo" # Configure Hubot to use Slack export HUBOT_ADAPTER="slack" # Replace with your token (!) export HUBOT_SLACK_TOKEN="xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu"
      
      







倉曎埌、サヌビスを再起動するこずを忘れないでください。

 sudo service st2chatops restart
      
      







ステップ4.最初のChatOps゚クスペリ゚ンス



この時点で、Stanleyボットはオンラむンチャットしおいるはずです。 圌を特定のSlackルヌムに招埅するには

 /invite @stanley
      
      





利甚可胜なコマンドのリストを取埗したす。

 !help
      
      





きっずあなたはshipitが奜きになるでしょう

 !ship it
      
      





既存のチヌムで十分にプレヌしたので、私たちは本圓に真剣なこずをしたす。



ステップ5.独自のChatOpsコマンドを䜜成する



StackStormの機胜の1぀は、チヌムの呚りに単玔な゚むリアス/ラッパヌを䜜成する機胜であり、ChatOpsでの䜜業が容易になりたす。 長いコマンドを入力する代わりに、それをより友奜的で簡単な構文糖にバむンドするこずができたす。



したがっお、必芁なコマンドを含む独自のStackStormパックを䜜成したす。 GitHubでStackStormテンプレヌトパックをフォヌクしたす。 最初のアクション゚むリアスaliases/ansible.yaml





 --- name: "chatops.ansible_local" action_ref: "ansible.command_local" description: "Run Ansible command on local machine" formats: - display: "ansible <command>" representation: - "ansible {{ args }}" result: format: | Ansible command `{{ execution.parameters.args }}` result: {~} {% if execution.result.stderr %}*Stdout:* {% endif %} ```{{ execution.result.stdout }}``` {% if execution.result.stderr %}*Stderr:* ```{{ execution.result.stderr }}```{% endif %} extra: slack: color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}"
      
      





参考䞊蚘の゚むリアスは、 ansible st2統合パックを䜿甚したす


新しく䜜成されたGitHubリポゞトリに倉曎を送信し、パックをむンストヌルできたす。 これにはすでにChatOps゚むリアスがありたす。

 !pack install https://github.com/armab/st2_chatops_aliases
      
      







Slackチャットから簡単なAnsibleアドホックコマンドを盎接実行できるようになりたした。

 !ansible "uname -a"
      
      





ansibleコマンドの実行-ChatOps

䜎レベルでは、これは次ず同じです。

 /opt/stackstorm/virtualenvs/ansible/bin/ansible all --connection=local --args='uname -a' --inventory-file='127.0.0.1,'
      
      





しかし、むンタラクティブなChatOpsのより䟿利な䟋を芋おみたしょう。



䟋1.サヌバヌのステヌタスを取埗する



Ansibleには、ホストに接続し、成功するずpong



を返すpingモゞュヌルがありたす。 シンプルだが匷力な䟋で、タヌミナルに行くこずなく、数秒でチャットからサヌバヌのステヌタスを盎接理解できたす。



これを行うには、実際のコマンドずaction alias



を起動するaction



をパッケヌゞに䜜成したす。これは、アクションの構文糖であり、このようなChatOpsコンストラクトを䜜成できたす。

 !status 'web'
      
      





アクションactions/server-status.yaml





 --- name: server_status description: Show server status by running ansible ping ad-hoc command runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: description: "Run command with sudo" type: boolean immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts}} --module-name=ping" hosts: description: "Ansible hosts to ping" type: string required: true
      
      





ずころで、 bash



スクリプトに加えお、ActionはPythonランナヌたたはjson



を返すこずができる任意のバむナリず連携できたす-これはすべお䜿甚の柔軟性です。




アクション゚むリアスaliases/server_status.yaml





 --- name: chatops.ansible_server_status action_ref: st2_chatops_aliases.server_status description: Show status for hosts (ansible ping module) formats: - display: "status <hosts>" representation: - "status {{ hosts }}" - "ping {{ hosts }}" result: format: | Here is your status for `{{ execution.parameters.hosts }}` host(s): {~} ```{{ execution.result.stdout }}``` extra: slack: color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}" fields: - title: Alive value: "{{ execution.result.stdout|regex_replace('(?!SUCCESS).', '')|wordcount }}" short: true - title: Dead value: "{{ execution.result.stdout|regex_replace('(?!UNREACHABLE).', '')|wordcount }}" short: true footer: "{{ execution.id }}" footer_icon: "https://stackstorm.com/wp/wp-content/uploads/2015/01/favicon.png"
      
      





正しいホストをAnsibleむンベントリファむルに远加しおください /etc/ansible/hosts







リポゞトリにコヌドを送信した埌、チャットからパックをリロヌドするこずを忘れないでください

 !pack install armab/st2_chatops_aliases
      
      





すべおのChatOps蚭定をst2パックの圢匏で保存し、リポゞトリから倉曎をキャッチできるのは非垞に䟿利です。むンフラストラクチャはコヌドのようなものです。



Slackで新しく䜜成されたコマンドの結果

サヌバヌステヌタスの衚瀺-ChatOps



CEOでさえ、サヌバヌにアクセスしなくおもステヌタスを確認できたす。 このアプロヌチを䜿甚するず、むンフラストラクチャの通信、展開、および䜜業がチャットで盎接行われたす。オフィスにいるか、リモヌトで䜜業しおいるか私たちの䞀郚はビヌチから盎接䜜業できたす。



䟋2.サヌビスのリロヌド



サヌビスの簡単な再起動が助けになったずいうこずはあなたに起こったこずがありたすか 理想的な方法ではありたせんが、倚くの堎合、迅速な修正が必須です。 特定のサヌバヌで指定されたサヌビスをオヌバヌロヌドするChatOpsコマンドを䜜成したしょう。

タスクは、この蚭蚈を取埗するこずです。

 !service restart "rabbitmq-server" on "mq-01"
      
      





これを行うには、既存のst2パッケヌゞにactions/service_restart.yaml



を䜜成したす。

 --- name: service_restart description: Restart service on remote hosts runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: description: "Run command with sudo" type: boolean immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts}} --become --module-name=service --args='name={{service_name}} state=restarted'" hosts: description: "Ansible hosts" type: string required: true service_name: description: "Service to restart" type: string required: true
      
      





ChatOps゚むリアスaliases/service_restart.yaml





 --- name: chatops.ansible_service_restart action_ref: st2_chatops_aliases.service_restart description: Restart service on remote hosts formats: - display: "service restart <service_name> on <hosts>" representation: - "service restart {{ service_name }} on {{ hosts }}" result: format: | Service restart `{{ execution.parameters.service_name }}` on `{{ execution.parameters.hosts }}` host(s): {~} {% if execution.result.stderr %} *Exit Status*: `{{ execution.result.return_code }}` *Stderr:* ```{{ execution.result.stderr }}``` *Stdout:* {% endif %} ```{{ execution.result.stdout }}``` extra: slack: color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}" fields: - title: Restarted value: "{{ execution.result.stdout|regex_replace('(?!SUCCESS).', '')|wordcount }}" short: true - title: Failed value: "{{ execution.result.stdout|regex_replace('(?!(FAILED|UNREACHABLE)!).', '')|wordcount }}" short: true footer: "{{ execution.id }}" footer_icon: "https://stackstorm.com/wp/wp-content/uploads/2015/01/favicon.png"
      
      





結果

リモヌトサヌバヌでのNginxサヌビスのリロヌド-ChatOps

そしお、あなたは䜕を知っおいたすか Slackモバむルアプリのおかげで、携垯電話から盎接サヌビスをリロヌドできたす



䟋3. MySQLプロセスリスト



MySQLサヌバヌで実行されおいるSQLク゚リのリストを衚瀺する簡単なSlackコマンドを䜜成したす。

 !show mysql processlist
      
      





アクションactions/mysql_processlist.yaml





 --- name: mysql_processlist description: Show MySQL processlist runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{ hosts }} --become --become-user=root -m shell -a \"mysql --execute='SHOW PROCESSLIST;' | expand -t 10\"" hosts: description: "Ansible hosts" type: string default: db
      
      





ChatOpsのアクション゚むリアス aliases/mysql_processlist.yaml





 --- name: chatops.mysql_processlist action_ref: st2_chatops_aliases.mysql_processlist description: Show MySQL processlist formats: - display: "show mysql processlist <hosts=db>" representation: - "show mysql processlist {{ hosts=db }}" - "show mysql processlist on {{ hosts=db }}" result: format: | {% if execution.status == 'succeeded' %}MySQL queries on `{{ execution.parameters.hosts }}`: ```{{ execution.result.stdout }}```{~}{% else %} *Exit Code:* `{{ execution.result.return_code }}` *Stderr:* ```{{ execution.result.stderr }}``` *Stdout:* ```{{ execution.result.stdout }}``` {% endif %}
      
      





hosts



パラメヌタヌをオプションデフォルトではdb



にしたため、これら2぀のコマンドは同等です。

 !show mysql processlist !show mysql processlist 'db'
      
      





実行可胜なSQLク゚リのリストを衚瀺する-ChatOps

DBAが幞せになりたす



䟋4. nginxからHTTP統蚈を取埗する



nginxログからHTTPステヌタスコヌドの配列を取埗し、それらを番号で䞊べ替えおチャットで適切に衚瀺しお、正垞範囲内であるかどうかにかかわらず、Webサヌバヌに200



たたは50x



゚ラヌがいく぀あるかを理解したす。

 !show nginx stats on 'web'
      
      





これを行うには、シェルコマンドactions/http_status_codes.yaml



を実行するアクションを䜜成したす。

 --- name: http_status_codes description: Show sorted http status codes from nginx logs runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{ hosts }} --become -m shell -a \"awk '{print \\$9}' /var/log/nginx/access.log|sort |uniq -c |sort -k1,1nr 2>/dev/null|column -t\"" hosts: description: "Ansible hosts" type: string required: true
      
      





゚むリアスaliases/http_status_codes.yaml





 --- name: chatops.http_status_codes action_ref: st2_chatops_aliases.http_status_codes description: Show sorted http status codes from nginx on hosts formats: - display: "show nginx stats on <hosts>" representation: - "show nginx stats on {{ hosts }}" result: format: "```{{ execution.result.stdout }}```"
      
      





Ansibleのコア開発者であるBrian Cocaの玠晎らしいアむデアに感謝したす


サヌバヌ䞊のnginxステヌタスコヌドのリストを衚瀺する-ChatOps

たすたす、 フラむトコントロヌルコントロヌルセンタヌのように芋えたす。 サヌバヌ䞊のコマンドチェヌン党䜓をチャットから盎接実行でき、党員がリアルタむムで結果を確認できたす。 いいね



䟋5.セキュリティパッチ



Shellshockのような別の重倧な脆匱性を緊急に修正する必芁があるず想像しおください。 これを行うには、すべおのサヌバヌでbash



を曎新したす。 Ansibleは、おそらくこのようなアトミック操䜜に最適なツヌルです。 しかし、単䞀行のansibleコマンドを実行する代わりに、堅実なプレむブックを䜜成したしょう。

playbooks/update_package.yaml





 --- - name: Update package on remote hosts, run on 25% of servers at a time hosts: "{{ hosts }}" serial: "25%" become: True become_user: root tasks: - name: Check if Package is installed command: dpkg-query -l {{ package }} register: is_installed failed_when: is_installed.rc > 1 changed_when: no - name: Update Package only if installed apt: name={{ package }} state=latest update_cache=yes cache_valid_time=600 when: is_installed.rc == 0
      
      





Playbook



、パッケヌゞが既にむンストヌルされおいる堎合にのみパッケヌゞPlaybook



曎新したす。操䜜は䞀床に20のホスト5぀のステップで実行で実行されたす。 非垞に倚くのサヌバヌでnginx



ようなもっず深刻なものを曎新する必芁があるずきに圹立ちたす。 したがっお、Webクラスタヌ党䜓をdownに送信したせん。 さらに、ロヌドバランサヌからの切断をグルヌプで远加できたす。 実生掻の䟋。



プレむブック倉数{{hosts}}



ず{{package}}



は、StackStormパッケヌゞのactions/update_package.yaml



由来するこずがわかりたす。

 --- name: update_package description: Update package on remote hosts runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true default: true kwarg_op: immutable: true timeout: default: 6000 cmd: description: "Command to run" immutable: true #   default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible-playbook /opt/stackstorm/packs/${ST2_ACTION_PACK_NAME}/playbooks/update_package.yaml --extra-vars='hosts={{ hosts }} package={{ package }}'" hosts: description: "Ansible hosts" type: string required: true package: description: "Package to upgrade" type: string required: true
      
      





アクション゚むリアス。簡単なChatOpsコマンドずしおプレむブックを実行できたす。

aliases/update_package.yaml





 --- name: chatops.ansible_package_update action_ref: st2_chatops_aliases.update_package description: Update package on remote hosts formats: - display: "update <package> on <hosts>" representation: - "update {{ package }} on {{ hosts }}" - "upgrade {{ package }} on {{ hosts }}" result: format: | Update package `{{ execution.parameters.package }}` on `{{ execution.parameters.hosts }}` host(s): {~} {% if execution.result.stderr %} *Exit Status*: `{{ execution.result.return_code }}` *Stderr:* ```{{ execution.result.stderr }}``` *Stdout:* {% endif %} ```{{ execution.result.stdout }}``` extra: slack: color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}" fields: - title: Updated nodes value: "{{ execution.result.stdout|regex_replace('(?!changed=1).', '')|wordcount }}" short: true - title: Executed in value: ":timer_clock: {{ execution.elapsed_seconds | to_human_time_from_seconds }}" short: true footer: "{{ execution.id }}" footer_icon: "https://stackstorm.com/wp/wp-content/uploads/2015/01/favicon.png"
      
      





ここにありたす

 !update 'bash' on 'all'
      
      







DevOps゚ンゞニアの仕事の重芁な郚分は、プロセスの改善、開発者の䜜業の容易化、チヌムコミュニケヌションの改善、適切なツヌルの自動化ず䜿甚による問題の迅速な蚺断がすべお䌚瀟を成功させるこずです。

ChatOpsは、これらの問題をたったく新しい効果的な方法で解決するのに圹立ちたす。



結論ずしお。 神聖な牛



ご存知のように、Ansible cowsay



。 ChatOpsに移動したしょう



たず、ナヌティリティ自䜓をむンストヌルしたす。

 sudo apt-get install cowsay
      
      





アクションactions/cowsay.yaml





 --- name: cowsay description: Draws a cow that says what you want runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/usr/games/cowsay {{message}}" message: description: "Message to say" type: string required: true
      
      





゚むリアスaliases/cowsay.yaml





 --- name: chatops.cowsay action_ref: st2_chatops_aliases.cowsay description: Draws a cow that says what you want formats: - display: "cowsay <message>" representation: - "cowsay {{ message }}" ack: enabled: false result: format: | {% if execution.status == 'succeeded' %}Here is your cow: ```{{ execution.result.stdout }}``` {~}{% else %} Sorry, no cows this time {~} Exit Code: `{{ execution.result.return_code }}` Stderr: ```{{ execution.result.stderr }}``` Hint: Make sure `cowsay` utility is installed. {% endif %}
      
      





Cowの聖なるChatOpsに電話

 !cowsay 'Holy ChatOps Cow!'
      
      





聖なるChatOps牛

参考コマンド実行のすべおの結果は、StackStormコントロヌルパネルで衚瀺できたす。

https// chatops / login demo



password demo





 Vagrantデモを䜿甚しなかった堎合、ホスト名をIPに眮き換えたす





停止しないでください



これらはシンプルですが、戊闘のナヌスケヌスです。 耇数のDevOpsツヌルを組み合わせお動的なワヌクフロヌを䜜成する堎合のより耇雑なこずに぀いおは、今埌の蚘事で説明したす。 ここで、 StackStormは状況に応じお決定を䞋し、すべおの力を発揮したす。これは、むンシデント埌の自己修埩システムのようなむベント指向アヌキテクチャず呌ばれたす。

StackStormで必芁な機胜が芋぀からなかった堎合は、アむデアを提案するか、 GitHubにプルリク゚ストを远加したす Pythonがメむン蚀語です。 たた、質問をしたり、䜓隓を共有したりできるコミュニティがありたす。 公開Slackチャンネル  #StackStorm



事前にむンストヌルされおいたすおよびIRC #StackStorm



です。





ご枅聎ありがずうございたした。DevOpsの䞖界におけるこのかなり新しいアプロヌチの特城を明らかにするこずができたず思いたす。

たた、どのような堎合にChatOpsを䜿甚したすか アむデアやストヌリヌを共有しおくださいストヌリヌが倧奜きです。



All Articles