> 文章列表 > ansible 基本使用

ansible 基本使用

ansible 基本使用

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: webserversvars:http_port: 80server_name: www.ctnrs.comremote_user: rootgather_facts: falsetasks:- name: 安装nginx最新版yum: pkg=nginx state=latest- name: 写入nginx配置文件template: src=httpd.conf dest=/etc/nginx/nginx.confnotify:- restart nginx- name: 确保nginx正在运行service: name=nginx state=startedhandlers:- name: restart nginxservice: 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: webserversvars:http_port: 80server_name: www.ctnrs.comremote_user: rootgather_facts: falsetasks:- name: 安装nginx最新版yum: pkg=nginx state=latest- name: 写入nginx配置文件template: src=httpd.conf dest=/etc/nginx/nginx.confnotify:- restart nginx- name: 确保nginx正在运行service: name=nginx state=startedhandlers:- name: restart nginxservice: 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: webserversremote_user: lizhenliangbecome: yesbecome_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: webserversvars:http_port: 80server_name: www.ctnrs.com
```- Register变量```
- shell: /usr/bin/uptimeregister: result
- debug: var=result
``` 3、任务列表每个play包含一系列任务。这些任务按照顺序执行,在play中,所有主机都会执行相同的任务指令。play目的是将选择的主机映射到任务。```tasks:- name: 安装nginx最新版yum: pkg=nginx state=latest
``` 4、任务控制如果你有一个大的剧本,那么能够在不运行整个剧本的情况下运行特定部分可能会很有用。```tasks:- name: 安装nginx最新版yum: pkg=nginx state=latesttags: install- name: 写入nginx配置文件template: src=/srv/httpd.j2 dest=/etc/nginx/nginx.conftags: 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=wheelwith_items:- testuser1- testuser2
``````
- name: 解压copy: src={{ item }} dest=/tmpwith_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.ymlwhen: ansible_facts['os_family']|lower == 'redhat'
- import_tasks: debian.ymlwhen: 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: webserversroles:- common- webservers定义多个:
- name: 0gather_facts: falsehosts: all roles:- common- name: 1gather_facts: falsehosts: all roles:- webservers
``` 3、角色控制```
- name: 0.系统初始化gather_facts: falsehosts: all roles:- commontags: common 
```