ansible 入门安装及配置

ansible 简介

ansible整体软件架构图

Ansible 在管理节点将 Ansible 模块通过 SSH 协议(或者 Kerberos、LDAP)推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排

ansible-整体架构图

  1. 管理端支持local 、ssh、zeromq 三种方式连接被管理端,默认使用基于ssh的连接。
  2. 可以按应用类型等方式进行Host Inventory(主机群)分类,管理节点通过各类模块实现相应的操作。单个模块,单条命令的批量执行,我们可以称之为ad-hoc;
  3. 管理节点可以通过playbooks 实现多个task的集合实现一类功能,如web服务的安装部署、数据库服务器的批量备份等。playbooks我们可以简单的理解为,系统通过组合多条ad-hoc操作的配置文件。

ansible 软件基本架构

ansible-软件架构图

远程调用管理模块,从Inventory里调用主机名字, ssh远端服务器执行命令,执行完成返回结果。

ansible特性

  1. 基于python语言实现, 模块化设计 ,调用特定的模块来完成特定任务 ,本身是核心组件,短小精悍 。

  2. 由Paramiko来实现创建ssh连接,基于ssh协议连接每一个被管理主机。

  3. YAML格式是基于PyYAML模块来实现功能的,因为这个模块还支持模板语言,所以还需要jinjia2模板语言。

  4. 由Paramiko,PyYAML和Jinjia2三个关键模块。

  5. no agents:部署简单,不需要在被管控主机上安装任何客户端;

  6. no server:无服务器端,使用时直接运行命令即可;

  7. modules in any languages:支持自定义模块,基于“模块”完成各种“任务”,支持各种可使用任意语言开发模块;

  8. yaml,not code:使用yaml语言定制剧本playbook;

  9. ssh by default:,使用SSH协议并基于SSH工作(基于密钥认证或在inventory文件中指定账号和密码);

  10. strong multi-tier solution:可实现多级指挥。

ansible的任务执行流程

  1. 读取配置。
  2. 抓取全量机器&分组列表 – 可从多个静态文件、文件夹、脚本中读取机器,分组及其变关联量信息。
  3. 使用host-pattern过滤机器列表。
  4. 根据参数确定执行模块和配置–从modules目录动态读取,用户可以自行开发模块。
  5. Runner执行返回。
    • Connection环节定义连接方式 => Action阶段机器列表(Lookup plugin Action变量/文件等资源的获取)。
    • Callback plugin各阶段的钩子调用。
  6. 输出结束。
    • Filter plugin过滤算子。
    • Callback plugin各阶段的钩子调用。

实战安装ansible

master端 配置免密钥登录

1
2
3
ssh-keygen -t dsa  ## 生成密钥
ls .ssh/
authorized_keys id_dsa id_dsa.pub

拷贝id_dsa.pub文件到远程主机的authorized_keys中。

1
scp -P 52113 niu@192.168.56.13:~

在slave端配置

1
2
3
4
5
6
mkdir .ssh
mv id_dsa.pub .ssh/
cd .ssh/
cat id_dsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh

测试本机是否可以正常执行

1
2
3
ssh -p 52113 niu@192.168.56.13
Last login: Mon Jun 4 14:50:09 2018 from 192.168.56.12
[niu@linux-node3 ~18:14:49]$

开始安装ansible服务器端,需要配置epel源

1
2
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install ansible -y

开始编辑hosts文件,默认存放在/etc/ansible目录中 vim /etc/ansible/hosts

1
2
3
4
5
[test]
192.168.56.13
[test:vars]
ansible_ssh_user="niu"
ansible_ssh_port=52113

由于我修改了ssh端口,并禁止了root登录,所以我们需要定义登录用户,及ssh端口号。

测试主机是否能够ping通。

1
2
3
4
5
 ansible test -m ping
192.168.56.13 | SUCCESS => {
"changed": false,
"ping": "pong"
}

编写配置文件

ansible config文件查找路径

ANSIBLE_CONFIG (环境变量中的设置)
ansible.cfg (当前目录下的ansiblee.cfg)
~/.ansible.cfg (家目录下)
/etc/ansible/ansible.cfg (全局目录)

常用配置参数

  • transport 默认参数:smart,可选参数 ssh,paramiko ,如果使用smart ansible则会自动选择。
  • remote_user 设置目标计算机的登录用户。如果为空白,它将使用连接插件的默认值,通常是当前正在执行Ansible的用户。
  • remote_port 在远程连接中使用的端口,空白时将使用默认的连接插件。
  • forks 连接远程主机的时候最大开启进程数。
  • stdout_callback 设置默认回调是使用的stdout
  • jinja2_extensions jinja2的扩展参数
  • library 自定义扩展模块地址
  • roles_path ansible role文件的搜索路径使用:隔开。默认配置 ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles

参考文档

ansible 官方文档
Ansible入门
Ansible中文权威指南
Ansible5:常用模块
ansible超详细使用指南
ansible实践
ansible-first-book

报错汇总

报错一:提示sudo命令将要被停止。

1
2
[DEPRECATION WARNING]: The sudo command line option has been deprecated in favor of the "become" command line arguments. This
feature will be removed in version 2.6. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node2 ~14:12:01]#ansible -s test -m file -a 'path=/tmp/test-niu state=touch'
192.168.56.13 | SUCCESS => {
"changed": true,
"dest": "/tmp/test-niu",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}

解决办法: -s 替换成–become

1
2
3
4
5
6
7
8
9
10
11
12
ansible test -m file -a 'path=/data/app/1.txt state=touch' --become
192.168.56.13 | SUCCESS => {
"changed": true,
"dest": "/data/app/1.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"size": 0,
"state": "file",
"uid": 0
}

格式错误

1
fatal: [linux-node2]: FAILED! => {"changed": false, "checksum": "823af87241d8f906a4c23d6e0f90aebf9620ccc3", "msg": "Unsupported parameters for (copy) module: user Supported parameters include: attributes, backup, checksum, content, delimiter, dest, directory_mode, follow, force, group, local_follow, mode, original_basename, owner, regexp, remote_src, selevel, serole, setype, seuser, src, unsafe_writes, validate"}

原始文件

1
2
- name: config dns server
template: src=resolv.conf dest=/etc/resolv.conf mode=644 user=root group=root

解决办法

1
2
- name: config dns server
template: src=resolv.conf dest=/etc/resolv.conf mode=644 owner=root group=root

执行提示字符编码不对

1
ERROR! Unexpected Exception, this is probably a bug: 'ascii' codec can't decode byte 0xe6 in position 8: ordinal not in range(128)

因为inventory 里面编写了一个中文的md文档,导致的报错。
将中文文档移除,问题解决。