ansible简介

ansible 安装

1. git安装

1
2
3
git clone git://github.com/ansible/ansible.git --recursive 
cd ./ansible source
./hacking/env-setup

2. yum/apt 安装

1
2
# yum install -y epel-release
yum/apt install ansible

3. pip 安装

1
2
3
4
yum install python3-pip python3-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel
pip3 install --upgrade pip3
pip3 install ansible --upgrade

确认安装

1
2
3
4
5
6
7
root@DESKTOP-R0OV00O:/etc/ansible# ansible --version
ansible 2.9.6
config file = /etc/ansible/ansible.cfg
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0]

ansible 相关文件

1
2
3
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性 
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录

ansible.cfg 详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[defaults] 
inventory = /etc/ansible/hosts # 主机列表配置文件
library = /usr/share/my_modules/ # 库⽂件存放目录
remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录 # 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户
$HOME/.ansible/tmp/ansible-tmp-数字/XXX.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,默认 True, 建议使用 False
log_path=/var/log/ansible.log #日志文件路径,建议启用
module_name = command #默认模块,可以修改为shell模块

inventory 主机清单示例

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
[k8s]
192.168.43.10[1:5] # 即为 192.168.43.101,192.168.43.102,192.168.43.103,192.168.43.104,192.168.43.105

[k8s_master]
192.168.43.101
192.168.43.104
192.168.43.105

[k8s_node]
192.168.43.102
192.168.43.103

[vps]
tj.imwl.ml:8822 # 加端口号
api.imwl.ga

[password]
192.168.43.10[1:5] ansible_ssh_user=root ansible_ssh_pass=12345678 # 账号密码

# vars 是固定关键字写法
[k8s_node:vars]
ansible_ssh_user=root
ansible_ssh_pass=12345678

[vps:vars]
ansible_ssh_user=root
ansible_ssh_pass=123456

ansile 主要命令

1
2
3
4
5
6
7
8
9
10
/usr/bin/ansible   主程序,临时命令执行工具 
/usr/bin/ansible-config
/usr/bin/ansible-connection
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-inventory
/usr/bin/ansible-playbook 定制自动化任务,编排剧本⼯具
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具

ansible 命令执行过程

  1. 加载自己的配置文件默认 /etc/ansible/ansible.cfg
  2. 加载自己对应的模块文件,如:command
  3. 通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器的对应执行用户 $HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY 文件
  4. 给文件 +x 执行
  5. 执行并返回结果
  6. 删除临时 py 文件,退出

实战

配置无秘登录192.168.100[1:200]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
ssh-keygen -f ~/.ssh/id_rsa -N '' -t rsa -q -b 2048
NET=192.168.100
read -s -p $"please input password : " password
export SSHPASS=$password

for IP in {1..200};do
sshpass -e ssh-copy-id -p 22 $(whoami)@$NET.$IP
done

for IP in {1..200};do
scp -P 22 -r ~/.ssh $(whoami)@$NET.$IP:~/
done

for IP in {1..200};do
ssh -p 22 $(whoami)@$NET.$IP "hostnamectl set-hostname k8s$IP; uname -n"
done

Playbook核心元素

  1. Hosts : 执行的远程主机列表

  2. Tasks : 任务集

  3. Variables : 内置变量或自定义变量在playbook中调用

  4. Templates : 模板,可替换模板文件中的变量并实现一些简单逻辑的文件

  5. Handlersnotify结 合使用 : 由特定条件触发的操作,满足条件方才执行,否则不执行

  6. tag : 标签, 指定某条任务执行,用于选择运行 playbook 中的部分代码。ansible 具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过 tags 跳过此些代码片断

templetes

roles

roles 就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地 include 它们的一种机制。角色一般用于基于主机构建服务的场景

每个角色,以特定的层级目录结构进行组织

roles 目录结构:

1
2
playbook.yml
roles/ project/ tasks/ files/ vars/ templates/ handlers/ default/ meta/

Roles 各目录作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
roles/project : 项目名称

roles/project/:项目名称,有以下子目录

files/:存放由copy或script模块等调用的文件

templates/:template模块查找所需要模板文件的目录

tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含

default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低

roles 的目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 nginx-role.yml
roles/
└──nginx
├──files
│ └──main.yml
├──tasks
│ ├──groupadd.yml
│ ├──install.yml
│ ├──main.yml
│ ├──restart.yml
│ └──useradd.yml
└──vars
└──main.yml
```

### role 测试

nginx-role.yml

  • hosts:websrvs
    remote_user:root
    roles:
    -{role:nginx,tags:[‘nginx’,’web’],when:ansible_distribution_major_version==”6“}
    -{role:httpd,tags:['httpd','web']}-{role:mysql,tags:['mysql','db']}
    -{role:mariadb,tags:['mariadb','db']}
    
    `

执行

ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml