触るAnsible

Ansible(_spec) 習得に成功する OpenStackのRoleも

Ansibleはサーバーの構成管理をする

  • 導入手順
    1. インストール
    2. AnsibleのHostsファイルに、対象サーバーの ホスト名 (またはIPアドレス) を書く
    3. 作る構成を Playbook(YAML形式) に書き実行


  • 前提
    • ssh接続可能
    • Python2インストール済 (普通されてる)


Screen Shot 2018-05-11 at 23.49.37.png



構成を作成し保持する

  • Playbookの実行結果は、
    • 失敗して「fatal
    • 変更した「changed
    • そのままで「ok


  • 最初は「changed
  • その後は何回流しても「ok」にする

Screen Shot 2018-05-12 at 0.30.37.png


  • 目標

Screen Shot 2018-05-12 at 0.35.28.png



Commandモジュールは病

  • 指定したコマンドを実行する子
  • changed」または「fatalのみ返却する
  • いつも「ok」と返すようにするための回避策もある (それこそ無意味)
- name : "ruby check"
  command: "ruby --version"
  failed_when:  False  # 失敗(fatal)しても「ok」返す
  changed_when: False  # 変更(changed)しても「ok」返す


チュートリアル


私もやってみる

インストール

  • Vagrantfile
  Vagrant.configure(2) do |config|
    config.vm.define "controller" do |node|
          node.vm.box = "centos7_x64"
          node.vm.hostname = "controller"
          node.vm.network :private_network, ip: "192.168.101.100"
          node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
    end
    config.vm.define "target" do |node|
          node.vm.box = "centos7_x64"
          node.vm.hostname = "target"
          node.vm.network :private_network, ip: "192.168.101.200"
          node.vm.network :forwarded_port, id: "ssh", guest: 80, host: 8000
          node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
    end
  end


# 前提
vagrant up

vagrant status # running

ssh -p 2210 root@127.0.0.1 # passwordは "vagrant"  vagrant sshも可

Python --version # Python 2.7.5


# インストール
yum install ansible

ansible --version # ansible 2.4.2.0

    # sudo su -  # root化(vagrant ssh)

umask  # 0022

mkdir -p /work/ansible/test1 # Ansibleフォルダ(プロジェクトtest1用)

cd /work/ansible/test1

echo 192.168.101.100 >hosts # hosts(Inventoryファイル)作成

echo 192.168.101.200 >hosts


# ssh設定
ssh-keygen -t rsa # 秘密鍵作成

ssh-copy-id root@192.168.101.100 # 自分(controller)に秘密鍵送信

ssh-copy-id root@192.168.101.200 # targetに


# 疎通
ansible -i hosts 192.168.101.100 -m ping # 自分(controller)にAnsibleからping送信

ansible -i hosts 192.168.101.200 -m ping # targetに

ansible -i hosts 192.168.101.* -m ping   # 両方に
    # ↑秘密鍵にパスワード指定している場合、1台ずつ入力待ちになって止まる


ansible -i hosts 192.168.101.200 -m yum -s -a name=telnet # yumでtelnetを入れる
    # ----> SUCCESSとなり、"changed": trueになる
    #       インストールされた

ansible -i hosts 192.168.101.200 -m yum -s -a name=telnet # 再度
    # ----> SUCCESSとなり、"changed": falseになる
    #       既にインストール済みの場合は何もしない


初Playbook

  • hosts
  [test-servers]
  192.168.101.100
  192.168.101.200


  • Playbook : simple-playbook.yml
  ---
  - hosts: test-servers
    become: yes
    tasks:
      - name: be sure httpd is installed
        yum: name=httpd state=installed

      - name: be sure httpd is running and enabled
        service: name=httpd state=started enabled=yes

become? Ansible1.9からはsudo/suの代わりにbecomeを使う



  • 実行
ansible-playbook -i hosts simple-playbook.yml --syntax-check # syntaxチェックのみ

ansible-playbook -i hosts simple-playbook.yml --list-tasks # taskリスト参照のみ

ansible-playbook -i hosts simple-playbook.yml --check # dry-run

ansible-playbook -i hosts simple-playbook.yml # 実行(changed)

ansible-playbook -i hosts simple-playbook.yml # 実行(okに)

service httpd status  # runnning


  • ホスト情報取る
ansible -m setup -i hosts 192.168.101.100 # 膨大なJSON


  • Playbook修正1 : simple-playbook.yml 追記 ( # ADD )
  ---
  - hosts: test-servers
    become: yes
    tasks:
      - name: be sure httpd is installed
        yum: name=httpd state=installed

      - name: be sure httpd is running and enabled
        service: name=httpd state=started enabled=yes

      - name: gathering data task example  ## ADD
        command: echo {{ ansible_enp0s8.ipv4.address }} ## ADD ホスト情報取る


  • 実行
ansible-playbook -i hosts simple-playbook.yml # IPv4を取得する (changed)



  • Playbook修正2 : simple-playbook.yml 追記 ( # ADD2 )
  ---
  - hosts: test-servers
    become: yes
    tasks:
      - name: be sure httpd is installed
        yum: name=httpd state=installed

      - name: be sure httpd is running and enabled
        service: name=httpd state=started enabled=yes

      - name: gathering data task example  ## ADD
        command: echo {{ ansible_enp0s8.ipv4.address }} ## ADD ホスト情報取る
        failed_when:  False # ADD2      fatal(失敗)の時もokを返す
        changed_when: False # ADD2    changed(変更)の時も


  • 実行
ansible-playbook -i hosts simple-playbook.yml  # IPv4を取得する (ok)



名前解決

  1. hosts に名前書く
  2. ssh_config に名前解決の設定する
  3. ansible.cfg で ssh_config を読む

  4. hosts

  [test-servers]
  # 192.168.101.100  --> controller
  controller
  192.168.101.200
   Host controller
    User root
    HostName 192.168.101.100
    IdentityFile ~/.ssh/id_rsa
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
  • ansible.cfg
  [ssh_connection]
  ssh_args = -F ssh_config



同じフォルダに置く

/work/ansible
|--test1
   |--ansible.cfg
   |--simple-playbook.yml
   |--ssh_config
   |--hosts



設定ファイル

  • ansible.cfg
  • 無いから作る
  • 下記の順に読む
    1. カレントの
    2. 環境変数:ANSIBLE_CONFIG
    3. ホームディレクト
    4. /etc/ansible/ansible.cfg



パスワード秘匿する

  • 大事
  • Ansible-Vault



便利テンプレ

  • Role使う
  • Ansible-GALAXYにある



フォルダ構成

  • 公式にあるベストプラクティスにする