1. ansible简介
模块化:调用特定的模块,完成特定任务
有Paramiko,PyYAML,Jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于python和SSH(默认已安装),agentless
安全,基于OpenSSH
支持playbook编排任务
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况
无需代理不依赖PKI(无需ssl)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案
1.1 相关文件
配置文件
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
/etc/ansible/hosts 主机清单
/etc/ansible/roles/ 存放角色的目录
程序
/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
1.2 ansible命令执行过程
ansible命令执行过程
加载自己的配置文件 默认/etc/ansible/ansible.cfg
加载自己对应的模块文件,如command
通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
给文件+x执行
执行并返回结果
删除临时py文件,退出
执行状态:
绿色:执行成功并且不需要做改变的操作
黄色:执行成功并且对目标主机做变更
红色:执行失败
2. ansible安装部署
1)安装ansible
[root@ansible ~]#yum install ansible -y
2)添加主机清单,下面添加了3台主机
[root@ansible ~]#vim /etc/ansible/hosts
[test]
192.168.8.101
192.168.8.102
192.168.8.103
查看已添加的主机
[root@ansible ~]#ansible all --list-host
hosts (3):
192.168.8.101
192.168.8.102
192.168.8.103
3)(建议)修改配置文件 /etc/ansible/ansible.cfg 把下面一行取消注释,作用是ansible在第一次连接管理主机时会弹出提示检查对应主机的host_key,让你敲 yse/no
[root@ansible ~]#vim /etc/ansible/ansible.cfg
第71行 host_key_checking = False
4)在ansible主机上做key验证,到被管理的主机上
[root@ansible ~]#ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EQBBZF/u2E6uc9fAkrIVu0WVjlGbg0QB9RkXIvl6BDU root@ansible
The key's randomart image is:
+---[RSA 2048]----+
| o*o..++*=E.o. |
| . . o o++oO |
| . o .B* |
| +..o +. |
| . S* o |
| .+= = . |
| +o+ + |
| o.o . . |
| .o . |
+----[SHA256]-----+
[root@ansible ~]#ssh-copy-id 192.168.8.101
[root@ansible ~]#ssh-copy-id 192.168.8.102
[root@ansible ~]#ssh-copy-id 192.168.8.103
发一个ping测试以下是否联通
[root@ansible ~]#ansible all -m ping
192.168.8.103 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.8.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
192.168.8.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
3. ansible常用模块
1. Command:在远程主机执行命令,默认模块,可忽略-m选项
ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’
此命令不支持 $VARNAME < > | ; & 等,用shell模块实现
2. Shell:和command相似,用shell执行命令
ansible srv -m shell -a ‘echo magedu |passwd –stdin wang’
调用bash执行命令 类似 cat /tmp/stanley.md | awk -F‘|’ ‘{print 2}’ &> /tmp/example.txt 这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
3. Script:在远程主机上运行ansible服务器上的脚本
-a "/PATH/TO/SCRIPT_FILE“
ansible websrvs -m script -a /data/f1.sh
4. Copy:从主控端复制文件到远程主机
ansible srv -m copy -a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes”
如目标存在,默认覆盖,此处指定先备份
ansible srv -m copy -a “content=‘test content\n’ dest=/tmp/f1.txt” 指定内容,直接生成目标文件
Fetch:从远程主机提取文件至主控端,copy相反,目前不支持目录
ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts’
File:设置文件属性
ansible srv -m file -a "path=/root/a.sh owner=wang mode=755“
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’
5. unarchive:解包解压缩,有两种用法:
1、将ansible主机上的压缩包在本地解压缩后传到远程主机上,设置copy=yes.
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
常见参数:
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
示例:
ansible srv -m unarchive -a 'src=foo.tgz dest=/var/lib/foo'
ansible srv -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
ansible srv -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
6. Archive:打包压缩
ansible all -m archive -a 'path=/etc/sysconfig dest=/data/sysconfig.tar.bz2 format=bz2 owner=wang mode=0777'
Hostname:管理主机名
ansible node1 -m hostname -a “name=websrv”
Cron:计划任务
支持时间:minute,hour,day,month,weekday
ansible srv -m cron -a “minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null’ name=Synctime” 创建任务
ansible srv -m cron -a ‘state=absent name=Synctime’ 删除任务
Yum:管理包
ansible srv -m yum -a ‘name=httpd state=present’ 安装
ansible srv -m yum -a ‘name=httpd state=absent’ 删除
7. Service:管理服务
ansible srv -m service -a 'name=httpd state=stopped'
ansible srv -m service -a 'name=httpd state=started enabled=yes'
ansible srv -m service -a 'name=httpd state=reloaded’
ansible srv -m service -a 'name=httpd state=restarted'
User:管理用户
ansible srv -m user -a 'name=user1 comment=“test user” uid=2048 home=/app/user1 group=root‘
ansible srv -m user -a 'name=sysuser1 system=yes home=/app/sysuser1 ’
ansible srv -m user -a ‘name=user1 state=absent remove=yes‘
删除用户及家目录等数据
Group:管理组
ansible srv -m group -a "name=testgroup system=yes“
ansible srv -m group -a "name=testgroup state=absent"