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

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

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の応用的な使い方

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