实验环境
主机 | ip |
---|---|
server1(主控端) | 172.25.6.1 |
server2(节点) | 172.25.6.2 |
server3(节点) | 172.25.6.3 |
一、环境部署
ansible的配置文件:
- /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
- /etc/ansible/hosts 主机清单
- /etc/ansible/roles/ 存放角色的目录
1.下载ansible所需要的相关rpm包及其依赖包,进行安装
ansible-2.7.8-1.el7.noarch.rpm
ansible-tower-setup-bundle-3.4.2-1.el7.tar.gz
libtomcrypt-1.17-25.el7.x86_64.rpm
libtommath-0.42.0-5.el7.x86_64.rpm
python2-crypto-2.6.1-13.el7.x86_64.rpm
python2-jmespath-0.9.0-1.el7.noarch.rpm
python-httplib2-0.9.2-0.1.el7.noarch.rpm
python-keyczar-0.71c-2.el7.noarch.rpm
python-paramiko-2.1.1-0.9.el7.noarch.rpm
sshpass-1.06-1.el7.x86_64.rpm
[root@server1 ansible]# yum install -y *
2.编辑/etc/hosts文件,添加本地解析(因为ansible的连接是通过ssh)
[root@server1 ~]# vim /etc/hosts
3.添加普通用户使用ansible
[root@server1 ~]# useradd devops
[root@server1 ~]# su - devops
[devops@server1 ~]$ mkdir ansible
[devops@server1 ~]$ cd ansible/
[devops@server1 ansible]$ ls
[devops@server1 ansible]$
4.编辑ansible主配置文件
[devops@server1 ansible]$ vim ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg
[defaults]
inventory = inventory 管理主机的清单
5.设置ansible主机
[devops@server1 ansible]$ vim inventory
[devops@server1 ansible]$ cat inventory
[test]
server2
[db]
server3
[webservers:children]
test
db
[devops@server1 ansible]$
6.给两个节点server2和server3同样添加devops用户,并且设置密码
[root@server2 ~]# useradd devops
[root@server2 ~]# passwd devops
[root@server3 ~]# useradd devops
[root@server3 ~]# passwd devops
7.设置ssh免密登陆
[devops@server1 ansible]$ ssh-keygen
[devops@server1 ansible]$ ssh-copy-id server2
[devops@server1 ansible]$ ssh-copy-id server3
下面使用的密码为前面设置的devops密码
8.测试ansible
- 查看所有的节点
- 测试所有的ansible节点是否可以ping通
二、ansible常用参数及命令
参数 | 功能 |
---|---|
-m | 要执行的模块,默认为command |
-a | 指定模块的参数 |
-u | ssh连接的用户名,默认用root,ansible.cfg中可以配置 |
-b,–become | 变成那个用户身份,不提示密码 |
-k | 提示输入ssh登录密码,当使用密码验证的时候用 |
-s | sudo运行 |
-U | sudo到哪个用户,默认为root |
-K | 提示输入sudo密码,当不是NOPASSWD模式时使用 |
-C | 只是测试一下会改变什么内容,不会真正去执行 |
-c | 连接类型(default=smart) |
-f | fork多少进程并发处理,默认为5个 |
-i | 指定hosts文件路径,默认default=/etc/ansible/hosts |
-I | 指定pattern,对已匹配的主机中再过滤一次 |
-list-host | 只打印有哪些主机会执行这个命令,不会实际执行 |
-M | 要执行的模块路径,默认为/usr/share/ansible |
-o | 压缩输出,摘要输出 |
–private-key | 私钥路径 |
-T | ssh连接超时时间,默认是10秒 |
-t | 日志输出到该目录,日志文件名以主机命名 |
-v | 显示详细日志 |
2.常用命令
ansible server2 -m setup ##查看指定主机server1上的facts变量信息
ansible all -m setup ##查看指定的所有主机上的facts变量信息
ansible '*' -m setup ##同上
ansible-doc -l ##列出有哪些可用的模块,按q退出
ansible-doc -l | wc -l ##列出有多少个可用的模块
ansible-doc user ##查看user模块的帮助文档,按q退出。也可以在最后一行输入/passwd,来过滤与passwd有关的内容
ansible test -a 'df -h' ##在test组执行df -h命令
三、ansible常用模块
1.默认模块command
一般来说如果-m后面没有加模块则默认使用command模块
2.copy模块
[devops@server1 ansible]$ ansible test -m copy -a 'src=/etc/passwd dest=/tmp/passwd'
##src源地址,dest为节点主机目标地址
查看是否将本机文件复制到server2上
3.file模块
查看server2的/tmp下的文件权限(刚刚复制过去的文件)
查看权限
4.yum模块
需要注意的是我们在使用yum的时候普通用户是要有sudo权限的
因此先设置server2和server3中devops用户的sudo权限
[root@server2 ~]# vim /etc/sudoers #保存退出时如果显示权力不够,则加wq!强制保存即可
[root@server3 ~]# vim /etc/sudoers
权限设置好以后,尝试在server2上安装httpd服务
[devops@server1 ansible]$ ansible test -m yum -a 'name=httpd state=present' -b
##一定要加-b,指定sudo,否则回报错
查看是否下载成功
[devops@server1 ansible]$ ansible test -a 'rpm -q httpd'
当然如果不愿意加-b去特别指定的话,我们也可以修改主配置文件,给与sudo所需要的权限
[devops@server1 ansible]$ vim ansible.cfg
[devops@server1 ansible]$ cat ansible.cfg
[defaults]
inventory = inventory
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
我们去尝试在server2和server3上都安装httpd,不加参数-b
[devops@server1 ansible]$ ansible webservers -m yum -a 'name=httpd state=present'
5.service模块
启动db(server3)的httpd服务
[devops@server1 ansible]$ ansible db -m service -a 'name=httpd state=started'
我们给它写一个默认发布界面,方便我们测试
[devops@server1 ansible]$ ansible db -m copy -a 'content="hello world\n" dest=/var/www/html/index.html'
6.firewalld防火墙模块
首先,开启防火墙
[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=started enabled=true'
测试:
我们把httpd服务加入防火墙的白名单:
[devops@server1 ansible]$ ansible db -m firewalld -a 'service=http state=enabled permanent=yes immediate=yes'
关闭防火墙
[devops@server1 ansible]$ ansible db -m service -a 'name=firewalld state=stopped enabled=false'