Featured image of post Ansible 一篇文章搞定

Ansible 一篇文章搞定

Ansible 介绍和基本操作

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不能作为主控

四、安装

  • epel源rpm包安装

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

1
ansible-galaxy list

下载对应的 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 模块

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计