说在前面
在本文中会讲一些注意事项,以及一些常用模块!学会了本节的知识,相信能让你对ansibel有更加深刻的了解,以及为后面ansible实战案例打下坚实的基础~
环境介绍
本例会使用三台机器
主机名 IP 角色
node1 172.25.1.1 控制节点
node2 172.25.1.2 被控节点
node5 172.25.1.5 被控节点
不知道读者是否还记得,我之前说过,Ansible 比较便捷,只需在控制节点安装ansible即可,无需在被控节点安装任何软件。
我已经安装在node1节点安装好ansible了,不会安装的话请点击我查看安装ansible教程
先来讲讲Ansible的一些注意事项
可以这样说吧,在生产环境中,我们一般不会使用root用户去完成日常工作吧,一般来说管理员会给你一个普通用户,你通过这个普通用户去完成你的日常任务,所以我们也会使用一个普通用户去完成ansible相关操作!
管理员会给普通用户一些权限,让其有资格去访问相应的文件目录,去执行某些命令,由于是自己玩,实验演示,为了方便,我就给这个普通用户授予root权限~
我先创建root用户的ansible管理目录,用于方便我批量创建用户,设置密码~
[root@node1 ~]# mkdir /root/ansible
[root@node1 ~]# cd /root/ansible/
[root@node1 ansible]# vim ansible.cfg
[root@node1 ansible]# cat ansible.cfg
[defaults]
inventory = ./hosts
[root@node1 ansible]# vim hosts
[root@node1 ansible]# cat hosts
[node2]
172.25.1.2
[node5]
172.25.1.5
[localhost]
172.25.1.1
测试一下连通性,all代表所有主机, -k 代表着输入密码,由于ansible只能输入一次密码,所以要求各节点root用户密码一致, -m 是指定模块,其实使用 ping 模块根本不需要加 -k ,在此处加上 -k 参数只是为了多讲解一个参数而已~
批量建立ansible用户,一般来说为了不引起不必要的权限麻烦,全平台同一用户 id 一致
[root@node1 ansible]# ansible all -a 'useradd ansible -u 1002' -k
- -a 可执行shell命令,实话实说,好用得一批
建立用户了再给一个密码,当然密码也是同一的~
- 我试图用ansible来执行shell命令修改ansible用户的密码,ansible反馈是成功了的,但事实上却失败了~
[root@node1 ansible]# ansible all -a 'echo "ansible123" | passwd --stdin ansible' -k
所以我打算用shell命令去修改普通用户的密码~
在后面的ansible使用案例中我会使用playbook的方式教大家如何使用ansible去批量修改用户密码,在这不做重点讲解
[root@node1 ansible]# echo ansible123 | passwd --stdin ansible
[root@node2 ~]# echo ansible123 | passwd --stdin ansible
[root@node5 ~]# echo ansible123 | passwd --stdin ansible
给普通用户授权
[root@node1 ansible]# ansible all -a "sed '/^root/a ansible ALL=(ALL) NOPASSWD: ALL' /etc/sudoers -i" -k
由于 ansible 是基于 ssh 通信的,所以最好在各个节点上都加上解析,否则 ssh 会很慢~
[root@node1 ansible]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.1.1 node1
172.25.1.2 node2
172.25.1.5 node5
[root@node1 ansible]# ansible all -m copy -a 'src=/etc/hosts dest=/etc/hosts' -k
配置好了普通用户,接下来就可以使用普通用户来进行ansible的相关操作了
# su - ansible
$ mkdir ansible
$ cd ansible/
使用ansible这个目录作为ansible的操作
为了方便后面的操作,在ansible目录下配置ansible工作环境
ansible.cfg 文件是ansible配置文件
$ vim ansible.cfg
[defaults]
inventory = ./hosts #定义hosts文件路径
roles_path = ./roles #定义roles目录路径
[privilege_escalation] #授权普通用户使用sudo成为root用户
become=True
become_method=sudo
become_user=root
become_ask_pass=False
- 说到ansible.cfg配置文件,有几点肯定是得交代清楚的,ansible对配置文件ansible.cfg有一个检测顺序
- 1.首先检测 ANSIBLE_CONFIG 变量定义的配置文件(默认无)
- 2 其次检查当前目彔下的 ./ansible.cfg 文件
- 3.再次检查当前用户家目彔下 ~/ansible.cfg 文件
- 4.最后检查 /etc/ansible/ansible.cfg 文件(ansible默认配置文件,不建议修改,对所有用户都生效,最好每个用户都有自己的ansible操作环境)
hosts文件用于存放ansible执行对象主机
$ vim hosts
[node2] #node2组
172.25.1.2
[node5]] #node5组
172.25.1.5
[localhost]
172.25.1.1
[client:children] #定义子组,client组包含node2,node5组
node2
node5
roles 目录用于存放角色
$ mkdir roles
我刚才也说了,ansible是基于ssh来通信的,我想你也是不希望每次都要加-k输入密码操作吧,所以我也顺便给各个节点做一个免密
$ ssh-keygen #一直回车即可
$ for i in 1 2 5 ;do ssh-copy-id 172.25.1.$i ;done
测试:
可以看到执行完ansible命令后,会有好多种颜色:
比如讨厌的红色,这是报错~
优雅的黄色,这是执行成功并作出了改变~
平淡无奇的绿色,这是执行成功但没做出任何改变~
这几句话可能有点抽象,你在后面的ansible案例学习中,会深深的体会到~
到此 ansible 要注意的点已经稀稀疏疏的讲完了,接下来就是ansible的模块讲解啦~
ansible常用模块讲解
在这只能讲一些最常用的ansible模块,这一部分我会持续更新的~我在使用ansible的过程中遇到的比较不错的模块会陆续写进来~
在这个模块,我觉得掌握方法才是最重要的,一个一个去死记硬背,还真不行~
有3387个模块呢~所以请放弃背模块,记住常用的即可,这样你就能提高编写playbook速度~
现在来教如何通过查阅文档的方式,方便使用ansible~
$ ansible-doc 模块名
# 示例:
$ ansible-doc yum
我通过文档来讲解一下 yum 模块的使用,我相信,学会了查阅文档,这些模块对于你们是完全没问题的,甚至不需要看我写的~
yum 模块
- name: install the latest version of Apache
yum:
name: httpd # 要安装的软件
state: latest # 从 yum 源中安装最新的 httpd 软件
安装多个软件
- name: install more software
yum:
name: "{{ item }}" # 使用 item 可以安装多个软件
state: present # 安装
with_items:
- httpd #软件1
- net-tools #软件2
从网络安装
- name: install the nginx rpm
yum:
name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-
state: present
删除软件
- name: remove the Apache package
yum:
name: httpd
state: absent # absent 删除
更新所有软件
- name: upgrade all packages
yum:
name: '*'
state: latest
repolist 模块
添加 yum 源
- 如果不加 file 键,则自动设定yum源的文件名为yum仓库的名字
- name: Add multiple repositories
yum_repository:
name: rhel7.3 # yum仓库名字
description: rhel7.3 YUM repo # 仓库描述
baseurl: http://172.25.1.1/rhel7.3 # yum 源地址
gpgcheck: no # 是否采用gpgcheck
file: rhel7 # yum源文件名,自带后缀repo
copy模块
copy 模块使用的 src (源文件)的 basedir 是 yml 文件的同级目录的 files 目录(使用相对路径时)
- name: Copy file
copy:
src: /srv/myfiles/foo.conf # 从哪来? 绝对路径不受影响,相对路径看我上面说的
dest: /etc/foo.conf # 要放在哪?
当然还可以给文件权限,设定拥有者、所属组
- name: Copy file with owner and permissions
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'