ansible介绍:

   ansible是一种IT自动化工具。可以配置系统、部署软件以及协调高级的IT任务,如持续部署、滚动更新。

  使用文档: https://docs.ansible.com/ 

  安装Ansible:yum install ansible -y

概念:

    Invertory: ansible 管理的主机信息,包括ip、ssh端口、账号、密码等

   modules: 任务都有模块来完成,可以自定义模块。主要有:shell、file、service等

  plugins: 使用插件增加ansible核心功能,自身提供很多插件、可以自定义插件。例如connection插件,用于连接目标主机。

  playbooks: ansiable的核心功能,定义一系列任务、供外部使用。

ansible命令:

    ansible all -m ping

   其中all是invertory, ping是module, -m是指定module

   常用模块查看:

   ansible-doc –l 查看所有模块

   ansible-doc –s copy 查看模块文档

playbook:

   Playbooks是Ansible的配置,部署和编排语言。他们可以描述您希望在远程机器做哪些事或者描述IT流程中一系列步骤。使用易读的YAML格式组织Playbook文件。与adhoc任务执行模式相比,Playbooks使用ansible是一种完全不同的方式,并且功能特别强大。

---
- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
  remote_user: root
  gather_facts: false
  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
  - name: 写入nginx配置文件
    template: src=httpd.conf dest=/etc/nginx/nginx.conf
    notify:
    - restart nginx
  - name: 确保nginx正在运行
    service: name=nginx state=started
  handlers:
    - name: restart nginx
      service: name=nginx state=reloaded
```

```
...
    server {
        listen       {{ inventory_hostname }}:{{ http_port }} default_server;
        server_name  {{ server_name }};
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
    }

...


---
- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
  remote_user: root
  gather_facts: false
  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
  - name: 写入nginx配置文件
    template: src=httpd.conf dest=/etc/nginx/nginx.conf
    notify:
    - restart nginx
  - name: 确保nginx正在运行
    service: name=nginx state=started
  handlers:
    - name: restart nginx
      service: name=nginx state=reloaded
```

```
...
    server {
        listen       {{ inventory_hostname }}:{{ http_port }} default_server;
        server_name  {{ server_name }};
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
    }

...
```



### 1、主机和用户

```
- hosts: webservers
  remote_user: lizhenliang
  become: yes
  become_user: root
```

### 2、定义变量

变量是应用于多个主机的便捷方式; 实际在主机执行之前,变量会对每个主机添加,然后在执行中引用。

- **命令行传递**

  ```
  -e VAR=VALUE
  ```

- **主机变量与组变量**

在Inventory中定义变量。

```
[webservers]
192.168.1.100 ansible_ssh_user=root hostname=web1
192.168.1.100 ansible_ssh_user=root hostname=web2

[webservers:vars]
ansible_ssh_user=root hostname=web1
```

- **单文件存储**

Ansible中的首选做法是不将变量存储在Inventory中。

除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。

组变量:

group_vars 存放的是组变量

group_vars/all.yml  表示所有主机有效,等同于[all:vars]

grous_vars/etcd.yml 表示etcd组主机有效,等同于[etcd:vars]

```
# vi /etc/ansible/group_vars/all.yml
work_dir: /data
# vi /etc/ansible/host_vars/webservers.yml
nginx_port: 80
```

- **在Playbook中定义**

```
- hosts: webservers
  vars:
    http_port: 80
    server_name: www.ctnrs.com
```

- **Register变量**

```
- shell: /usr/bin/uptime
  register: result
- debug: var=result
```

### 3、任务列表

每个play包含一系列任务。这些任务按照顺序执行,在play中,所有主机都会执行相同的任务指令。play目的是将选择的主机映射到任务。

```
  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
```

### 4、任务控制

如果你有一个大的剧本,那么能够在不运行整个剧本的情况下运行特定部分可能会很有用。

```
  tasks:
  - name: 安装nginx最新版
    yum: pkg=nginx state=latest
    tags: install
  - name: 写入nginx配置文件
    template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conf
    tags: config
```

使用:

```
ansible-playbook example.yml --tags "install"
ansible-playbook example.yml --tags "install,config"
ansible-playbook example.yml --skip-tags "install"
```

### 5、流程控制

条件:

```
tasks:
- name: 只在192.168.1.100运行任务
  debug: msg="{{ansible_default_ipv4.address}}"
  when: ansible_default_ipv4.address == '192.168.1.100'
```

循环:

```
tasks:
- name: 批量创建用户
  user: name={{ item }} state=present groups=wheel
  with_items:
     - testuser1
     - testuser2
```

```
- name: 解压
  copy: src={{ item }} dest=/tmp
  with_fileglob:
    - "*.txt"
```

常用循环语句:

|   语句   |  描述    |
| ---- | ---- |
| with_items    | 标准循环     |
| with_fileglob | 遍历目录文件 |
| with_dict     | 遍历字典     |

### 6、模板(template)

 *Jinja*2是基于python的模板引擎 

```
 vars:
    domain: "www.ctnrs.com"
 tasks:
  - name: 写入nginx配置文件
    template: src=/srv/server.j2 dest=/etc/nginx/conf.d/server.conf
```

```
# server.j2
{% set domain_name = domain %}
server {
   listen 80;
   server_name {{ domain_name }};
   location / {
        root /usr/share/html;
   }
}
```

在jinja里使用ansible变量直接 {{ }}引用。使用ansible变量赋值jinja变量不用{{ }}引用。

**定义变量**:

```
{% set local_ip = inventory_hostname %}
```

**条件和循环**:

```
{% set list=['one', 'two', 'three'] %}
{% for i in list %}
	{% if i == 'two' %}
		-> two
	{% elif loop.index == 3 %}
		-> 3
	{% else %}
		{{i}}
	{% endif %}
{% endfor %}
```

roles:

 Roles是基于已知文件结构自动加载某些变量文件,任务和处理程序的方法。按角色对内容进行分组,适合构建复杂的部署环境。

ansible-galaxy  init 

Roles目录结构:

```
site.yml
webservers.yml
fooservers.yml
roles/
   common/
     tasks/
     handlers/
     files/
     templates/
     vars/
     defaults/
     meta/
   webservers/
     tasks/
     defaults/
     meta/
```

- `tasks` -包含角色要执行的任务的主要列表。
- `handlers` -包含处理程序,此角色甚至在此角色之外的任何地方都可以使用这些处理程序。
- `defaults`-角色的默认变量
- `vars`-角色的其他变量
- `files` -包含可以通过此角色部署的文件。
- `templates` -包含可以通过此角色部署的模板。
- `meta`-为此角色定义一些元数据。请参阅下面的更多细节。



通常的做法是从`tasks/main.yml`文件中包含特定于平台的任务:

```
# roles/webservers/tasks/main.yml
- name: added in 2.4, previously you used 'include'
  import_tasks: redhat.yml
  when: ansible_facts['os_family']|lower == 'redhat'
- import_tasks: debian.yml
  when: ansible_facts['os_family']|lower == 'debian'

# roles/webservers/tasks/redhat.yml
- yum:
    name: "httpd"
    state: present

# roles/webservers/tasks/debian.yml
- apt:
    name: "apache2"
    state: present
```

### 2、使用角色

```
# site.yml
- hosts: webservers
  roles:
    - common
    - webservers


定义多个:
- name: 0
  gather_facts: false
  hosts: all 
  roles:
    - common

- name: 1
  gather_facts: false
  hosts: all 
  roles:
    - webservers
```

### 3、角色控制

```
- name: 0.系统初始化
  gather_facts: false
  hosts: all 
  roles:
    - common
  tags: common 
```