简介
ansible是一个简单的it自动化工具,可以实现批量进行系统配置,软件部署和运行命令等功能。基于python语言实现,由于paramiko和PyYaml两个模块构成。
Ansible与Saltstack最大的区别是Ansible无需在被控主机部署任何客户端代理,默认直接通过SSH通道进行远程命令执行或下发配置
ansible架构图
模块 | 功能 |
---|---|
connection plugins | 远程连接插件 |
hosts | 定义管理主机或主机组 |
modules | 包含各个核心模块及自定义模块 |
Plugin | 完成模块功能的补充,如日志插件、邮件插件等 |
Playbook | ansible的任务配置文件,将多个任务定义在剧本中进行管理 |
安装ansible
默认ansible在epel源中
yum install ansible -y
[root@localhost ~]# ansible --version #查看ansible版本
ansible 2.2.1.0
config file = /etc/ansible/ansible.cfg
configured module search path = Default w/o overrides
生成文件
可以查看生成的文件
rpm -ql ansible
由于文件太多可以只看前20行的
程序文件
/etc/ansible #ansible主程序
/usr/bin/ansible-doc #ansible文档查看器
/usr/bin/ansible-galaxy #你可以把他理解成ansible的pip,可以从galaxy.ansible.com下载官方收录的playbooks
/usr/bin/ansible-playbook#playbook就是 用这个跑的
/usr/bin/ansible-pull #支持直接从git下载playbook执行,需要遵循其规定的目录格式。
/usr/bin/ansible-vault # 如果你的配置文件中含有敏感信息,你可能并不希望他能被人看到,vault可以帮你加密/解密这个配置文件
配置文件
/etc/ansible/ansible.cfg #ansible主配置文件
/etc/ansible/hosts # ansible主机列表
ansible配置文件加载顺序:
Ansible配置文件是以ini格式存储配置数据的,在Ansible中,几乎所有的配置项都可以通过Ansible的playbook或环境变量来重新赋值。在运行Ansible命令时,命令将会按照预先设定的顺序查找配置文件,如下所示:
- ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件。
- /ansible.cfg:接着ansible会检查当前目录下的./ansible.cfg文件
- ~/.ansible.cfg:接着检查当前用户home目录下的.ansible.cfg文件
- /etc/ansible/ansible.cfg:最后会检查/etc/ansible/ansible.cfg
注意:如果你通过发行版的提供的软件包管理工具(yum之类的)或者pip安装的ansible,那么在你的/etc/ansible目录下已经有了ansible.cfg配置文件,如果你是通过GitHub仓库安装的,在你复制的仓库中examples目录下可以找到ansible.cfg,你可以把它拷贝到/etc/ansible目录下。
配置选项
可以使用环境变量的方式来进行配置:
大多数的ansible参数都可以通过使用带有ANSIBLE_开头的环境变量进行配置,参数名称必须都是大写字母。比如:
export ANSIBLE_SUDO_USER=root
设置了环境变量之后,ANSIBLE_SUDO_USER就可以在playbook中直接引用。
ansible.cfg配置参数
inventory
这个参数表示资源清单inventory文件的位置,资源清单就是一些Ansible需要连接管理的主机列表。这个参数的配置实例如下:
inventory = /etc/ansible/hosts
library
Ansible的操作动作,无论是本地或远程,都使用一小段代码来执行,这小段代码称为模块,这个library参数就是指向存放Ansible模块的目录。配置实例如下:
library = /usr/share/ansible
Ansible支持多个目录方式,只要用冒号(:)隔开就可以,同时也会检查当前执行playbook位置下的./library目录。
forks
设置默认情况下Ansible最多能有多少个进程同时工作,从Ansible 1.3开始,fork数量默认自动设置为主机数量或者潜在的主机数量,默认设置最多5个进程并行处理。具体需要设置多少个,可以根据控制主机的性能和被管节点的数量来确定,可能是50或100。默认值5是非常保守的值,配置实例如下:
forks = 5
sudo_user
这是设置默认执行命令的用户,也可以在playbook中重新设置这个参数。配置实例如下:
sudo_user = root
remote_port
这是指定连接被管节点的管理端口,默认是22。除非设置了特殊的SSH端口,不然这个参数一般是不需要修改的。配置实例如下:
remote_port = 22
host_key_checking
这是设置是否检查SSH主机的密钥。可以设置为True或False,配置实例如下:
host_key_checking = False
timeout
这是设置SSH连接的超时间隔,单位是秒。配置实例如下:
timeout = 60
log_path
Ansible系统默认是不记录日志的,如果想把Ansible系统的输出记录到日志文件中,需要设置log_path来指定一个存储Ansible日志的文件。配置实例如下:
log_path = /var/log/ansible.log
另外需要注意,执行Ansible的用户需要有写入日志的权限,模块将会调用被管节点的syslog来记录,口令是不会出现在日志中的。
ansible命令参数
ansible <host-pattern> [options]
-m MODULE_NAME, --module-name=MODULE_NAME 要执行的模块,默认为 command
-a MODULE_ARGS, --args=MODULE_ARGS 模块的参数
-u REMOTE_USER, --user=REMOTE_USER ssh 连接的用户名,默认用 root,ansible.cfg 中可以配置
-k, --ask-pass 提示输入 ssh 登录密码,当使用密码验证登录的时候用
-s, --sudo sudo 运行
-U SUDO_USER, --sudo-user=SUDO_USER sudo 到哪个用户,默认为 root
-K, --ask-sudo-pass 提示输入 sudo 密码,当不是 NOPASSWD 模式时使用
-B SECONDS, --background=SECONDS run asynchronously, failing after X seconds(default=N/A)
-P POLL_INTERVAL, --poll=POLL_INTERVAL set the poll interval if using
-B (default=15)
-C, --check 只是测试一下会改变什么内容,不会真正去执行
-c CONNECTION 连接类型(default=smart)
-f FORKS, --forks=FORKS fork 多少个进程并发处理,默认 5
-i INVENTORY, --inventory-file=INVENTORY 指定hosts文件路径默认 default =/etc/ansible/hosts
-l SUBSET, --limit=SUBSET 指定一个 pattern,对<host_pattern>已经匹配的主机中再过滤一次
--list-hosts 只打印有哪些主机会执行这个 playbook 文件:不是实际执行该 playbook
-M MODULE_PATH, --module-path=MODULE_PATH 要执行的模块的路径,默认为/usr/share/ansible/
-o, --one-line 压缩输出,摘要输出
--private-key=PRIVATE_KEY_FILE 私钥路径
-T TIMEOUT, --timeout=TIMEOUT ssh 连接超时时间,默认 10 秒
-t TREE, --tree=TREE 日志输出到该目录,日志文件名会以主机名命名
-v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging)
配置登录
ansible使用ssh登录,所以要在两者之间配置秘钥登录,这样才能开始正常的工作
免密登录
ssh-keygen -t rsa -P ""#生成秘钥/root/.ssh/id_rsa.pub
ssh-copy-id -i ./.ssh/id_rsa.pub root@172.16.254.105 #将公钥传到172.16.254.105上
实现了master与其他节点之间的连接
定义ansible节点
[testgroup] #服务器组名,统一管理用
172.16.254.103 # 节点地址
执行who查看信息
[root@localhost ~]# ansible testgroup -m command -a 'who' #组
172.16.254.103 | SUCCESS | rc=0 >>
root :0 2017-09-10 13:40 (:0)
root pts/0 2017-09-10 13:41 (:0)
root pts/1 2017-09-19 10:58 (gateway)
root pts/2 2017-09-19 14:48 (172.16.254.105)
[root@localhost ~]# ansible all -m command -a 'who' #所有
172.16.254.103 | SUCCESS | rc=0 >>
root :0 2017-09-10 13:40 (:0)
root pts/0 2017-09-10 13:41 (:0)
root pts/1 2017-09-19 10:58 (gateway)
root pts/2 2017-09-19 14:49 (172.16.254.105)
[root@localhost ~]# ansible 172.168.x.x -m command -a 'who' #单个ip的
为更好的规范定义的主机与组变量,我们实际是不会在hosts里直接写的,将定义的主机名与组变量单独剥离出来放到指定的文件中,将采用YAML格式存放,存放位置规定:"/etc/ansible/group_vars/名"和"/etc/ansible/host_vars/主机名"分别存放指定组名或主机名定义的变量,如/etc/ansible/group_vars/mysql.yml
网友评论