Ansible

简介

Ansible is Simple IT Automation。ansible是一个简单的自动化运维工具,能够轻松实现配置、命令管理等常见运维工作。另外,它是一种Python语言开发的agentless工具,通过ssh服务连接被管理端,不需要在被管理端额外安装监管程序。这也意味着ansible主机的安全至关重要。

特征

模块化:调用特定的模块,完成特定任务
基于Python语言实现,调用了三个python模块:Paramiko,PyYAML(语法格式)和Jinja2(模板语言)三个关键模块
部署简单:agentless 即no agent 仅需要ssh服务链接即可
支持自定义模块
支持playbook
幂等性:执行一遍和十遍都是一样的
可以在epel源中直接应用

安装

# yum install epel-release ansible

配置文件

/etc/ansible/ansible.cfg # 配置文件
/etc/ansible/hosts # 主机列表
/etc/ansible/roles/ # 角色目录
rpm -ql ansible # 详情查看

主程序

ansible
ansible-doc
ansible-playbook

使用

ansible

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

<host-pattern> #指定运行命令的被管控端列表,在inventory文件(默认为/etc/ansible/hosts)中定义的组或”all”

-i PATH, –inventory=PATH #指定inventory文件位置。不指定则使用默认文件/etc/ansible/hosts

-f NUM, –forks=NUM #指定NUM个主机为一个批次,一同运行命令(数量较多的主机分批运行,以防止同时运行占用过多网络资源)

–private-key=PRIVATE_KEY_FILE #登录时使用的私钥文件位置

-m NAME, –module-name=NAME #模块名称

-M DIRECTORY, –module-path=DIRECTORY #模块搜索目录,默认在/usr/share/ansible/

-a 'ARGUMENTS', –args='ARGUMENTS' #模块参数,不同模块参数可能不同

-s, –sudo #以-u指定的用户身份sudo到root身份运行

-u USERNAME, –user=USERNAME #使用指定远程用户身份来运行命令,而不是当前用户

–list-hosts #显示<host-pattern>所匹配的用户列表

ansible-doc

ansible-doc -l # 获取ansible模块列表
ansible-doc -s MODULE_NAME #获取指定模块名使用帮助

ansible-playbook

ansible-playbook <filename.yml> … [options]

<filename.yml> #YAML文件位置

-t, TAGS, –tags=TAGS #当在yaml文件中定义由tag时,可以使用此指令指定只运行yaml文件中带有特定标签的部分

-e VARS, –extra-vars=VARS #自定义变量,可在yaml文件中调用

–check #测试运行,不“真实”运行

Ansible Playbooks

Playbooks是Ansible的配置/部署/任务编排使用的语言。
Ansible modules是负责具体任务的工具,playbooks负责设计和安排如何使用这些工具
Ansible playbooks的内容基于YAML语法
Ansible playbooks的官方配置用例请参考:https://github.com/ansible/ansible-examples
Ansible官方文档请参考:http://docs.ansible.com/ansible/index.html

实例

- host: all
remote_user: root
tasks:
- name: create user user1
user: name=user1 system=true uid=301
- name: create user user2
user: name=user2 system=true uid=302

缩进:使用两个空格表示父子关系,不要使用Tab
冒号:键值对以:分开,后面跟一个空格再跟value
短横杠-加一个空格,使用同样的缩进表示同一个KEY有多个value
YAML语法参考http://ansible-tran.readthedocs.io/en/latest/docs/YAMLSyntax.html#id1

playbook核心元素

Hosts		#被管控主机列表
Tastk #任务
Variables #变量,内置变量/自定义变量
Templates #模板,包含了模板语法的文本文件
Handlers #特定条件触发的任务
Roles #角色,运行的一类目标主机

playbook基础组件

模块:modules
通知:notify
标签:tags
变量:variables
模板:template
条件测试:when
循环:根据item进行迭代

template

template中使用Jinja2模板编程语言格式语法。实际上,模板只是普通文件中嵌入了Jinja2编程语言格式的变量、逻辑、算数运算而已。

字面量

字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[item1, item2, …]
元组:(item1, item2, …)
字典:{key1:value1, key2:value2, …}
布尔型:true/false

算数运算

+, -, *, /, %, //, **

比较操作

==, !=, >, >=, <, <=

逻辑运算

and, or, not

实例

cp /etc/nginx/nginx.conf /root/nginx.conf.j2

 #修改以下行:
worker_processes {{ ansible_processor_vcpus }};
vim nginx.yml
- hosts: all
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: copy nginx config file
template: src=/root/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: copyconf
handlers:
- name: restart nginx
service: name=nginx state=restarted
# ansible-playbook --check nginx.yml
// 测试运行
# ansible-playbook -t copyconf nginx.yml
// 仅运行tags为copyconf的任务,由于notify设置,handlers中的name为restart nginx的任务也会运行

条件测试

when语句:在task中使用,jinja2的语法格式的判断语句

tasks: 
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == "6"

循环

迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item”;而后,要在task中使用with_items给定要迭代的元素列表
列表方法:字符串、字典

- name: createdb
# 字符串列表
shell: mysql -e "create database {{ item }};"
with_items:
- typecho
- wordpress

- name: createuser
# 字典列表
shell: mysql -e "grant all on {{ item.dbname }}.* to '{{ item.username }}'@'{{ item.host }}' identified by '{{ item.password }}';"
with_items:
- { dbname: 'typecho', username: 'mrcc', password: 'mrcc.com', host: '172.18.56.73' }
- { dbname: 'wordpress', username: 'mrcc', password: 'mrcc.com', host: '172.18.56.74' }
- { dbname: 'typecho', username: 'mrcc', password: 'mrcc.com', host: '172.18.56.74' }
- { dbname: 'wordpress', username: 'mrcc', password: 'mrcc.com', host: '172.18.56.73' }

角色(roles)

每个角色以特定的目录结构组织

nginx/
├── default
├── files
│   └── hosts
├── handlers
│   └── main.yml
├── meta
├── tasks
│   └── main.yml
├── templates
│   ├── default.html.j2
│   └── nginx.conf.j2
└── vars

default/ 设定默认变量时使用此目录中的main.yml文件
files/ 存放由copy或script模块等调用的文件
handlers/ 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
meta/ 至少应该包含一个名为main.yml的文件;定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含
tasks/ 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
templates/ template模块查找所需要模板文件的目录
vars/ 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

角色调用

在playbook调用角色方法1:
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx

在playbook调用角色方法2:传递变量给角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
键role用于指定角色名称;后续的k/v用于传递变量给角色;

还可以基于条件测试实现角色调用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }

LKNAPM

看图意会
LKNAPM

下载地址
https://github.com/mrchain/mrchen/tree/upload/ansible_LKNAPM

# tar xvf LKNAPM.tar.xz -C /etc/ansible/

# ansible-playbook LKNAPM.yml