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是基于已知文件结构自动加载某些变量文件,任务和处理程序的方法。按角色对内容进行分组,适合构建复杂的部署环境。文章来源:https://www.toymoban.com/news/detail-415166.html
ansible-galaxy init 文章来源地址https://www.toymoban.com/news/detail-415166.html
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
```
到了这里,关于ansible 基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!