Ansible
一篇搞定,快速学习
一、特点
- 模块化: 调用特定的模块,完成特定的内容
- 使用 Paramiko(Python对于ssh的实现),PyYAML,Jinja2(模板语言) 三个关键模块
- 支持自定义模块,可以使用任何语言编写
- 基于Python实现
- 不是简单,基于Python和SSH,无agent,无需代理,不依赖PKI(无需SSL)
- 安全,基于OpenSSH
- 幂等性:一个任务执行一遍和N边结果是一样的(要注意代码逻辑)
- 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据机构
- 较强大的role的多层解决方案
二、架构
1
2
3
4
5
|
用户/PLAYBOOK => INVENTORY/API/MODULES/PLUGINS => HOSTS/NETWORK
INVEMTORY: Ansible管理主机的清单 /etc/ansible/hosts
MODULES: Ansible执行命令的功能模块、多数为内置核心模块,也可以自定义
PLUGINS: 模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等
API: 供第三方程序调用的应用程序接口
|
用户直接使用命令或者使用 Playbook 或者 调用API 去远程主机执行命令
三、注意事项
- 执行ansible的主机一般称为主控端,中控,master或堡垒机
- 主控段python需要在2.6或以上
- 被控端python版本小鱼2.4的需要安装 python-simplejson
- windows不能作为主控
四、安装
sudo yum -y install epel-release && sudo yum -y install ansible
1
2
3
4
5
6
7
8
|
ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
|
rpm -ql ansible
可以查看ansible都下载了哪些文件。
也可以在终端输入ansible 后Tab 键查看输出的命令
五、基本使用
准备机器
节点名称 |
节点IP |
角色 |
k8s-master-001 |
10.241.12.3 |
Ansible-Server |
k8s-master-003 |
10.241.12.1 |
被控制端 |
k8s-master-002 |
10.241.12.2 |
被控制端 |
k8s-node-003 |
10.241.12.9 |
被控制端 |
k8s-node-001 |
10.241.12.12 |
被控制端 |
anisble管理主机的方式
- Ad-HC 即利用ansible命令,主要用于临时命令场景
- Ansible-playbook 主要用于长期规划好的,大型项目的使用,需要有前期的规划过程。
配置文件
- /etc/ansible/ansible.cfg #主配置文件,配置ansible工作
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[defaults]
inventory = /etc/ansible/hosts #主机列表
library = /usr/share/my_modules #库文件存放目录
remote_tmp = $HOME/.ansible/tmp #临时 py 命令文件存放在远程主机目录
local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
forks = 5 #默认并发数量
sudo_user = root #默认sudo用户
ask_sudo_pass = True #每次执行ansible 命令是否询问ssh密码
ask_pass = True
remote_port =22
host_key_checking = False #检查对应服务器的host_key, 建议取消注释
log_path = /var/log/ansible.log #日志文件 建议启用
module_name = command #默认模块,可以修改为shell模块
|
- /etc/ansible/hosts #主机清单
为了批量快捷的管理部分主机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#举例子
#[标签名]
#ip1
#ip2
#ip3:222
#将下面的配置写入 /etc/ansible/hosts
[k8s-master]
#k8s-master-003
10.241.12.1
#k8s-master-002
10.241.12.2
[k8s-slave]
#k8s-node-003
10.241.12.9
#k8s-node-001
10.241.12.12
|
- /etc/ansible/role #存放角色
ansible-doc 命令文档
此命令用来显示模块的帮助文档
格式
1
2
3
4
5
|
ansible-doc [OPTION] [MODULE...]
-l , --list #列出可用模块
-s , --snippet #显示指定模块的playbook片段
例子
ansible-doc -s ping
|
ansible 命令
使用SSH协议实现对远程主机的配置。 所以主控端需要能基于密钥认证的方式联系哥哥被管理节点
1
2
3
4
5
6
7
|
#例如使用sshpass批量实现key的验证
ssh-keygen -f /root/.ssh/id_rsa -P ''
NET= 192.168.100
export SSHPASS=xxxx
for IP in {1..200};do
sshpass -e ssh-copy-id $NET.$IP
done
|
格式
1
|
ansible <host_pattern> [ -m module_name] [-a args]
|
重要选项说明
1
2
3
4
5
6
7
8
9
10
11
|
--version #显示版本
-m moudle #指定模块,默认为command
-v #详细过程 -vv -vvv 更加详细
--list-hosts #列出主机列表
-k, --ask-pass #提示输入ssh连接密码,默认key验证
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行远程命令的用户,默认10S
-u,--user=PEMOTE_USER #执行园长执行的用户
-b, --become #代替旧版的sudo 切换
--beconme-user=USERNAME #指定sudo的runas用户,默认为root
-K, --ask-becomne-pass #提示输入sudo时的口令
|
举例使用ping模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# ansible all -m ping 或者 ansible k8s-master#这里指定了hosts里写的标签组 -m ping
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
10.241.12.1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.241.12.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.241.12.2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.241.12.9 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
|
如果没有验证通过,需要 -k 来输入密码,很麻烦。所以建议使用秘钥。
选择特定主机
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@k8s-master-001 ~]# ansible all --list-hosts
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
hosts (4):
10.241.12.9
10.241.12.12
10.241.12.1
10.241.12.2
#或者指定标签组
[root@k8s-master-001 ~]# ansible k8s-master --list-hosts
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
hosts (2):
10.241.12.1
10.241.12.2
|
使用通配符指定主机
1
2
3
4
5
|
ansible '*' --list-hosts
ansible 10.241.* --list-hosts
ansible 10.241.12.1:10.241.12.2 --list-hosts #俩个机器中的一个 ,或者关系
ansible 'k8s-master:&k8s-node' --list-hosts #与的关系,在k8s-master标签组里也在k8s-node里面
ansible 'k8s-master:!k8s-node' --list-hosts #非得关系,在k8s-master标签组里但不在 k8s-node里面
|
正则表达式选择主机
1
|
ansible '~(k8s-master|k8s-node)' -m ping
|
Ansible 执行命令的过程
1.加载 默认的/etc/ansible/ansible.cfg
2.加载自己对应的模块文件,如 command
3.通过ansible将模块或者命令生成对应的临时py文件,将文件传输至远程服务器对应执行用户的$HOME/.ansible/tmp/ansible-tmp-数字/xxx.py
4.赋予执行权限
5.执行并且返回结果
6.删除py文件,退出
ansible执行的状态
在 /etc/ansible/ansible.cfg 的 [colers] 模块中有颜色的详细说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[colors]
#highlight = white
#verbose = blue
#warn = bright purple
#error = red
#debug = dark gray
#deprecate = purple
#skip = cyan
#unreachable = red
#ok = green
#changed = yellow
#diff_add = green
#diff_remove = red
#diff_lines = cyan
|
ansible-galaxy # ansible 使用别人下载的工具
此工具会链接 https://galaxy.ansible.com 下载对应的roles
列出已经安装的galaxy
下载对应的 roles
1
2
3
4
5
6
7
|
#
ansible-galaxy install pogosoftware.etcd
#返回内容"
#- downloading role 'etcd', owned by pogosoftware
#- downloading role from https://github.com/pogosoftware/ansible-role-etcd/archive/v1.0.2.tar.gz
#- extracting pogosoftware.etcd to /root/.ansible/roles/pogosoftware.etcd
#- pogosoftware.etcd (v1.0.2) was installed successfully
|
查看里面的roles结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
tree /root/.ansible/roles/pogosoftware.etcd
/root/.ansible/roles/pogosoftware.etcd
├── defaults
│ └── main.yml
├── handlers
│ └── main.yml
├── LICENSE
├── meta
│ └── main.yml
├── tasks
│ ├── etcd_user.yml
│ └── main.yml
└── templates
└── etcd.service.j2
5 directories, 7 files
#可以 cp -a 一个文件名称然后再里面改自己的定制化需求
|
删除galaxy
1
|
ansible-galaxy remove pogosoftware.etcd
|
ansible-pull
将ansible的命令推送至远程
ansible-palybook (后面有详解)
此工具用于编写好的playbook任务
1
2
3
4
5
6
7
8
9
10
|
cat hello.yml
- hosts: k8s-slave
remote_user: root
tasks:
- name: hello world
command: /usr/bin/wall hello world
#执行的时候记得打开 k8s-slave中的一个主机终端看效果
ansible k8s-slave --list-host
会发现终端输出了 hello world
|
ansible-vault 加密yml文件
1
2
3
4
5
6
|
ansible-vaut encrypt hello.yml #加密 会让输入加密口令
ansible-vaut decrypt hello.yml #解密
ansiblt-vault view hello.yml #查看
ansible-vault edit hello.yml #编辑加密文件
ansiblt-vault rekey hello.yml #修改口令
ansiblt-vault create new.yml #创建新文件
|
ansible-console 可交互命令
支持tab
提示符号格式:
1
|
执行用户@当前操作主机组(当期主机组的主机数量)[f:并发数]$
|
常用子命令:
- 设置并发数量:forks n 例如 forks 10
- 切换组: cd 主机组 例如 cd web
- 列出当前主机组例如 list
- 列出所有的内置命令: ? 或者help
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
ansible-console
[WARNING]: Invalid characters were found in group names but not replaced, use -vvvv to see details
Welcome to the ansible console.
Type help or ? to list commands.
root@all (4)[f:5]$ cd k8s-master
root@k8s-master (2)[f:5]$ list
10.241.12.1
10.241.12.2
root@k8s-master (2)[f:5]$ yum name=lftp
10.241.12.1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"msg": "",
"rc": 0,
"results": [
"lftp-4.4.8-12.el7_8.1.x86_64 providing lftp is already installed"
]
}
...
|
六、Ansible 常用模块
Command 模块