Ansibleに぀いお知っおおくべき15のこず

Habrahabrの読者に、Marlon Bernardesがcodeheaven.ioで公開した蚘事「Ansibleに぀いお知っおおくべき15の事柄」の翻蚳を提䟛したす。

最近、私はAnsibleず倚くの仕事をし、その過皋で孊んだこずを共有するこずにしたした。 以䞋に、Ansibleに぀いお知っおおくべき15の項目のリストを瀺したす。 䜕か芋逃したしたか コメントを残しお、個人的なヒントを共有しおください。

1-ロヌルのパラメヌタヌを枡すこずができたす


プレむブックを敎理する圹割を䜜成するこずをお勧めしたす。 Jenkinsをむンストヌルするロヌルを䜜成するずしたす。 このロヌルのディレクトリ構造は次のようになりたす。

jenkins/ files/ templates/ tasks/ handlers/ defaults/ 

defaultsディレクトリは、ロヌルのデフォルト倉数を保存するために䜿甚されたす。 その䞭にはmain.ymlファむルがありたす

 jenkins_port: 8080 jenkins_context_path: /jenkins jenkins_home: /jenkins 

次のように、ロヌルにさたざたなパラメヌタヌを枡すこずで、デフォルト倉数をオヌバヌラむドできたす。

 roles: - { role: jenkins, jenkins_port: 8181, jenkins_home: '/jenkins1' } - { role: jenkins, jenkins_port: 8080, jenkins_home: '/jenkins2' } 

2-コマンドモゞュヌルをべき等にする方法


べき等性は、最初のアプリケヌションの結果を倉曎せずに繰り返し実行できる特定の操䜜のプロパティです。 この抂念は、ほずんどのAnsibleモゞュヌルに存圚したす。目的の最終状態を指定し、Ansibleがタスクを完了する必芁があるかどうかを決定したす。 デフォルトでは、この原則はコマンドモゞュヌルには適甚されたせん。 プレむブックにタスクがある堎合、垞に完了したす。

 - command: /usr/bin/create-database.sh 

べき等性を実珟するには、 creates属性を䜿甚できたす。 存圚する堎合、Ansibleは、ファむルで指定されたテンプレヌトが存圚しない堎合にのみコマンドを実行したす。 たたは、指定されたファむルが存圚する堎合にのみタスクを実行するremovesを䜿甚できたす。

 - command: /usr/bin/create-database.sh creates=/path/to/database 

Ansibleには倚くのモゞュヌルがあり、最も䞀般的な操䜜ではコマンドモゞュヌルを䜿甚する必芁がないこずに垞に留意しおください。 たずえば、 ファむルシステムの䜜成 、 iptablesルヌルの倉曎、 cronゞョブの管理のためのモゞュヌルがありたす。 デフォルトでは、これらのモゞュヌルはすべおi等であるため、垞に優先する必芁がありたす。

3-Ansibleセットアップモゞュヌルを䜿甚しおホストに関する情報を収集する


おそらく、Ansibleがプレむブックを䜜成するずきに最初に行うこずは次のようなものであるこずがわかりたした。

 TASK [setup] ******************************************************************* ok: [servername] 

これは、Ansibleが最初のタスクを実行する前に特別なセットアップモゞュヌルを呌び出すためです。 セットアップモゞュヌルはホストに接続し、IPアドレス、ディスク容量、プロセッサアヌキテクチャ、利甚可胜なメモリなど、あらゆる皮類の事実を収集したす。 ホストに関する情報をすばやく収集する方法ずしお、このモゞュヌルを手動で呌び出すず䟿利です。 これを行うには、次のコマンドを実行するだけです

 $ ansible localhost -m setup localhost | SUCCESS => { "ansible_facts": { "ansible_all_ipv4_addresses": [ "10.27.12.77", "192.168.33.1" ], (  ) } 

4-プレむブックのすべおのタスクを衚瀺できたす


プレむブックが䜕をするのか芚えおおきたいですか --list-tasksフラグを䜿甚しおansible-playbookを実行するず、Ansibleは䜿甚可胜なすべおのタスクを衚瀺したす。

 $ ansible-playbook install-jenkins.yml --list-tasks PLAY: #1 tasks: TASK: meta TASK: open-jdk : Install open jdk 1.8 TASK: mount-partition : Creating the filesystem for the device {{ device }} (if needed) TASK: mount-partition : Mounting the device {{ device }} on path {{ path }} TASK: jenkins : Ensure Jenkins repo is installed. TASK: jenkins : Add Jenkins repo GPG key. TASK: jenkins : Ensure Jenkins is present. TASK: jenkins : Ensures that the home directory exists TASK: jenkins : include TASK: jenkins : Ensure Jenkins is started and runs on startup. TASK: jenkins : Wait for Jenkins to start up before proceeding. TASK: jenkins : Get the jenkins-cli jarfile from the Jenkins server. 

5-機密情報を保存する堎合は、ansible-vaultを䜿甚したす


タスクの1぀に機密情報デヌタベヌスぞのアクセスなどが必芁な堎合は、この情報をプレヌンテキストではなく、暗号化された圢匏で保存するこずをお勧めしたす。

Ansibleには、暗号化されたファむルを䜜成および管理できるansible-vaultコマンドラむンナヌティリティが付属しおいたす。 したがっお、暗号化されたファむルをバヌゞョン管理システムに「コミット」でき、解読パスワヌドを持぀ナヌザヌのみがそれを読み取るこずができたす。

 #   .     . ansible-vault encrypt secrets.yml #    .     . ansible-vault create secrets.yml #  .    ,   . #   !      . ansible-vault decrypt secrets.yml #    # (-  vim,    $EDITOR) ansible-vault edit secrets.yml #     ansible-vault edit secrets.yml 

secrets.ymlファむルをプレむブックにむンポヌトするず、暗号化されたファむルの読み方がわからないため、Ansibleは「スナップ」したす。 コマンドラむン匕数--ask-vault-passを指定する必芁がありたす。これは、暗号化されたファむルのパスワヌドを提䟛するようAnsibleに促したす。

 ansible-playbook playbook.yml -i hosts --ask-vault-password 

もう1぀の方法は、パスワヌドをファむルに保存し「ロック」しないでください、 -vault-password-file匕数を䜿甚しおファむルぞのパスを指定するこずです 。 このファむルが実行可胜な堎合、Ansibleはそれを実行し、出力をパスワヌドずしお䜿甚したす。

ansible-vaultの詳现に぀いおは、こちらをご芧ください。

6-with_itemsを䜿甚するこずをお勧めしたす


with_itemsを䜿甚するず 、Ansibleは珟圚の反埩の倀を含む倉数{{item}}を䜜成したす。 䞀郚のモゞュヌルはコレクションを非垞にうたく凊理し、同じパラメヌタヌを異なるパラメヌタヌで耇数回実行するよりもはるかに高速です。

 #      () - name: install required packages using the apt module apt: package={{ item }} update_cache=yes sudo: True with_items: - git - memcached - nginx #     () - name: install git apt: package=git update_cache=yes sudo: True - name: install memcached apt: package=memcached update_cache=yes sudo: True - name: install nginx apt: package=nginx update_cache=yes sudo: True 

7-ロヌカルアクションの仕組み


リモヌトホストで実行する代わりに、ロヌカルホストでタスクを実行する必芁がある堎合がありたす。 これは、サヌバヌが起動するたで埅機する堎合開始したばかりの堎合、たたはバランサヌプヌルにノヌドを远加するたたは削陀する堎合に圹立ちたす。

 tasks: - name: take out of load balancer pool local_action: > command /usr/bin/take_out_of_pool {{ inventory_hostname }} - name: update application yum: name=acme-web-stack state=latest - name: add back to load balancer pool local_action: > command /usr/bin/take_out_of_pool {{ inventory_hostname }} 

以䞋の䟋は、EC2むンスタンスを開始し、利甚可胜になるたで埅機する方法を瀺しおいたす。

 - name: Launching EC2 Instance # instance options here register: ec2 - name: Waiting for ec2 instances to listen on port 22 wait_for: state=started host={{ item.public_dns_name }} port=22 with_items: ec2.instances 

8-タスクを䞀床だけ完了するようにAnsibleに䌝えるこずができたす


耇数のホストがある堎合でも、タスクを1回だけ完了する必芁がある堎合がありたす。 䟋ずしお、同じデヌタベヌスに接続するアプリケヌションを備えた耇数のサヌバヌがあり、デヌタベヌスを移行するタスクがあるずしたす。 この堎合、このタスクを完了する必芁があるのは1回だけです。

これを実珟するには、Ansibleにコマンドを1回だけ実行するように指瀺するrun_onceパラメヌタヌを䜿甚できたす。

 - name: run the database migrations command: bundle exec rake db:migrate run_once: true 

9-ハンドラヌは特別なタむプのタスクです


ハンドラヌは、別のタスクから通知された堎合にのみ実行される䞀意の名前を持぀タスクです。 サヌビスの再起動やシステムの再起動に非垞に䟿利です。

通知されたハンドラヌは、通知された回数に関係なく、プレむブックの最埌に1回実行されたす。 ハンドラヌを䜿甚しおそれらを宣蚀し、 notifyを䜿甚しお呌び出すこずができたす。

ファむルの内容が倉曎されたずきに2぀のサヌビスを再起動する方法の䟋を次に瀺したすが、ファむルが倉曎された堎合のみです䟋はAnsible docsから取られおいたす。

 - name: template configuration file template: src=template.j2 dest=/etc/foo.conf notify: - restart memcached - restart apache 

ハンドラヌは、プレむブックのどこかで宣蚀する必芁がありたす。

 handlers: - name: restart memcached #   service,        service: name=memcached state=restarted - name: restart apache service: name=apache state=restarted 

10-パむプラむンの加速


Ansibleをさらに高速に実行するためのヒント


パむプラむンを有効にするず、スクリプトをコピヌする代わりにパむプを介しおSSHセッションに枡すこずにより、リモヌトサヌバヌでモゞュヌルを実行するために必芁なSSH操䜜の数が削枛されたす。 その結果、これにより生産性が倧幅に向䞊したす。

ただし、泚意する必芁がありたす。 sudoersファむル/ etc / sudoers内のすべおのリモヌトホストでrequirettyオプションが無効になっおいる堎合のみ、パむピングが機胜したす。

 [ssh_connection] pipelining = True 


タスクでAnsible Factsを䜿甚しない堎合は、ファクト収集ステップをオフにしお速床を䞊げるこずができたす。 これを行うには、単にGather_factsFalseオプションをプレむブックに远加したす。

 - hosts: servername gather_facts: False tasks: - name: ... # ... 

䞀方、Ansibleファクトセットアップモゞュヌルによっお自動的に収集されるを䜿甚する必芁がある堎合は、それらをキャッシュしお、埌続の実行を高速化できたす。 詳现を知りたい堎合は、 ここでAnsibleのドキュメントで詳现を説明しおいたす 。

11-Ansibleにはいく぀かの通知モゞュヌルがありたす


Ansibleを䜿甚しおブルヌグリヌン展開を自動化したすか プレむブックを実行しお新しいAWSむンスタンスを提䟛したすか 通知モゞュヌルのいずれかを䜿甚しお、これに぀いおチヌムに知らせおください。 䟋ずしお、以䞋のタスクはSlackに通知を送信したす。

 - hosts: servername tasks: - name: Send notification message via Slack local_action: module: slack # To retrieve your slack token, open your team settings and look for the # Incoming Webhooks plugin token: <your>/<token>/<goes here> msg: "Hello team! I just finished updating our production environment." channel: "#general" username: "ansible-bot" 

通知モゞュヌルは、irc、twillio、hipchat、jabberなどでも利甚できたす。

12-EC2むンスタンスはタグによっお自動的にグルヌプ化されたす


Amazon Web ServicesおよびAnsible EC2動的むンベントリスクリプトを䜿甚する堎合、すべおのむンスタンスは、タむプ、キヌペア、タグなどの特性に基づいおグルヌプ化されたす。 EC2タグは、むンスタンスに関連付けられたkey = valueであり、奜きなように䜿甚できたす。 ラベルを䜿甚しお運甚/ステヌゞングサヌバヌをグルヌプ化し、ブルヌグリヌン展開䞭にWebサヌバヌたたは「アクティブな」サヌバヌを瀺したす。

EC2 Dynamic Inventoryスクリプトは、タグでホストをグルヌプ化するずきに、次のテンプレヌト括匧なしを䜿甚したす。
 tag_[TAG_NAME]_[TAG_VALUE] 

したがっお、 env = stagingタグを䜿甚しおすべおのノヌドでタスクを完了したい堎合は、これをプレむブックに远加するだけです。
  hosts: tag_env_staging tasks: - name: This task will be run on all servers with env == staging # ... 

これをさらに面癜くするには、圱響を受けるホストを指定しおAnsible テンプレヌトを䜿甚できたす。 たずえば、本番デヌタベヌスサヌバヌで特定のタスクを実行する堎合適切にマヌクされおいる堎合、次のようにクロスパタヌンを䜿甚できたす。

  hosts: tag_env_production&:tag_type_db tasks: - name: This task will be run on all servers with tags 'env=production' and 'type=db' # ... 

13-「ドラむラン」モヌドでタスクを実行できたす


Ansibleは、プレむブックのドラむランモヌドチェックモヌドずも呌ばれたすでの実行をサポヌトしおいたす。
このモヌドでは、Ansible はホストに倉曎を加えたせんが、このフラグなしでプレむブックが起動された堎合にどのような倉曎が行われるかを単に通知したす。

䞀郚のシナリオでは䟿利ですが、タスクに条件が䜿甚されおいる堎合は適切に機胜しない堎合がありたす。

14-タスクはステップごずに完了できたす


堎合によっおは、プレむブックのすべおのタスクを完了したくないこずがありたす。
これは、新しいプレむブックを䜜成しおチェックアりトする堎合の䞀般的な゜リュヌションです。
Ansibleは、-- stepフラグを䜿甚しお、実行するタスクを決定する方法を提䟛したす。
これにより、タスクを完了するy、スキップするn、たたはc確認せずに続行するかを遞択できたす。

15-タグに基づいおタスクを実行できたす


タスクたたはプレむブックに1぀以䞊のタグを远加できたす。
これを行うには、 tags属性を䜿甚しお「タグ付け」するこずに泚意しおください。

埌でフラグを䜿甚しお、実行するタグたたはスキップするタグを決定できたす。
--tags tagname たたは単に-t および--skip-tags tagnames 

 #      'dependencies' $ ansible-playbook --tags=dependencies playbook.yml #   ,  ,    'optional' $ ansible-playbook --skip-tags=optional playbook.yml 

耇数のタグをコンマで区切っお指定できたす。

掚奚事項


Ansibleのドキュメント
Ansible UpRunning Book、ロリン・ホッホシュタむン

Source: https://habr.com/ru/post/J306998/


All Articles