ansible自动化实验步骤

ansible自动化实验步骤


ansible

  • ansible 并非一个服务,无需长期运行,可以称之为控制机,基于python 2.7.5版本研发,如果后期安装更高版本python时需要保留旧版安装新版的python,保证ansible正常运行,python多版本运行。

ansible模块

范例:ansible实验应用场景

安装及测试

1:准备实验环境:这里准备四台虚拟机:

1
2
3
4
5
6
7
8
一台centos7 作为ansible堡垒机  
两台redhat7 作为被控制端
一台centos6 作为被控制端

堡垒机ip:192.168.131.184:主机名;ansible
客户机centos6 ip:192.168.131.129:主机名:centos6
客户机redhat ip:192.168.131.173:主机名:redhat
客户机redhat1 ip:192.168.131.185:主机名:redhat7

2:堡垒机安装ansible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
堡垒机安装ansible服务,是基于epel源的,实验前提,虚拟机是可以连接互联网,已经配置好yum源

[root@ansible ~]# yum install ansible -y
[root@ansible ~]# rpm -ql ansible | less
/etc/ansible/ansible.cfg 主配置文件
/etc/ansible/hosts 主机清单
/usr/bin/ansible 可执行程序(软连接方便升级)
[root@ansible ~]# ll /usr/bin/ansible
lrwxrwxrwx. 1 root root 20 Mar 15 23:44 /usr/bin/ansible -> /usr/bin/ansible-2.7

确认ansible已经安装以及查看ansible的版本

[root@ansible ~]# ansible --version
ansible 2.7.8
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, Apr 11 2018, 07:36:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]

2:编辑堡垒机上安装的ansible配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
堡垒机的主机清单/etc/ansible/hosts,要想让堡垒机去管理其他主机,就要将被管理的主机ip加入主机清单内

[root@ansible ~]# vim /etc/ansible/hosts
192.168.131.129 单个ip写法/也支持写域名
192.168.131.173
192.168.131.185

[websrvs] 分组写法
192.168.131.129
192.168.131.173

[appsrvs] 分组写法 [组名] 也支持这种写法,代表17和27主机ip
192.168.131.173 192.168.131.[1:2]7
192.168.131.185

修改ansible的配置文件,首先启用ansible的日志信息

[root@ansible ~]# vim /etc/ansible/ansible.cfg
log_path = /var/log/ansible.log 日志信息,默认未启用,设置为启用

查看所有的模块

[root@ansible ~]# ansible-doc -l

3:解析ansible的配置文件,保持默认值就可以完成工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@ansible ~]# vim /etc/ansible/ansible.cfg
[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 远程主机临时文件
#local_tmp = ~/.ansible/tmp 本地主机临时文件
#forks = 5 并发执行数
#poll_interval = 15 拉取间隔
#sudo_user = root 以谁的身份在远程执行
#ask_sudo_pass = True 是否询问sudo口令(默认询问)
#ask_pass = True 是否询问执行身份的口令(默认询问)
#transport = smart 传输协议
#remote_port = 22 远程默认端口
#module_lang = C
#module_set_locale = False 使用的默认语言
log_path = /var/log/ansible.log 日志信息,默认未启用,设置为启用 #启用日志功能

因为ansible不是一个服务,所以改完配置文件无需重启服务。

模块演示

范例:简述ping模块,及实验模块基于key验证

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
列出某个模块的说明 

ping模块:测试主机清单中的ip的主机是否于堡垒机知否可以正常通讯
查看ping模块的说明
[root@ansible ~]# ansible-doc ping
[root@ansible ~]# ansible 192.168.131.129 -m ping(第一次登陆基于ssh验证)

想要使得主机取消ssh连接的账户密码验证修改ansible的配置文件
[root@ansible ~]# vim /etc/ansible/ansible.cfg
#uncomment this to disable SSH key host checking
host_key_checking = False

再次执行ping模块(错误原为为ansible默认为key验证)
[root@ansible ~]# ansible 192.168.131.129 -m ping
192.168.131.129 | UNREACHABLE! => {
"changed": false,
想要解决错误可是使用-k选项 提示ssh连接输入连接用户的密码
[root@ansible ~]# ansible 192.168.131.129 -m ping -k
SSH password:
192.168.131.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}

脚本实现基于key验证,避免每次输口令,决绝对端主机口令不一致的现象
主机清单:
[root@ansible ~]# cat iplist.sh
192.168.131.129
192.168.131.173
192.168.131.185
安装expect
[root@ansible ~]# yum install expect -y
脚本:
[root@ansible ~]# cat keyssh.sh
#!/bin/bash
user=root
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
while read line ;do
ip=$line
password=123456
expect << EOF
set timeout 10
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$password\n" }
}
expect eof
EOF
done < iplist.sh

[root@ansible ~]# bash keyssh.sh

ping模块基于key验证验证堡垒机是否与被控制端是否正常通讯
[root@ansible ~]# ansible all -m ping
192.168.131.129 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.131.173 | SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.131.185 | SUCCESS => {
"changed": false,
"ping": "pong"
}

范例:ansible常用模块Command :在远程主机执行linux命令(默认模块)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
在centos6被控制主机上有一个文件
[root@centos6 ~]# ls
a.txt

在控制机上使用command模块删除centos6上的文件 (系统模块名称可省略)
[root@ansible ~]# ansible 192.168.131.129 -m command -a 'rm -f /root/a.txt'
[WARNING]: Consider using file module with state=absent rather than running rm

192.168.131.129 | SUCCESS | rc=0 >>

查看所有被控制机上的主机列表
[root@ansible ~]# ansible all -m command -a 'getent passwd'
模块名称可省略
[root@ansible ~]# ansible 192.168.131.129 -a 'getent passwd'

在centos6被控制机上创建用户
[root@ansible ~]# ansible 192.168.131.129 -a 'useradd user11'
192.168.131.129 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible 192.168.131.129 -a 'getent passwd user11'
192.168.131.129 | SUCCESS | rc=0 >>
user11:x:501:501::/home/user11:/bin/bash

范例:ansible常用模块shell :在远程主机执行linux命令

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
31
32
33
查看shell模块帮助
[root@ansible ~]# ansible-doc -s shell

在centos6上使用shell模块改用户的口令
[root@ansible ~]# ansible 192.168.131.129 -m shell -a 'echo daizhe | passwd --stdin daizhe'
192.168.131.129 | SUCCESS | rc=0 >>
Changing password for user daizhe.
passwd: all authentication tokens updated successfully.

显示所有被控制端的主机名
[root@ansible ~]# ansible all -m shell -a 'echo $HOSTNAME'
192.168.131.129 | SUCCESS | rc=0 >>
centos6.com
192.168.131.173 | SUCCESS | rc=0 >>
redhat.com
192.168.131.185 | SUCCESS | rc=0 >>
redhat7.com

将所有被控制机的/data目录下的所有文件删除 chdir
[root@ansible ~]# ansible all -m shell -a 'chdir=/data rm -rf *'
[WARNING]: Consider using file module with state=absent rather than running rm
192.168.131.129 | SUCCESS | rc=0 >>
192.168.131.173 | SUCCESS | rc=0 >>
192.168.131.185 | SUCCESS | rc=0 >>
[root@ansible ~]# ansible all -m shell -a 'chdir=/data ls'
192.168.131.129 | SUCCESS | rc=0 >>
192.168.131.173 | SUCCESS | rc=0 >>
192.168.131.185 | SUCCESS | rc=0 >>


ansible默认模块为command ,shell 模块比较好用我们可以将shell模块设置为默认模块,编辑ansible配置文件
[root@ansible ~]# vim /etc/ansible/ansible.cfg
module_name = shell

范例:使用Script 脚本模块 实现将控制端的脚本在所有被控制端的主机上执行一下

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
31
查看帮助
[root@ansible ~]# ansible-doc -s script
- name: Runs a local script on a remote node after transferring it

脚本:将所有被控制的主机上将selinux修改为disabled
[root@ansible ~]# cat selinux.sh
#!/bin/bash
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

[root@ansible ~]# ansible all -m script -a "/root/selinux.sh"
192.168.131.173 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.131.173 closed.\r\n",
"stdout": "",
"stdout_lines": []
}
192.168.131.129 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.131.129 closed.\r\n",
"stdout": "",
"stdout_lines": []
}
192.168.131.185 | SUCCESS => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.131.185 closed.\r\n",
"stdout": "",
"stdout_lines": []
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
shell模块和script模块中都存在的模块用法
creates:如果已经存在此步骤不执行
removes:如果存在,此步骤执行

fstab文件存在,则后续命令则不执行
[root@ansible ~]# ansible all -a "creates=/etc/fstab rm -rf /data/*"
192.168.131.129 | SUCCESS | rc=0 >>
skipped, since /etc/fstab exists
192.168.131.173 | SUCCESS | rc=0 >>
skipped, since /etc/fstab exists
192.168.131.185 | SUCCESS | rc=0 >>
skipped, since /etc/fstab exists

[root@ansible ~]# ansible all -a "removes=/etc/fstab rm -rf /data/*"
[WARNING]: Consider using file module with state=absent rather than running rm
192.168.131.129 | SUCCESS | rc=0 >>
192.168.131.173 | SUCCESS | rc=0 >>
192.168.131.185 | SUCCESS | rc=0 >>

范例:copy模块

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
将控制机上的fstab文件保留原名,发送到所有被控制端的主机上,并修改文件的所有者,并设置权限
[root@ansible ~]# ansible all -m copy -a "src=/etc/fstab dest=/root/ owner=daizhe mode=600"

确认是否成功
[root@ansible ~]# ansible all -m shell -a 'ls -l /root/fstab'
192.168.131.129 | SUCCESS | rc=0 >>
-rw-------. 1 daizhe root 595 Nov 22 07:38 /root/fstab
...

root@centos6 ~]# ll /root/fstab
-rw-------. 1 daizhe root 595 Nov 22 07:38 /root/fstab
....

将控制机上的fstab文件保留原名,发送到所有被控制端的主机上,并修改文件的所有者,并设置权限,如果对方有此文件,则先备份再进行修改
[root@ansible ~]# ansible all -m copy -a "src=/etc/fstab dest=/root/ owner=daizhe mode=600 backup=yes"

拷贝主机上的文件夹到所有的控制端
[root@ansible ~]# ansible all -m copy -a "src=/data dest=/root/"

使用copy模块中的content 生成所有被控制端的yum配置文件
[root@ansible ~]# ansible 192.168.131.173 -m copy -a 'content="[haha]\nbaseurl=https://mirrors.aliyun.com/epel/7/x86_64/\ngpgcheck=0\nenabled=1" dest=/etc/yum.repos.d/haha.repo'
192.168.131.173 | SUCCESS => {
"changed": true,
"checksum": "0d7ffdd1ba1b53d2b4f3540fc8e77a1ba40b4232",
"dest": "/etc/yum.repos.d/haha.repo",
"gid": 0,
"group": "root",
"md5sum": "e74dc0b9c50a24d884dc8e8d5d71438b",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:system_conf_t:s0",
"size": 77,
"src": "/root/.ansible/tmp/ansible-tmp-1542855358.21-118898081082202/source",
"state": "file",
"uid": 0
}

确认是否生成
[root@ansible ~]# ansible 192.168.131.173 -a 'cat /etc/yum.repos.d/haha.repo'
192.168.131.173 | SUCCESS | rc=0 >>
[haha]
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
enabled=1

范例:fetch模块

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
从被控的主机上抓取主机名文件到本地
[root@ansible ~]# ansible all -m fetch -a 'src=/etc/hosts dest=/data/'
192.168.131.129 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/data/192.168.131.129/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
}
192.168.131.173 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/data/192.168.131.173/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
}
192.168.131.185 | SUCCESS => {
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/data/192.168.131.185/etc/hosts",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"remote_checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"remote_md5sum": null
}
[root@ansible ~]# cd /data
[root@ansible data]# ls
192.168.131.129 192.168.131.173 192.168.131.185

fetch 模板不支持抓取目录
想要实现将被控制端的/data目录抓取到本机
打包
[root@ansible ~]# ansible all -m shell -a 'tar cf /root/data.tar /data'
[WARNING]: Consider using unarchive module rather than running tar
192.168.131.129 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names
192.168.131.173 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names
192.168.131.185 | SUCCESS | rc=0 >>
tar: Removing leading `/' from member names

抓取
[root@ansible ~]# ansible all -m fetch -a 'src=/root/data.tar dest=/root'

范例:file模块

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
path:指定创建文件的路径
state:指定对文件进行的操作
touch:对文件进行创建操作
absent:删除操作
link:创建连接文件、软连接
hard:创建硬链接
dest=path=name 意义相同,目标创建的文件
再所有被管理的终端上的/data目录上创建文件
[root@ansible ~]# ansible all -m file -a 'path=/data/file state=touch'

删除上面创建的文件
[root@ansible ~]# ansible all -m file -a 'path=/data/file state=absent'

再被管理终端上创建连接文件
[root@ansible ~]# ansible all -a 'ls /data'
192.168.131.129 | SUCCESS | rc=0 >>
fstab
192.168.131.173 | SUCCESS | rc=0 >>
fstab
192.168.131.185 | SUCCESS | rc=0 >>
fstab

对所有终端上的/data/fstab文件创建连接(软连接)
[root@ansible ~]# ansible all -m file -a 'src=/data/fstab path=/data/fstab.link state=link'
[root@ansible ~]# ansible all -a 'ls -l /data'
192.168.131.129 | SUCCESS | rc=0 >>
total 4
-rw-r--r--. 1 root root 595 Nov 22 08:02 fstab
lrwxrwxrwx. 1 root root 11 Nov 22 08:20 fstab.link -> /data/fstab
....

[root@ansible ~]# ansible all -a 'ls -l /data'
192.168.131.129 | SUCCESS | rc=0 >>
total 8
-rw-r--r--. 2 root root 595 Nov 22 08:02 fstab
-rw-r--r--. 2 root root 595 Nov 22 08:02 fstab2.link

在被控制端创建文件夹路径为/data/datadir
[root@ansible ~]# ansible all -m file -a 'dest=/data/datadir state=directory'
[root@ansible ~]# ansible all -a 'ls -l /data/'
192.168.131.129 | SUCCESS | rc=0 >>
drwxr-xr-x. 2 root root 4096 Nov 22 08:26 datadir

删除被控制的目录/文件
[root@ansible ~]# ansible all -m file -a 'dest=/data/datadir state=absent'

范例:Hostname模块

1
2
3
4
5
6
7
8
修改单独被控制端的主机名
[root@ansible ~]# ansible 192.168.131.173 -m hostname -a 'name=redhat6'

查看 立即生效
hosts文件未进行更改
[root@ansible ~]# ansible 192.168.131.173 -a 'hostname'
192.168.131.173 | SUCCESS | rc=0 >>
redhat6

范例:Cron模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
设定计划任务,周六日,每五分钟执行一次,执行同步时间操作
[root@ansible ~]# ansible 192.168.131.173 -m cron -a 'minute=*/5 weekday=0,6 job="/usr/sbin/ntpdate 172.18.0.1 &> /dev/null" name=tongbu'

[root@redhat ~]# crontab -l
#Ansible: tongbu
*/5 * * * 0,6 /usr/sbin/ntpdate 172.18.0.1 &> /dev/null

禁用被控制端的计划任务
[root@ansible ~]# ansible 192.168.131.173 -m cron -a 'minute=*/5 weekday=0,6 job="/usr/sbin/ntpdate 172.18.0.1 &> /dev/null" name=tongbu disbaled=ture'

再次启用
[root@ansible ~]# ansible 192.168.131.173 -m cron -a 'minute=*/5 weekday=0,6 job="/usr/sbin/ntpdate 172.18.0.1 &> /dev/null" name=tongbu disbaled=false'

彻底铲除此计划任务
[root@ansible ~]# ansible 192.168.131.173 -m cron -a 'name=tongbu state=sbsent'

范例:Yum模块,前提被控制机上 yum 是已经配置好的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name=  指定包的名称

使用yum模板在被管理终端上安装htop包
[root@ansible ~]# ansible 192.168.131.173 -m yum -a 'name=htop'

一次安装多个包,前提是,在原来本机上未安装
[root@ansible ~]# ansible all -a 'rpm -q http,vsftpd,memcached'
[root@ansible ~]# ansible all -m yum -a 'name=httpd,vsftpd,memcached'

卸载被管理机上的应用程序
[root@ansible ~]# ansible all -m yum -a 'name=httpd state=absent'

更新被管理机yum缓存,同时安装 httpd包
[root@ansible ~]# ansible all -m yum -a 'name=httpd update_cache=yes'

范例:service模块

1
2
3
4
5
6
7
8
9
10
11
启动被管理端的http服务
[root@ansible ~]# ansible 192.168.131.173 -m service -a 'name=httpd state=started'

关闭服务
[root@ansible ~]# ansible 192.168.131.173 -m service -a 'name=httpd state=stopped

设置为开机启动
[root@ansible ~]# ansible 192.168.131.173 -m service -a 'name=httpd state=started enabled=yes'

systemctl is-enabled httpd
chkconfig --list httpd

范例:user模块

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
31
32
name= 指定用户名
comment= 描述信息
uid= 设定uid
home= 设定家目录
group= 制定主组
groups= 设定附加组
shell=指定shell类型
remove=yes 删除家目录文件
system=yes 设置系统用户、系统组

在被管理终端上创建用户,并指定属性
[root@ansible ~]# ansible all -m user -a 'name=haha comment="test user" uid=2000 home=/data/ group=root groups=bin shell=/sbin/nologin'

确定用户是否创建
[root@ansible ~]# ansible all -a 'getent passwd haha'
192.168.131.129 | SUCCESS | rc=0 >>
haha:x:2000:0:test user:/data/:/sbin/nologin
.....

删除被管理终端的用户haha,删除家目录,但是不删除家目录的文件
[root@ansible ~]# ansible all -m user -a 'name=haha state=absent'
192.168.131.173 | SUCCESS => {
"changed": true,
"force": false,
"name": "haha",
"remove": false,
"state": "absent"
}
.....

实现删除用户,也将用户的家目录和相关文件删除
[root@ansible ~]# ansible all -m user -a 'name=hahahaha state=absent remove=yes'

-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%