文章目录
1.ansible简介
ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible可以同时管理Redhat系的Linux,Debian系的Linux,以及windows主机。管理节点只在执行脚本时与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansible
ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的ansible所运行的模块,ansible只是提供一种框架,主要包括:
- 连接插件connection plugins:负责和被监控端实现通信
- host inventory:指定操作的主机,是一个配置文件里定义监控的主机
- 各种核心模块,command模块、自定义模块
- 借助于插件完成记录日志邮件等功能
- playbook:剧本执行多个任务时,非必需2可以让节点一次性运行多个任务
2.部署ansible服务
配置依赖环境
yum -y install epel-release #安装epel源、通过在线源下载
安装ansible软件
yum -y install ansible
此时生成三个主要文件在/etc/ansible下
ls /etc/ansible
ansible.cfg #ansible的配置文件
hosts #ansible的主仓库,用于存储需要管理的远程主机的相关信息
roles #角色文件,用于playbook
配置需要管理的远程主机
vi /etc/ansible/hosts
##可单独添加IP地址,也可自定义主机池名用于调用相关所有主机
[webservers] #主机池名
192.168.20.10
192.168.20.100
配置ssh,用于ansible的connection plugins连接插件连接主机
ssh-keygen -t rsa #建立非对称密钥
#此时交互设置密钥存放路径,以及设置私钥
ssh-copy-id root@192.168.20.10 #将公钥传给三台主机
ssh-copy-id root@192.168.20.100
#此时交互输入对方主机的用户密码(此时是使用对方root用户身份登录)
#配置ssh免交互代理
ssh-agent bash #表示使用免交互代理
ssh-add #添加个人私钥
#此时交互输入此前设置的个人私钥
2.1测试ansible服务
ansible all -a 'date'
3. ansible命令语法及模块详解
3.1命令语法
基本语法
ansible 主机标识/ip -m 模块 -a ‘参数’
主机标识/ip:在管理主机文件中定义,可以是主机标识(主机池),也可以是具体主机IP地址,若是all,则为所有主机
模块:ansible的各种模块,若不指定(-m ),则默认使用command
参数:管理命令,根据具体模块决定命令语法
3.2模块详解
模块查询操作
ansible-doc -l #列出所有已安装模块,按q退出查询
ansible-doc -s 模块名 #查询指定模块的描述信息和操作动作
1.command模块
一般用于执行单条linux命令
ansible 192.168.20.100 -m command -a 'date'
ansible webservers -a 'id' #不加m指定模块,默认使用command,查看用户信息
2.cron模块
用于设置计划任务
ansible 192.168.20.10 -m cron -a 'minute="*/1" job="/usr/bin/echo hello >> /opt/test.txt" name="test"' #创建名为test的计划任务,每分钟执行一次
ansible 192.168.20.10 -m cron -a 'name=test state=absent' #删除test任务
参数组成:
时间:minute、hour、day、weekday、month
任务:job,用job定义执行的任务
计划任务名称:name
状态(state):present(添加任务,可以省略),absent(移除任务)
3.user模块
用于管理用户
ansible 192.168.20.10 -m user -a 'name="user01"' #创建用户user01
ansible 192.168.20.10 -m user -a 'name="user01" state=absent' #删除用户user01
ansible 192.168.20.10 -m user -a 'name="user01" uid=1002 group=user01' #设置user01的uid和属组
4.group模块
用户管理组
ansible 192.168.20.10 -m group -a 'name=web gid=270' #创建组web,设置gid号
ansible 192.168.20.10 -m group -a 'name=web state=absent' 删除web组
5.copy模块
复制文件、目录及写入内容至文件
ansible all -m copy -a 'src=/etc/hosts dest=/opt/hosts.bak owner=root mode=640' #复制文件,设置属主及权限
ansible all -m copy -a 'content="hello" dest=/opt/test' #对文件写入内容
6.file模块
管理文件、目录及创建软连接
ansible all -m file -a 'path=/opt/test state=touch' #创建一个空文件
ansible all -m file -a 'path=/opt/test state=absent' #删除某一个文件
ansible all -m file -a 'path=/opt/var state=directory mode=755' #创建一个目录并设置权限
ansible all -m file -a ‘path=/opt/test owner=web group=web mode=644’ #设置文件的属主属组权限
7.ping模块
测试与被控主机的网络连接状态
ansible all -m ping #测试连通性
8.yum模块
管理软件
ansible all -m yum -a 'name=httpd' #yum安装软件
ansible all -m yum -a 'name=httpd state-absent' #yum卸载软件
9.service模块
管理服务
ansible all -m service -a 'name=httpd state=started enabled=true' #开启httpd并设为开机自启
state状态:started、stopped、status...
9.shell模块
执行多条linux指令、并可以使用重定向、追加符号
特殊参数:
chdir:指定工作目录,在执行对应的命令之前,会先进入到chdir参数指定的目录中,等于cd命令
creates:指定一个文件,当指定的文件存在时,就不执行对应的命令
removes:使用此参数指定一个文件,当指定的文件不存在时,就不执行对应的命令
ansible all -m shell -a 'chdir=/opt/aa echo hello >> test.txt'
10.script模块
执行本地的脚本,使所有被控主机执行脚本操作(脚本只需存在ansible管理节点,被控主机无需存在该脚本)
ansible all -m script -a 'test.sh'
11.setup模块
获取主机所有信息
可配合检索命令,过滤出主机的资源占用、地址信息等所需信息
ansible all -m setup
4.主机清单
ansible默认的主机清单是/etc/ansible/hosts文件
主机清单可以手动设置,也可通过Dynamic inventory动态生成
一般主机名使用FQDN
FQDN:完全合格域名:主机名+域名,例:www.baidu.com
4.1常用基础配置
#直接写入IP、FQDN
www.aa.com
192.168.20.10
[webservers] #方括号设置组名(组名内可设置多个主机,即主机池)
192.168.20.100
192.168.20.60
4.2名称类似主机定义
[webservers]
www.a[1:50].com #www.a1.com至www.a50.com的所有主机
192.168.20.1[0-9] #192.168.20.10-192.168.20.19
www.a[a:f].com #www.aa.com-www.af.com的所有主机,字母匹配支持a-f
4.3Inventory中变量
1.主机变量
www.aa.com http_port=80 maxRequestsChild=100 #定义该主机http端口号及最大请求数
2.组变量
定义主机名为一个变量,可直接调用
[servers:vars] #定义主机名为变量的组
ntp_server=ntp.server.org
nfs_server=nfs.server.org
3.组嵌套
定义多个组在同一个组内
[nginx]
192.168.20.10
192.168.20.20
[tomcat]
192.168.20.30
192.168.20.40
[webservers]
nginx
tomcat
4.3.1 inventory变量参数
- ansible_ssh_host 将要连接的远程主机名,与你想要设定的主机的别名不同的话,可以通过此变量设置
- ansible_ssh_port ssh端口号,如果不是默认的端口号,通过此变量设置
- ansible_ssh_user 默认的ssh用户名
- ansible_ssh_pass ssh密码(这种方式并不安全,我们强烈建议使用–ask-pass或SSH密钥)
- ansible_ssh_private_key_file ssh使用的私钥文件,适用于有多个密钥,而你不想使用SSH代理的情况
- ansible_ssh_common_args 此设置附加到sftp,scp和ssh的缺省命令行
- ansible_sftp_extra_args 此设置附加到默认sftp命令行
- ansible_scp_extra_args 此设置附加到默认scp命令行
- ansible_ssh_extra_args 此设置附加到默认ssh命令行
- ansible_ssh_pipelining 确定是否使用SSH管道。这可以覆盖ansible.cfg中的设置
- ansible_shell_type 目标系统的ssh类型,默认情况下,命令的执行使用’sh’语法,可设置为’csh’或’fish’
- ansible_python_interpreter
目标主机的python路径,适用于的情况:系统中有多个python。或者命令路径不是/usr/bin/python - ansible__interpreter 这里的可以是ruby或perl或者其他语言的解释器,作用和-
ansible_python_interpreter类似 - ansible_shell_executable
这将设置ansible控制器将在目标机器上使用的shell,覆盖ansible.cfg中的配置,默认为/bin/sh