Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ChefからAnsibleへ引っ越したい人のためのAnsible入門 / Migrate fr...

Avatar for iwashi iwashi
November 27, 2022

ChefからAnsibleへ引っ越したい人のためのAnsible入門 / Migrate from Chef to Ansible

JulyTechFesta 2015での講演資料です。
http://2015.techfesta.jp/p/program.html#ansible_for_chef_users

主に以下3点について解説しています。
1. Ansibleとは(概要)
2. Ansibleの基本的な使い方
3. Ansibleの応用的な使い方

Avatar for iwashi

iwashi

November 27, 2022
Tweet

More Decks by iwashi

Other Decks in Technology

Transcript

  1. ChefからAnsibleへ引っ越したい
 人のためのAnsible入門
 
 July Tech Festa 2015/7/26
 @iwashi86 / Yoshimasa

    Iwase
 1 https://www.flickr.com/photos/gsfc/13902795556/in/photolist-nbxsKE-barXrZ-azd68k-bxoSSp-egb7rB-mhaDLa-bRYwBH-8NGh4Z-4d2XZ-dkiRVQ-36ELQM-ftbvxr-8LeQta-6cfCfe-9iWrrE-dZUfSq-neTxeK-ntL9MW-gzYp8-efDEVP-5j2f4x-bdd9ea-kJrs1Z-dz6k4z-oWv5Tp-tvQXW7-nuM4RK-66Khgv-8CPZUQ-MRo3L-khBpLd-pugD9j-pjjMoj-7DQWhU-5kMcmT -priEv3-ticgYH-9jt6GK-d2McUy-aXHTdn-nRaCfF-hsuYJX-naQgip-edLBtV-edScNj-edSefj-aaEDDi-9Kzoa-c5gQRN-dyhNrD
  2. 39 Ansible Chef エージェント エージェントレス エージェントとサーバ 接続プロトコル SSHなど SSHなど 記述方法

    YAML Ruby 柔軟さ △ ◦ シンプルさ ◦ △ テンプレート形式 Jinja2 erb 共用 Ansible Galaxy Community Cookbook (参考)開発言語 Python Ruby Ansible と Chef の比較
  3. 42 インストール // RedHat系 (EPEL導入後) $ sudo yum install ansible

    // Ubuntu等 $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible // Mac OS $ brew update $ brew install ansible Pythonがある前提
  4. 49 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com シングルのホスト (SSHで接続するホスト名)

    グループ名 複数のホストを束ねており、 複数ホストに対してまとめて 処理を実行する場合に便利
  5. 50 inventoryファイル mail.example.com [webservers] foo.example.com bar.example.com [dbservers] db[01:05].example.com シングルのホスト (SSHで接続するホスト名)

    グループ名 複数のホストを束ねており、 複数ホストに対してまとめて 処理を実行する場合に便利 簡略化した まとめ指定も可能
  6. 56 ホスト名: jtf (VitualBox上のVM) ローカル Macbook 使ってみる ansible jtf -i

    host.ini -m ping
 -i インベントリファイル ホストを指定 モジュール (ホスト上で 実行される) $ cat host.ini jtf
  7. 57 ansible jtf -i host.ini -a ‘uname -a’ ホスト名: jtf

    (VitualBox上のVM) ローカル Macbook 続:使ってみる ansible jtf -i host.ini –m setup
 chefでお馴染みの 「ohai」を内部で利用し ホスト情報を取得
  8. 59 Playbook --- - hosts: jtf sudo: yes tasks: -

    apt: name=sl update_cache=yes 対象ホスト sudoで 以下のタスク群を実行 「誰に対して、どういう条件で、何を実行」をYAMLで記述
  9. 60 Playbook --- - hosts: jtf sudo: yes tasks: -

    apt: name=sl update_cache=yes chefでいうResources AnsibleではModuleと呼ぶ 重要なので、後に高頻度で利用す るモジュールを紹介 「誰に対して、どういう条件で、何を実行」をYAMLで記述
  10. 61 Playbook - vars --- - hosts: jtf vars: username:

    jtf_user tasks: - user: name={{ username }} 変数を渡したいとき
  11. 62 Playbook - vars --- - hosts: jtf vars: username:

    jtf_user tasks: - user: name={{ username }} 変数を渡したいとき taskで使う変数を組みこむ
  12. 63 Playbook - handler tasks: - apt: name=nginx notify: restart

    nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  13. 64 Playbook - handler tasks: - apt: name=nginx notify: restart

    nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  14. 65 Playbook - handler tasks: - apt: name=nginx notify: restart

    nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション
  15. 66 Playbook - handler tasks: - apt: name=nginx notify: restart

    nginx handlers: - name: restart nginx service: name=nginx state=restarted chefでいうNotificationアクション #Chefだとこんな感じ package “nginx” do action :install notifies :reload, ‘service[nginx]’ end service “nginx” do :reload => true end
  16. 67 Playbook - loop tasks: - apt: name={{ item }}

    with_items: - gcc - make - git chefだとruby構文で頑張っていたところ
  17. 68 Playbook - loop tasks: - apt: name={{ item }}

    with_items: - gcc - make - git chefだとruby構文で頑張っていたところ #Chefだとこんな感じ %w{gcc make git}.each do |pkg| package pkg do action : install end end
  18. 69 Playbook - when tasks: - apt: name=apache2 state=latest when:

    ansible_os_family == “Debian” - apt: name=httpd state=latest when: ansible_os_family == “RedHat” 条件分岐したい場合に利用、Chefだとif/unlessなど 補足:ansible_os_familyは、ansible実行時に     自動で収集・設定される変数
  19. 70 Playbook - when tasks: - apt: name=apache2 state=latest when:

    ansible_os_family == “Debian” - apt: name=httpd state=latest when: ansible_os_family == “RedHat” 条件分岐したい場合に利用、Chefだとif/unlessなど Chefだと”package”で抽象化されていた。 Ansibleへ移行時は注意。
  20. 72 file ファイル・ディレクトリの作成や変更 (Chefでいう file + directory + link) -

    file: path=/etc/foo.conf owner=foo group=foo mode=0644 - file: path=/etc/some_directory state=directory mode=0755
  21. 79 ディレクトリ構成 Best Practice ・ Chefにはenvironmentがあるが、Ansibleにはない ・対応としては、ディレクトリ構成のベストプラクティスが  公開されているのでそれで吸収可能 production #

    inventory file for プロダクション staging # inventory file for ステージ group_vars/ group1 # グループごとの変数をまとめておく host_vars/ hostname1 # ホスト固有の値を設定する site.yml # 全ての起点のplaybook webservers.yml # playbook for webサーバ dbservers.yml # playbook for dbサーバ
  22. 80 続:ディレクトリ構成 Best Practice ・ role単位で構築していくのが基本 ・以下の例は nginx の例 roles/

    nginx/ # ロールごとに作成(Chefでいうクックブック単位) tasks/ # 実行したい処理 main.yml # nginxのインストール処理 handlers/ # main.yml # notifyで呼ばれるハンドラ templates/ nginx.conf.j2 # nginxのコンフィグファイル files/ bar.txt # 変数不要で配備したいファイル    vars/ main.yml # このロールの変数を設定
  23. 82 Dynamic Inventry ・ 管理ホストが多くなると、Inventry管理が大変   ・特にクラウド上のホストは生成・破棄の繰り返し ・ Inventryには静的ファイルの他、スクリプト指定可能 // AWSを利用するためのキー情報

    $ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......' $ export AWS_SECRET_ACCESS_KEY='yyyyy.......’ // 動的にホストを取得するスクリプト取得(公式が用意) $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inve ntory/ec2.py $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inve ntory/ec2.ini
  24. 83 Dynamic Inventry ・ 管理ホストが多くなると、Inventry管理が大変   ・特にクラウド上のホストは生成・破棄の繰り返し ・ Inventryには静的ファイルの他、スクリプト指定可能 // AWSを利用するためのキー情報

    $ export AWS_ACCESS_KEY_ID=’xxxxxxxxx.......' $ export AWS_SECRET_ACCESS_KEY='yyyyy.......’ // 動的にホストを取得するスクリプト取得(公式が用意) $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inve ntory/ec2.py $ wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inve ntory/ec2.ini 静的ファイルの代わりに スクリプト指定
  25. 87 - name: デプロイ先のディレクトリをtimestampとするために、timestampを得る command: date '+%Y%m%d-%H%I%S' register: date_output -

    name: timestamp名のディレクトリのPATH名を作る command: echo "/usr/local/{{ date_output.stdout }}" register: release_path # name: release_pathのディレクトリを作成し、任意の方法でアプリ配備 - name: 最新版のPATHにシンボリックリンクを貼る file: src=”{{ release_path }}" dest="/usr/local/app” state=link デプロイまでするplaybook例 補足1:capistrano等の責務をansibleで対応するイメー ジ。     ロールバックなども書けば対応可能。 補足2: 上記は説明用で完全なコードで無い点に注意
  26. 90 インフラTDDしたい! ・ホワイトボックスアプローチ  ⇒ ・ブラックボックスアプローチ  ⇒ Infratester等 describe server(:app) do

     describe http('http://app') do   It "responds content including 'This is app server'" do    expect(response.body).to include(‘This is app server’)   end   it "responds OK 200" do    expect(response.status).to eq(200)   end  end end