Ansible ノウハウ


# 概要
・ansible で始めるインフラ自動化
https://www.slideshare.net/dcubeio/ansible-72056386

# 設定方法
１：ansibleクライアント、サーバ共に下記実施。
＄ sudo apt-get update
＄ sudo apt-get install -y python-dev python-pip
＄ sudo pip install ansible

２：ansibleサーバ側で、ssh用のコンフィグ設定。クライアント側は、AzureでVM作る時に、公開鍵設定済。これで、ssh IPアドレス　でログイン可能。

```ruby:.ssh/config
Host プライベートIPアドレス
    HostName プライベートIPアドレス
    User ログインユーザ名
    IdentityFile 秘密鍵のpath
```

3:ansibleサーバ側のanbible.cfgに、秘密鍵のpathを設定(private_key_file)
３をやるなら、２は不要。

4:ansibleサーバ側の、/etc/hostsにvncとxrdpのIPアドレス設定

５：inventoryにhostsの設定を反映
 inventoryには、hostsの名前を設定すること。IPアドレスは、inventoryには書いてはいけない。

gather factなし
become user



 
# qiita書き方
https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

#よくまとまってるからあとでみる
https://qiita.com/waterada/items/4e64cc6f810a92001c95

#モジュール

##tags
でかいplaybookがある場合に、部分的に実行するために、tagを指定しておく。tag指定しておけば、こんな感じでいける。
http://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html?highlight=include_tasks

$ ansible-playbook example.yml --tags "configuration,packages"

```ruby:sample.yml
tasks:

    - yum:
        name: "{{ item }}"
        state: installed
      loop:
         - httpd
         - memcached
      tags:
         - packages

    - template:
        src: templates/src.j2
        dest: /etc/foo.conf
      tags:
         - configuration
```

##when
条件を作って、実行制御するためのパラメータ。
http://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html#the-when-statement

```ruby:sample.yml
- name: send channel setting for restapi
  become: false
  synchronize:
    src: channel/
    dest: ~/fabric-performance-verification.git/fabricRestTool/artifacts/channel/
    delete: yes
  when: "'web1' in inventory_hostname"
```


##command
リモートホストでコマンドを実行する。
http://docs.ansible.com/ansible/latest/modules/command_module.html?highlight=command

```ruby:sample.yml
- name: install n
  command: make -C /tmp/n
```


##shell
リモートホストにシェルを実行させる。commandとの違いがわからない。どっちでも同じことができるのは確かだと思う。becomeも含めてこれはモジュール？という疑問があるが、とりあえず下記のように指定すれば動くのでは、詳細はこれ以上進めて詰まったらやるで良い。chdirは実行ディレクトリ。

```ruby:sample.yml
- name: build cryptogen/configtxgen script
  become: true
  shell: ./bootstrap-1.0.5.sh
  args:
    chdir: "{{ ansible_env.PWD }}/fabric/scripts"
```


## ignore_errors
playbookは失敗すると止まるが、失敗しても止めたくないときに指定するパラメータ？
http://docs.ansible.com/ansible/latest/user_guide/playbooks_error_handling.html?highlight=ignore_errors

```ruby.sample.yml
- name: mode old data
  shell: mv /root/sar.data.{{ inventory_hostname }} /root/sar.data.{{ inventory_hostname }}.`date '+%Y%m%d-%H%M%S'`
  ignore_errors: true
```

##file
ファイルやディレクトリやシンボリックリンクのパラメータをセットする。copyとかでもできるっぽい。

```ruby:sample.yml
- name: change owner/group ~/fabric/scripts/bin
  become: true
  file:
    path: "{{ ansible_env.PWD }}/fabric/scripts/bin"
    state: directory
    owner: "{{ ansible_env.USER }}"
    group: "{{ ansible_env.USER }}"
```


##copy
リモートホストにファイルを転送する。copyするファイルは、「files」ディレクトリの中に配置しておく。
http://docs.ansible.com/ansible/latest/modules/copy_module.html?highlight=copy

```ruby:sample.yml
    - copy:
        src: /etc/hosts
        dest: /etc/hosts
        owner: root
        group: root
        mode: 0644
```


##varialbes
http://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables <br>Variables Defined in a Playbook  In a playbook, it’s possible to define variables directly inline like so<br>

```ruby:sample.yml
- hosts: webservers
  vars:
    http_port: 80
```
変数の指定。


##template
テンプレートファイル(jinja2)を展開したファイルをリモートホストへ転送する。ホストのtemplatesディレクトリにあるsrcのファイルをテンプレートとして、リモートのdestにファイルを生成する
http://docs.ansible.com/ansible/latest/modules/template_module.html?highlight=templat <br>

```ruby:sample.yml
- name: send docker-compose.yml
  template:
    src: docker-compose.yml
    dest: ~/docker-compose.yml
```


##synchronize
rsyncのラッパー。rsyncほど有能なコマンドではないが、ある程度使える。copyとの違いがいまいちわからない。後続の処理に影響している？
http://docs.ansible.com/ansible/latest/modules/synchronize_module.html?highlight=synchronize

```ruby.yml
- name: send channel settings
  synchronize:
    src: channel/
    dest: /root/channel/
    delete: yes
```


##include_tasks
現在のplaybookで実行されるタスクのリスト。
http://docs.ansible.com/ansible/latest/modules/include_tasks_module.html?highlight=include_tasks

```ruby:main.yml
- include_tasks: install.yml
  tags:
    - install
```

##service
リモートホストのサービスを管理する。
http://docs.ansible.com/ansible/latest/modules/service_module.html?highlight=service

```ruby:sample.yml
- name: restart docker
  service:
    name: docker
    state: restarted
```


##systemd
リモートホストのsystemdサービスを管理する。serviceでも出来るような気がするが。。。
http://docs.ansible.com/ansible/latest/modules/systemd_module.html?highlight=systemd

```ruby.install.yml
- name: service disabled
  systemd:
    name: sysstat
    state: stopped
    enabled: false
```

##apt
APTパッケージのマネジメントを実施する。
http://docs.ansible.com/ansible/latest/modules/apt_module.html?highlight=apt

```ruby:sample.yml
- name: Install apt docker
  apt:
    name: "{{ item }}"
    update_cache: yes
    force: yes
  with_items:
    - docker-engine 
    - python-setuptools
    - apt-utils
    - python-pip
```
with itemsは、 "{{ item }}"の部分に代入されてaptで繰り返しインストールしてくれる。


##apt_repository
UbuntuとDebianのAPT(Advanced Package Tool)のレポジトリを追加、削除する。
http://docs.ansible.com/ansible/latest/modules/apt_repository_module.html?highlight=apt_repository

```ruby:sample.yml
- name: Add apt-repogitory for docker
  apt_repository:
    repo: "deb https://apt.dockerproject.org/repo ubuntu-xenial main"
    update_cache: yes
```


##pip
依存関係にあるPythonのライブラリの管理。
http://docs.ansible.com/ansible/latest/modules/pip_module.html?highlight=pip

```ruby:sample.yml
- name: pip install
  pip:
    name: "{{ item }}"
  with_items:
    - docker-compose
    - docker
    - dockerpty
    - PyYAML
  ignore_errors: yes
```


##git
gitのレポジトリの管理。destのディレクトリの中身に、repoで指定した箇所のファイルが入る。
http://docs.ansible.com/ansible/latest/modules/git_module.html?highlight=git

```ruby:sample.yml
- name: download n
  git: 
    repo: "{{ n_repo }}"
    dest: /tmp/n
```


##docker image<br>
Dockerのimagesを、Build, load or pullする。
http://docs.ansible.com/ansible/latest/modules/docker_image_module.html?highlight=docker_image <br> 

```ruby:sample.yml
- name: pull an image
  docker_image:
    name: hyperledger/fabric-ca:x86_64-1.0.5
```
NameはたぶんDockerHubにあるイメージの名前をそのまま指定する。
Tagでつけるバージョンについても、dockerhubのhyperledger/fabric-caのページにある、tagsのページに記載がある。


ホストにある、compose-ymlのテンプレートのファイル名とディレクトリの場所を指定して、コントロールされる側に送る。

##docker_service
docker composeファイルを使った、startしたりshutdownしたり、servicesをscaleしたりする。とりあえず、ディレクトリ指定して、docker-compose.ymlを実行するものだという理解でよい。
http://docs.ansible.com/ansible/latest/modules/docker_service_module.html?highlight=docker_service

```ruby:sample.yml
- name: Deploy the CA using docker compose
  docker_service:
    project_src: ~/
    files: docker-compose.yml
```