---
# System prepended metadata

title: Ansible

---

# Ansible

### 構成管理ツールの目的
* インフラ構築として、特にOS及びMWにかかる作業時間が劇的に短縮される
* 構成管理ツールの設定ファイルにコメントを入れることで、変更履歴が管理できる
* 構成管理ツールの設定ファイルを流用することで、一定の品質確保や属人化の排除により、だれが作っても同じサーバを構築することができる
### 構築サーバ
| サーバ| ipアドレス|
|---|---|
|Ansible| 192.168.223.2|
|Web| 192.168.223.3 |

内部ネットワークで接続

### 導入方法
```yum install -y epel-release```
```yum install -y ansible```
### サーバを立てる
```
sed -i "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo
```
### 構築対象サーバとssh疎通させる
構築対象サーバが以下の場合
```
OS    : CentOS7
IP    : 10.210.104.24
DNS   : 8.8.8.8
```

Ansibleサーバでssh鍵を生成し、鍵一式を対象サーバへ送る
```
ssh-keygen
scp /root/.ssh/id_rsa.pub root@192.168.100.3:/root/.ssh
```

対象サーバでPubkeyAuthenticationを有効にする
```
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
# vi /etc/ssh/sshd_config
// PubAuthentication yes
# systemctl restart sshd
```

### 作成する設定ファイル
```
/etc/ansible/
    |----- ansible.cfg    # ansible自体の設定ファイル
    |----- hosts          # ansibleで管理するリモートホストの一覧
    |----- roles/         # ansibleに実行させるyaml形式の設定ファイル置き場
```

### 設定ファイルの作成
```
[root@localhost]# cp -av /etc/ansible/hosts{,_org}
## デフォルトの記載を消して空にする
:> /etc/ansible/hosts

## 空のファイルに新しく記入
[root@localhost]# vi /etc/ansible/hosts
[target]
targetnode ansible_host=192.168.100.3
```
ansibleコマンド経由でlocalhostへ接続できるか確認
```
[root@localhost ansible]# ansible all -i hosts -m ping
targetnode | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
```

### playbookの作成
| コマンド| 意味 |
|---|---|
| name| 何のタスクなのかの記入|
| stat| 指定したファイルが存在するか調べる|
| path | 対象のパスを示す|
| register| タスクの実行結果を変数として保存|
| copy | srcをdestにコピーする|
| notify | handlersに記載されている同名のタスクを実行する
#### tree
```
[root@Kensyo ansible]# tree --charset=C
.
|-- ansible.cfg
|-- hosts
|-- roles
|   |-- firewall
|   |   |-- handlers
|   |   |   |-- main.yml
|   |   |-- tasks
|   |       |-- firewall.yml
|   |       |-- main.yml
|   |-- httpd
|   |   |-- handlers
|   |   |   |-- main.yml
|   |   |-- tasks
|   |   |   |-- configuration.yml
|   |   |   |-- install.yml
|   |   |   |-- main.yml
|   |   |-- templates
|   |   |   |-- httpd.conf.j2
|   |   |-- vars
|   |       |-- main.yml
|   |-- selinux
|       |-- handlers
|       |   |-- main.yml
|       |-- tasks
|           |-- main.yml
|           |-- selinux.yml
|-- site.yml
```
#### httpdタスクの作成
※ymlを作るときはtab使用禁止！！！
```
[root@localhost]# vi roles/httpd/tasks/install.yml
- name: httpdのインストールを行います
  yum:
    name: httpd
    state: present
```
* configファイルの修正をするタスクを作成
```
[root@localhost]# vi roles/httpd/tasks/configuratino.yml
- name: バックアップの確認をします。 /etc/httpd/confi/httpd.conf
  stat:
    path: /etc/httpd.conf.org
  register: httpd_conf_org

- name: バックアップを取得します。
  copy:
    src: /etc/httpd/conf/httpd.conf
    dest: /etc/httpd/conf/httpd.conf.org
    remote_srt: yes
  when: not httpd_conf_org.stat.exists
  
- name: httpd.confの修正をします。
  template:
    src: httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
    owner: root
    owner: root
    mode: '0644'
  notify: start
- meta: flush_handlers
```

* main.ymlの作成
基本的にmain.ymlには設定値を記載せず、記載しているタスクを読み込ませる方が後々メンテナンスしやすい。
```
[root@localhost tasks]# vi main.yml
- import_tasks: install.yml
- import_tasks: configuration.yml
```

* tamplateの作成
```
[root@localhost templates]# vi httpd.conf.j2
{% for n in Listen_port %}
Listen {{ n.port }}
{% endfor %}
```
* templateで記載した変数をvarsで明示的に記載
```
[root@localhost vars]# vi main.yml
Listen_port:
  - port: 8080
```

* handlersの作成
```
[root@localhost handlers]# vi main.yml
- name: start
  service:
    name: httpd
    state: started
    enabled: yes
```

### firewallタスクの設定
```
[root@localhost tasks]# vi firewall.yml
- name: ポートを開放します
  firewalld:
    port: 8080/tcp
    zone: public
    permanent: yes
    state: enabled
  notify: reload

- meta: flush_handlers
```

* main.ymlの作成
```
[root@localhost tasks]# vi main.yml
- import_tasks: firewall.yml
```

* handlersの作成
```
[root@localhost handlers]# vi main.yml

- name: reload
  service:
    name: firewalld
    state: reloaded
```

### selinuxタスクの作成
```
[root@localhost tasks]# vi selinux.yml
- name: selinuxを無効にします
  selinux:
    state: disabled
    policy: targeted
  notify: reboot
[root@localhost tasks]# vi main.yml
- import_tasks: selinux.yml
```

* handlersの作成
```
[root@localhost handlers]# vi main.yml
- name: reboot
  reboot:
```

### site.ymlの作成
```
[root@localhost ansible]# vi site.yml
- hosts: all
  gather_facts: false
  remote_user: root
  roles:
    - httpd
    - firewall
    - selinux
```

### playbookの実行
```
[root@localhost ansible]# pwd
/etc/ansible
[root@localhost ansible]# ansible-playbook site.yml -i hosts -k
SSH password:
```



### 参考
[Ansible入門向けガイド](http://c.itdo.jp/technical-information/ansible/ansible-tutorial/#heading5)
[Ansibleの使い方](https://qiita.com/hana_shin/items/657a5cff495244465482)

[戻る](https://hackmd.io/@-SvoWUCGQWKrT6fOwGiTPA/HkOjXDE5_/edit)