ansible入门

相关专业术语

1
2
3
IaaS	基础设施即服务
PaaS 平台即服务
SaaS 软件即服务

安装ansible
需要使用epel源安装

1
[root@ansible ~]#yum -y install ansible

ansible特性

1
2
3
4
5
6
7
8
9
10
11
12
模块化:调用特定的模块,完成特定的内容
有Paramiko,PyYAML,jinja2(模板语言)三个关键模块
支持自定义模块
基于python语言实现
部署简单,基于python和SSH,agentless(无代理)-w
安全,基于openssh
支持playbook编排任务
幂等性,一个任务执行一边和n遍效果一样不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言编写模块
YAML格式,编排任务,支持丰富的数据结构
交强大的多层解决方案

Ansible主要组成部分

INVENTORY(主机清单)

存放在/etc/ansible/hosts

查看主机清单中的主机数

1
[root@ansible ~]#ansible all --list-hosts

查看主机清单中某个分组的主机数

1
[root@ansible ~]#ansible groupname --list-hosts

查看即在A组又在B组中的主机数

1
[root@ansible ~]#ansible "A:&B" --list-hosts

查看A组合B租中的所有有主机数

1
[root@ansible ~]#ansible "A:B" --list-hosts

查看在A组中却不在B组中的主机数

1
[root@ansible ~]#ansible 'A:!B' --list-hosts

有叹号只能用单引号

ansible配置文件修改以提高工作效率

ansible配置文件中的默认值说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[defaults]

# some basic default values...

#inventory = /etc/ansible/hosts #主机清单文件
#library = /usr/share/my_modules/ #库文件存放目录
#module_utils = /usr/share/my_module_utils/ #模块存放路径
#remote_tmp = ~/.ansible/tmp #远程执行py命令文件临时存放目录
#local_tmp = ~/.ansible/tmp #本地命令文件临时存放目录
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml #插件
#forks = 5 #默认并发数
#poll_interval = 15 #拉取间隔
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False

启用ansible日志功能

1
[root@ansible ~]#sed -i -r '/log_path/s/#(.*)/\1/' /etc/ansible/ansible.cfg

禁用ssh_key检查

1
[root@ansible ~]#sed -i -r '/ssh_key_checking/s/#(.*)/\1/' /etc/ansible/ansible.cfg

ansible命令的执行过程

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

命令执行状态

1
2
3
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做改变
红色:执行失败

ansible系列命令

ansible-vault 给敏感文件加密或解密

1
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]

ansible-console
可交互执行命令

ansible-galaxy

连接https://galaxy.ansible.com 下载响应的roles

列出所有已经安装的Galaxy
ansible-galaxy list

安装Galaxy
ansible-galaxy install roles-name

ansible常见模块介绍

修改默认模块

1
[root@ansible ~]#sed -i -r '/module_name/s/.*/module_name = shell/' /etc/ansible/ansible.cfg

command模块

在远程主机执行linux命令

shell模块

script模块

调用脚本在远程主机执行

使用方法

1
[root@ansible ~]#ansible all -m script -a "脚本的绝对路径"

copy模块

将服务器文件复制到客户端

使用案例:将本机/root/playbook/install_nginx.yml文件拷贝到websrvs组各主机的/data目录下,并制定权限和属主,如果木变主机存在同名文件,则先备份后复制。

1
[root@ansible ~]#ansible websrvs -m copy -a "src=/root/playbook/install_nginx.yml dest=/data/ mode=644 owner=msq backup=yes"

fetch模块

从客户端呢拉取文件至服务器,与copy模块功能相反,目录可先打包tar

使用案例,将websrvs组中的主机上/data目录中的install_nginx.yml文件拉取到本机的/data目录下

1
[root@ansible ~]#ansible websrvs -m fetch -a 'src=/data/install_nginx.yml dest=/data/'

此时/data目录结构是这样的

1
2
3
4
5
6
7
8
9
10
[root@ansible ~]#tree /data/
/data/
├── 192.168.34.106
│   └── data
│   └── install_nginx.yml
└── 192.168.34.108
└── data
└── install_nginx.yml

4 directories, 2 files

说明:从目标主机拉取文件,会放到指定dest下以目标主机ip为名字的文件夹下

file模块

设置文件属性

使用案例1:将websrvs组中的主机的/data/install_nginx.yml文件的属主改为msq,权限设为600.
开始其属性如下:

1
2
3
4
5
6
[root@ansible ~]#ansible websrvs -a 'ls -l /data/install_nginx.yml'
192.168.34.106 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 145 Nov 21 20:39 /data/install_nginx.yml

192.168.34.108 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 145 Nov 21 20:38 /data/install_nginx.yml

更改属性:

1
[root@ansible ~]#ansible websrvs -m file -a 'path=/data/install_nginx.yml owner=msq mode=600'

之后在查看:

1
2
3
4
5
6
[root@ansible ~]#ansible websrvs -a 'ls -l /data/install_nginx.yml'
192.168.34.106 | CHANGED | rc=0 >>
-rw------- 1 msq root 145 Nov 21 20:39 /data/install_nginx.yml

192.168.34.108 | CHANGED | rc=0 >>
-rw------- 1 msq root 145 Nov 21 20:38 /data/install_nginx.yml

使用案例2:为websrvs组的各主机上的/data/install_nginx.yml文件创建软连接

创建测试文件

1
[root@ansible ~]#ansible websrvs -m file -a 'dest=/data/f1 state=touch'

创建软连接

1
[root@ansible ~]#ansible websrvs -m file -a 'src=/data/f1 dest=/data/f1.link state=link'

cron模块

管理计划任务

使用案例:为主机列表中的额所有主机设置定时任务

1
[root@ansible ~]#ansible all -m cron -a 'name=synctime minute=*/5 job="ntpdate 192.168.34.103 &> /dev/null"'

临时禁用上一步设置的定时任务

1
[root@ansible ~]#ansible all -m cron -a 'name=synctime minute=*/5 job="ntpdate 192.168.34.103 &> /dev/null" disabled=yes'

再启用刚才禁用的计划任务

1
[root@ansible ~]#ansible all -m cron -a 'name=synctime minute=*/5 job="ntpdate 192.168.34.103 &> /dev/null" disabled=false'

禁用的时候,不能只加name,需要加计划任务的内容

永久删除该计划任务

1
[root@ansible ~]#ansible all -m cron -a 'name=synctime minute=*/5 job="ntpdate 192.168.34.103 &> /dev/null" state=absent'

删除的时候可以只加name

yum模块

利用yum管理安装包

使用案例1:安装NGINX

1
[root@ansible ~]#ansible all -m yum -a 'name=nginx'

使用案例2:删除NGINX,连带删除安装NGINX是安装的依赖包

1
[root@ansible ~]#ansible all -m yum -a 'name=nginx autoremove=yes'

service模块

管理服务

开启服务,并加入开机自启动

1
[root@ansible ~]#ansiblde websrvs -m service -a 'name=httpd state=started enabled=yes'

除此之外,state还有restarted reload stop 等各种状态。

user模块

管理用户

创建用户test,并指定uid,主组,从组,家目录,shell,描述,

1
[root@ansible ~]#ansible websrvs -m user -a 'name=test uid=1024 group=root groups=msq shell=/bin/csh comment="this is a test" '

删除用户连带删除家目录

1
[root@ansible ~]#ansible websrvs -m user -a 'name=test state=absent remove=yes'