ansible环境搭建(常用模块使用)
Posted 爱敲代码的三毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ansible环境搭建(常用模块使用)相关的知识,希望对你有一定的参考价值。
文章目录
ansible
1. ansible是什么
ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特点:
- 默认使用ssh进行管理,基于python里的paramiko模块开发
- 管理端和被管理端不需要启动服务
- 部署简单,配置简单,功能强大,扩展性强
- 能过playbook(剧本)进行多个任务的编排
2. ansible环境搭建
环境准备
主机名 | ip | 身份 |
---|---|---|
master | 192.168.44.10 | 管理机 |
node1 | 192.168.44.20 | 被管理机 |
node2 | 192.168.44.30 | 被管理机 |
1.配置静态ip
2.设置主机名和主机名相互绑定
# vim /etc/hosts
...
192.168.44.10 master
192.168.44.20 node1
192.168.44.30 node2
3.关闭防火墙和SELinux
4.时间同步
# yum install -y ntp
# systemctl restart ntpd
# systemctl enable ntpd
5.配置yum源(需要epel源)
# yum -y install epel-release
# yum clean all
# yum makecache
过程
第1步: 管理机上安装ansible,被管理节点必须打开ssh服务.
[root@master ~]# yum install ansible
[root@master ~]# 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, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
第2步: 实现master对agent的免密登录,只在master上做。(如果这一步不做,则在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码)
master# ssh-keygen
master# ssh-copy-id -i 192.168.44.20
master# ssh-copy-id -i 192.168.44.30
第3步: 在master上定义主机组,并测试连接
master# vim /etc/ansible/hosts
[group1]
192.168.44.20
192.16844.30
[root@master ~]# ansible -m ping group1
192.168.44.20 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
192.168.44.30 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
[root@master ~]# ansible -m ping all
192.168.44.30 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
192.168.44.20 | SUCCESS =>
"ansible_facts":
"discovered_interpreter_python": "/usr/bin/python"
,
"changed": false,
"ping": "pong"
3. 服务器分组
ansible通过一个主机清单功能来实现服务器分组。
Ansible的默认主机清单配置文件为/etc/ansible/hosts.
[test] 组名
apache[1:10].aaa.com 表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com 表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15] 表示10.1.1.11到10.1.1.15这5台机器
示例
[test]
10.1.1.13:2222 表示10.1.1.13这台,但ssh端口为2222
4. ansible模块
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
查看所有支持的模块
# ansible-doc -l
如果要查看ping模块的用法,使用下面命令(其它模块以此类推)
# ansible-doc ping
1)hostname模块
文档
hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)
将其中一远程主机名修改为 node1.test.com
[root@master ~]# ansible 192.168.44.20 -m hostname -a 'name=node1.test.com'
基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2"
可以到被修改的主机上用hostname
命令查看
2)file模块*
file模块用于对文件相关的操作(创建, 删除, 软硬链接等)
文档
注意:下面的操作,是管理机器操作,改变的被管理的机器
创建一个目录
[root@master ~]# ansible group1 -m file -a 'path=/test state=directory'
创建一个文件
[root@master ~]# ansible group1 -m file -a 'path=/test/file1 state=touch'
递归修改递归修改owner,group,mode
[root@master ~]# ansible group1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'
删除目录(连同目录里的所有文件)
[root@master ~]# ansible group1 -m file -a 'path=/test state=absent'
创建文件并指定owner,group,mode等
[root@master ~]# ansible group1 -m file -a 'path=/tmp/file1 state=touch owner=bin group=daemon mode=1777'
删除文件
[root@master ~]# ansible group1 -m file -a 'path=/tmp/file1 state=absent'
创建软链接文件
[root@master ~]# ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'
创建硬链接文件
[root@master ~]# ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'
3)copy模块*
copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)
文档
在master上准备一个文件,拷贝此文件到group1组的所有机器上(把本机的file拷贝到组里的机器上,改名file2)
[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2'
使用content参数直接往远程文件里写内容(会覆盖原内容)
[root@master ~]# ansible group1 -m copy -a 'content="Java\\n" dest=/tmp/file2'
# 注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题
使用force参数控制是否强制覆盖
# 如果被控制主机已经存在 file2文件就不覆盖
[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2 force=no'
如果目标文件已经存在,则会强制覆盖
[root@master ~]# ansible group1 -m copy -a 'src=/tmp/file1 dest=/tmp/file2 force=yes'
使用backup参数控制是否备份文件
backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
group1的机器上会将/tmp/file2备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/file2
[root@master ~]# ansible group1 -m copy -a 'src=/etc/fstab dest=/tmp/file2 backup=yes owner=daemon group=daemon mode=1777'
opy模块拷贝时要注意拷贝目录后面是否带"/"符号
# /etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
[root@master ~] # ansible group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'
# /etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
[root@master ~] # ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'
3) stat模块stat模块类似linux的stat命令,用于获取文件的状态信息。
获取/etc/fstab文件的状态信息
[root@master ~]# ansible group1 -m stat -a 'path=/etc/fstab'
4) template模块
与copy模块功能几乎一样.
template模块首先使用变量渲染jinja2模板文件成普通文件,然后再复制过去.而copy模块不支持.(jinja2是一个基于python的模板引擎)
文档
[root@master ~]# ansible -m template group1 -a "src=/etc/hosts dest=/tmp/hosts"
注意:template模块不能拷贝目录
5)fetch模块
etch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。
文档
第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)
[root@node1 ~]# echo "test Java" > /tmp/test.txt
[root@node2 ~]# echo "test linux" > /tmp/test.txt
第2步: 从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)
[root@master ~]# ansible group1 -m fetch -a 'src=/tmp/test.txt dest=/tmp/'
192.168.44.30 | CHANGED =>
"changed": true,
"checksum": "745f03caffbd25bc42cfb2611e782f78c009fa25",
"dest": "/tmp/192.168.44.30/tmp/test.txt", # 192.168.44.30的在这里
"md5sum": "154bf345581682d39742a7538967263a",
"remote_checksum": "745f03caffbd25bc42cfb2611e782f78c009fa25",
"remote_md5sum": null
192.168.44.20 | CHANGED =>
"changed": true,
"checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771",
"dest": "/tmp/192.168.44.20/tmp/test.txt", # 192.168.44.20的在这里
"md5sum": "9cba24d13afebc8d5b916bf83d968120",
"remote_checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771",
"remote_md5sum": null
第3步: 先删除上面fetch过来的, 然后尝试只fetch其中一台机器的,也会使用名称来做子目录区分
[root@master tmp]# rm /tmp/192.168.44.* -rf
[root@master tmp]# ansible 192.168.44.20 -m fetch -a 'src=/tmp/test.txt dest=/tmp/'
192.168.44.20 | CHANGED =>
"changed": true,
"checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771",
"dest": "/tmp/192.168.44.20/tmp/test.txt",
"md5sum": "9cba24d13afebc8d5b916bf83d968120",
"remote_checksum": "c768d732082d5f05df2ea7d3d09080e8d9e10771",
"remote_md5sum": null
注意: fetch模块不能从远程拷贝目录到本地
6) user模块
user模块用于管理用户账号和用户属性
文档
创建test用户,默认为普通用户,创建家目录
[root@master tmp]# ansible group1 -m user -a 'name=test state=present'
创建my_user系统用户,并且登录shell环境为/sbin/nologin
[root@master tmp]# ansible group1 -m user -a 'name=my_user state=present system=yes shell="/sbin/nologin"'
创建linux用户, 使用uid参数指定uid, 使用password参数传密码
# 密码哈希
[root@master tmp]# echo 123456789 | openssl passwd -1 -stdin
$1$IRNUtMXp$XRcAsmWTNNYLh.VAt1e2Q0
[root@master tmp]# ansible group1 -m user -a 'name=linux uid=2022 state=present password="$1$IRNUtMXp$XRcAsmWTNNYLh.VAt1e2Q0"'
创建一个普通用户叫hadoop,并产生空密码密钥对
[root@master tmp]# ansible group1 -m user -a 'name=hadop generate_ssh_key=yes'
删除test用户,但家目录默认没有删除
[root@master tmp]# ansible group1 -m user -a 'name=test state=absent'
删除my_user用户,使用remove=yes参数让其删除用户的同时也删除家目录
[root@master tmp]# ansible group1 -m user -a 'name=my_user state=absent remove=yes'
7) group模块
group模块用于管理用户组和用户组属性。
文档
创建组
[root@master tmp]# ansible group1 -m group -a 'name=groupa gid=3000 state=present'
删除组(如果有用户的gid为此组,则删除不了)
[root@master tmp]# ansible group1 -m group -a 'name=groupa state=absent'
8) cron模块
cron模块用于管理周期性时间任务
文档
创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*
[root@master tmp]# ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/file1" minute=*/2'
删除cron任务
[root@master tmp]# ansible group1 -m cron -a 'name="test cron1" state=absent
9) yum_repository模块
yum_repository模块用于配置yum仓库。
文档
增加一个/etc/yum.repos.d/local.repo配置文件
[root@master tmp]# ansible group1 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
# mount /dev/cdrom /mnt
删除/etc/yum.repos.d/local.repo配置文件
[root@master tmp]# ansible group1 -m yum_repository -a "name=local state=absent"
9) yum模块*
yum模块用于使用yum命令来实现软件包的安装与卸载
文档
使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)
ansible group1 -m yum -a 'name=vsftpd state=present'
使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本
[root@master tmp]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'
使用yum卸载httpd,httpd-devel软件
[root@master tmp]# ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'
10) service模块
service模块用于控制服务的启动,关闭,开机自启动等。
文档
启动vsftpd服务,并设为开机自动启动
[root@master tmp] # ansible group1 -m service -a 'name=vsftpd state=started enabled=on'
关闭vsftpd服务,并设为开机不自动启动
[root@master tmp] # ansible group1 -m service -a 'name=vsftpd state=stopped enabled=false'
11) script模块
script模块用于在远程机器上执行本地脚本
文档
在master上准备一个脚本
#!/bin/bash
mkdir /tmp/file_dir
touch /tmp/file_dir/file1..10
在group1的远程机器里都执行master上的/tmp/touch.sh脚本(此脚本不用给执行权限)
[root@master tmp]# ansible group1 -m script -a '/tmp/touch.sh'
12)command与shell模块
两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。
shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)
[root@master tmp]# ansible -m command group1 -a "useradd test_user"
[root@master tmp]# ansible -m command group1 -a "id test_user"
master# ansible -m command group1 -a "cat /etc/passwd |wc -l" --报错
master# ansible -m shell group1 -a "cat /etc/passwd |wc -l" --成功
master# ansible -m command group1 -a "cd $HOME;pwd" --报错
master# ansible -m shell group1 -a "cd $HOME;pwd" --成功
注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好
以上是关于ansible环境搭建(常用模块使用)的主要内容,如果未能解决你的问题,请参考以下文章