Ansible使用
整体介绍
整体架构
img- 核心引擎:即ansible
- 核心模块(core modules) :这些都是ansible自带的模块,ansible模块资源分发到远程节点使其执行特定任务或匹配一个特定的状态。
- 自定义模块(custom modules):如果核心模块不足以完成某种功能,可以添加自定义模块。
- 插件(plugins):完成模块功能的补充,借助于插件完成记录日志、邮件等功能
- 剧本(playbook) :定义ansible任务的配置文件,可以将多个任务定义在一个剧本中,由ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。
- playbook是ansible的配置、部署和编排语言,可以描述一个你想要的远程系统执行策略,或一组步骤的一般过程。如果ansible模块作为你的工作室工具,playbook就是设计方案。在基本层面上,剧本可以用于管理配置和部署远程机器。在更高级的应用中,可以序列多层应用及滚动更新,并可以把动作委托给其他主机,与监控服务器和负载平衡器交互。
- 连接插件(connection plugins):ansible基于连接插件连接到各个主机上,负责和被管理节点实现通信。虽然ansible是使用ssh连接到各被管理节点,但它还支持其他的连接方法,所以需要有连接插件。
- 主机清单(host inventory) :定义ansible管理的主机策略,默认是在ansible的hosts配置文件中定义被管节点,同时也支持自定义动态主机清单和指定配置文件路径。
配置文件
/etc/ansible/ansible.cfg 主配置文件 ansible的配置文件
/etc/ansible/hosts Inventory 要远程控制的主机列表
/usr/bin/ansible-doc 帮助文件
/usr/bin/ansible-playbook 指定运行任务文件
Host主机配置
配置文件
默认: /etc/ansible/hosts
inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成。
语法
定义主机和主机组
100.0.0.1 ansible_ssh_pass='123456' # 配置两台主机
100.0.0.2 ansible_ssh_pass='123456'
[docker] # 定义主机组,包含100.0.0.11-100.0.0.13三台主机
100.0.0.1[1:3]
[docker:vars] # 定义主机组的内置参数
ansible_ssh_pass='123456' # 定义登陆docker组使用的ssh登陆密码
[ansible:children] # 定义ansible组,ansible组包含docker组
docker
常用内置参数
参考解释例子ansible_ssh_host将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.ansible_ssh_host=192.169.1.123ansible_ssh_portssh端口号.如果不是默认的端口号,通过此变量设置.ansible_ssh_port=5000ansible_ssh_user默认的 ssh 用户名ansible_ssh_user=cxpadminansible_ssh_passssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)ansible_ssh_pass=’123456’
ansible2.0,ansible_ssh_user, ansible_ssh_host, ansible_ssh_port已经改变为ansible_user, ansible_host, ansible_port。具体参考官网
http://docs.ansible.com/ansible/latest/intro_inventory.html
模块
常见的模块及使用参考:ansible基本使用教程 - 陈小跑 - 博客园
常用模块:
ping 测试指定主机是否能连接
# ansible all -m ping
shell 在远程主机上运行命令
尤其是用到管道变量等功能的复杂命令
# ansible all -m shell -a 'echo magedu | passwd --stdin user1'
script 将本地脚本复制到远程主机并运行之
# ansible all -m script -a '/tmp/test.sh'
copy 复制文件(复制本地文件到远程主机的指定位置)
src 定义本地源文件路径
dest 定义远程目录文件路径(绝对路径)
owner 属主
group 属组
mode 权限
content 取代src=,表示直接用此处的信息生成为文件内容
# yum -y install libselinux-python
# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=root mode=640'
# ansible all -m copy -a 'content="hello ansiblenHi ansible" dest=/tmp/test.ansible'
cron 计划任务
month 指定月份
minute 指定分钟
job 指定任务
day 表示那一天
hour 指定小时
weekday 表示周几
state 表示是添加还是删除
present:安装
absent:移除
# ansible webserver -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"' #不写默认都是*,每个任务都必须有一个名字
# ansible webserver -a 'crontab -l'
# ansible webserver -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job" state=absent' #移除任务
setup 收集远程主机的facts
每个被管理节点在接受并运行管理命令之前,会将自己主机相关信息,如操作系统版本,IP地址等报告给远程的ansible主机
# ansible all -m setup
service 管理服务运行状态
enabled 是否开机自动启动
name 指定服务名
state 指定服务状态
started 启动服务
stoped 停止服务
restarted 重启服务
arguments 服务的参数
# ansible webserver -m service -a 'enabled=true name=httpd state=started'
ansible命令行使用
语法:ansible <host-pattern> [-f forks] [-m module_name] [-a args]
host-pattern. : IP或主机/主机组,可以填ip,inventory中的主机[组],或者all
-f forks : 一次处理多少台主机
-m module_name : 要使用的模块
-a args : 模块特有的参数
例子: ansible docker -m shell -a "echo hello"
ansible-playbook使用说明
命令行方式一次只能执行单条命令,如果命令量较多,可以使用playbook的方式。https://segmentfault.com/a/1190000038230424
变量
playbook文件编写
playbook使用yaml格式编写。组成结构如下:
inventory #以下操作应用的主机
modules #调用哪些模块做什么样的操作
ad hoc commands #在这些主机上运行哪些命令
playbooks
tasks #任务,即调用模块完成的某操作
variable #变量
templates #模板
handlers #当关注的资源发生变化时,需要采取的操作
roles #角色
举例如下:
# cat apache.yml
- hosts: webserver
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{ package }} state=latest
- name: install configuration file for httpd
copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: # notify调用handlers中的操作。
- restart httpd
- name: start httpd service
service: enabled=true name={{ service }} state=started
handlers: # 当httpd发生
- name: restart httpd
service: name=httpd state=restarted
使用参考:https://segmentfault.com/a/1190000038230424
ansible-playbook命令使用
ansible-playbook test.yaml --extra-vars "hosts=www user=abc"
帮助
ansible-doc -l # 列出ansible所有的模块
ansible-doc -s MODULE_NAME # 查看指定模块具体适用
Q&A
问题1:不能使用密码登陆,只能通过key
报错信息
"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
解决:
- 首先安装sshpass
- 然后修改ansible配置文件/etc/ansible/ansible.cfg ,将#host_key_checking = False 将#号去掉即可
问题2: 后台执行命令自动退出
通常情况下,通过&指定的后台任务在终端退出后会自动退出执行。一般来说,加上nohup即可在后台一直执行。但在使用ansible时,发现ansible all -m shell -a 'nohup cmd &'
命令无法在后台一直执行。后来想了个办法,将命令写入脚本,然后通过执行脚本来实现。
脚本内容为
nohup cmd > /xxx/xxx/log.log &
sleep 3
ansible命令为ansible all -m script -a 'bash xxx.sh'
。sleep的原因是退出太快可能脚本没跑起来就退出了。
网友评论