目录
是什么?
工作原理?
部署?
常用模块?
playbook?
roles
是什么?
ansible是自动化运维工具,实现了批量系统配置、批量程序部署、批量运行命令等功能,从而提升运维的管理能力,解决工作中的管理难题。
工作原理?
运维自动化平台是由管理机器和业务机器组成的。管理机器:任务定制及发布;业务机器:接收任务并执行任务。
- 用户登录管理机器:通过ansible剧本或单行命令针对业务机器组或者单个机器部署任务;
- 管理机器读取用户的部署任务:根据自己hosts文件中定义的业务机器组查找对应的机器地址(ip或域名)
- 管理机下发任务:管理机通过SSH免密连接业务机器,下发任务给业务机器;
- 业务机器执行任务
- 业务机器将执行结果发送给ansible管理机器
部署?
- 服务器
主机名称 | ip地址 |
test-1.wn.com(管理机器) | 192.168.52.21 |
test-2.wn.com(业务机器) | 192.168.52.22 |
test-3.wn.com(业务机器) | 192.168.52.23 |
- 主机名互相绑定
cat /etc/hosts
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
reboot
systemctl status firewalld
- 时间同步
- ssh免密(实现管理机器可以免密登录业务机器)
ssh-keygen
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.52.22
ssh root@192.168.52.22 #测试是否可以免密登录
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.52.23
ssh root@192.168.52.23 #测试是否可以免密登录
- 管理机器(192.168.52.21)安装ansible并测试
wget https://releases.ansible.com/ansible/ansible-2.9.0rc3.tar.gz
tar xf ansible-2.9.0rc3.tar.gz
mv ansible-2.9.0rc3 /opt/ansible
cd /opt/ansible/
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ #安装依赖
pip install --user ansible -i https://pypi.tuna.tsinghua.edu.cn/simple/ #安装软件
ln -s /opt/ansible/bin/* /usr/bin/
mkdir /etc/ansible
cp /opt/ansible/examples/ansible.cfg /etc/ansible/
部署主机列表,定义被监控机:
执行ansible的时候会去读取客户端文件hosts,如果没有把客户端加入到hosts文件中,就说明无法被ansible管理。此hosts不等同于/etc/hosts
cp /opt/ansible/examples/hosts /etc/ansible/
cat /etc/ansible/hosts
[group1]
192.168.52.[22:23]
test-[2:3].wn.com
备注:当然ssh端口不是22也可以设置,未做免密机器也可以设置。示例如下:
192.168.98.202:12121 ansible_ssh_user=sko ansible_ssh_pass='123'
web1 ansible_ssh_host=192.168.98.203 ansible_ssh_port=12121
测试管理机和业务机器的联通性:
ansible -m ping 192.168.52.22
ansible -m ping group1
常用模块?
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。
具体用法:ansible 机器 -m 模块名称 -a ‘模块参数’
官网模块文档地址:
https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html
查看所有的模块:ansible-doc -l
查看具体模块的用法:ansible-doc ping
##修改主机名
示例:ansible -m hostname -a “name=test-2” 192.168.52.22
注意:/etc/hosts中并不会改变,但是/etc/hostname会改变
##对文件或文件夹进行相关操作,创建、删除、权限、软硬链接、创建目录
文件创建:ansible -m file group1 -a “path=/opt/test state=touch”
文件删除:ansible -m file group1 -a “path=/opt/test state=absent”
文件权限:ansible -m file group1 -a “path=/opt/test owner=wn group=nobody mode=0600”
软链接:ansible -m file group1 -a “src=/opt/test path=/opt/test_1 state=link”
硬链接:ansible -m file group1 -a “src=/opt/test path=/opt/test_2 state=hard”
创建目录:ansible -m file group1 -a “path=/opt/test_dir state=directory”
删除目录:ansible -m file group1 -a “path=/opt/test_dir state=absent”
修改目录及子文件权限:ansible -m file group1 -a “path=/opt/test_dir owner=wn mode=2755 recurse=yes”
##copy模块用于对文件的远程拷贝操作(从管理机器到业务机器)
touch /opt/test
cat /opt/test
abcdef
sha1sum /opt/test
ansible -m copy group1 -a “src=/opt/test dest=/opt owner=wn group=nobody mode=0400 checksum=f8182e9ccdbe6efd13eb36a056a7db203fe66e40”
注意:拷贝时目录是否带”/”符号
ansible -m copy group1 -a “content=’hello world’ dest=/opt/test” ##管理机往远程文件里写内容(会覆盖原内容)
注意:content的引号不能丢掉
force:如果目标文件已存在,则是否覆盖
backup:如果拷贝的文件内容与原内容不一样,则会备份一份;如果拷贝过来的文件本机存在,group1的机器上会将/opt/test备份一份,备份文件命名加上时间,再远程拷贝新的文件为/opt/test
##将远程机器的文件拷贝到本地。
注意:不管是拷贝多个机器还是一个机器的文件,在管理机本地目录都会按照IP/路径/文件名
ansible -m fetch group1 -a “src=/opt/test dest=/opt”
在业务机192.168.52.22执行:
touch /opt/test_2
vi /opt/test_2
在管理机器上执行:
ansible -m fetch 192.168.52.22 -a “src=/opt/test_2 dest=/opt”
##用于管理用户账号和用户属性
创建用户:
echo “12345” | openssl passwd -1 -stdin
ansible -m user group1 -a “name=wn password=’fsferr’”
用户删除:
ansible -m user group1 -a “name=wn state=absent remove=yes”
注意:
在删除用户的时候报错:user wn is currently userd by process 5163
那是因为我在业务机上执行了su wn,su root操作,你只需要在那台机器上执行ctrl+D操作就可以了。
参考:
##用于管理用户组合用户组属性
ansible -m group group1 -a “name=admin state=present” ##组创建
ansible -m group group1 -a “name=admin state=absent” ##组删除
##用于管理周期性时间任务
ansible -m cron group1 -a “name=’cron test’ user=root job=’echo haha > /opt/test’ minue=’*/1’” ##执行
ansible -m cron group1 -a “name=’cron test’ state=absent” ##删除任务
- yum模块
##用于使用yum命令来实现软件包的安装于卸载。
ansible -m yum group1 -a “list=repos” ##列出包信息
ansible -m yum group1 -a “name=vsftpd” ##安装一个软件
ansible -m yum 192.168.52.22 -a “state=absent name=vsftpd” ##删除软件包
##用于控制服务的启动、关闭、开机自启动等
ansible -m service 192.168.52.22 -a “name=vsftpd state=started enabled=on” ##启动vsftpd服务,并设置为开机自启动
ansible -m service 192.168.52.22 -a “name=vsftpd state=stopped enabled=false” ##关闭vsftpd服务,并设为开机不自动启动
注意:在安装过程中报错unregistered authentication agent for unix-process:
参考解决
##用于在远程机器上执行本地脚本
在管理机上创建脚本,通过ansible将脚本分发到被管理端。
注意:脚本一直存在于ansible管理机本地,不需要手动拷贝到远程主机后再执行。
在管理机创建脚本:
touch /opt/test.sh
chmod u+x /opt/test.sh
cat /opt/test.sh
#!/bin/bash
for ((i=1;i<10;i++))
do
for ((n=1;n<=i;n++))
do
echo -n " $i*$n " >> /opt/test.log
done
echo " " >> /opt/test.log
done
ansible -m script group1 -a “/opt/ansible_test.sh”
ansible -m command group1 -a “ls /opt” #测试执行是否成功
##用于执行linux命令。
两个模块类似,区别在于command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以。
ansible -m shell 192.168.52.22 -a “ls /root”
ansible -m shell 192.168.52.22 -a “echo ‘hello world’ > /opt/testShell”
ansible -m shell 192.168.52.22 -a “cat /opt/testShell”
ansible -m command 192.168.52.22 -a “ls /root”
ansible -m command 192.168.52.22 -a “echo ‘hello world’ > /opt/testShell”
ansible -m command 192.168.52.22 -a “cat /opt/testShell” 注意:你会发现上一条命令没有起作用
- setup模块
##用于收集远程主机的基本信息(如操作系统类型、主机名、ip、cpu信息,内存信息)
ansible -m setup 192.168.52.22
ansible -m setup 192.168.52.22 -a “filter=’ansible_processor’” ##打印cpu信息
ansible -m setup 192.168.52.22 -a “filter=’ansible_kernel’” ##打印内核信息
ansible -m setup 192.168.52.22 -a “filter=’ansible_hostname’” ##打印主机名
ansible -m setup 192.168.52.22 -a “filter=’ansible_ens*’” ##打印网卡信息
##用于获取文件的状态信息
ansible -m stat 192.168.52.22 -a “path=/opt/test” ## 获取/opt/test文件的状态信息
playbook?
是ansible用于配置,部署和管理被控节点的剧本。ansible格式的脚本,将所有需要执行的操作按照ansible的编程语法,放到文件中执行。
YAML格式规则:
文件的第一行以”---“开始,表明yaml文件的开始;
以”#”开头为注释;
列表中的所有成员都开始于相同的缩进级别,并且使用”- “作为开头(一个横杠和一个空格);
一个字典是由一个简单的键: 值的形式组成(这个冒号后面必须是一个空格)。
参数说明:
hosts:用于指定要执行任务的主机,其可以是一个或多个由冒号分割主机组;
remote_user:用于指定远程主机上的执行任务的用户;
tasks:任务列表,按顺序执行任务(如果一个host执行task失败,整个tasks都会回滚);
handlers:类似task,但需要使用notify通知调用,实现按需调用(不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次;handlers最佳的应用场景是用来重启服务或触发系统重启操作);
variables:定义变量可以被多次方便调用;
with_items:迭代列表
示例(安装vsftpd,并启动该服务):
注意:修改vsftpd.conf文件,再次运行,会发现触发了notify。
ansible-playbook /etc/ansible/vsftpd.yaml
roles
通过分别将variables,tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。主要使用场景代码复用度较高的情况下。更多了解可查看《Ansible--Ansible之Roles》