ansible
概要
DEVOP类工具
Infrastructure As Code [ IaC ]
被控制机器只要可以SSH即可,依赖少
安装
DNF YUM等直接安装
基本概念
inventory
- 支持yaml等多种配置方式
- 分组
- 变量
运行设置
ANSIBLE_CONFIG
- 当前目录的 ansible.cfg
- 当前用户的~/.ansible.cfg
- /etc/ansible/ansible.cfg
模块
- 模块是Ansible执行的最小单位,可以是由Python编写,也可以是Shell编写,也可以是由其他语言编写。
- ansible all -m ping
对invenroty定义的所有主机(all)执行ping模块检查主机的互通性 - ansible-doc 可以查看模块的详细说明和配置
ansible-doc ping
剧本play-book
- playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。从根本上来讲,所谓的task无非是调用ansible的一个module。将多个play组织在一个playbook中,即可以让它们联合起来按事先编排的机制完成某一任务
- 核心元素
- Hosts 执行的远程主机列表
- Tasks 任务集
- Varniables 内置变量或自定义变量在playbook中调用
- Templates 模板,即使用模板语法的文件,比如配置文件等
- Handlers 和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签,指定某条任务执行,用于选择运行playbook中的部分代码。
Role
- 主要作用是重playbook ansible中将其组织成role,他有着固定的组织格式。以便playbook调用
基本命令
ansible
ansible-doc
ansible-playbook
ansible-galaxy
ansible-inventory
ansible-console
ansible-config
ansible-connection
ansible-vault
ansible-pull
模块
执行命令的几个模块区别
- command模块 [执行远程命令]command不支持特殊字符
[root@node1 ansible]# ansible testservers -m command -a 'uname -n' - script模块 [在远程主机执行主控端的shell/python脚本 ] (使用相对路径)
[root@node1 ansible]# ansible testservers -m script -a '/etc/ansible/test.sh - shell模块 [执行远程主机的shell/python脚本]shell模块可以支持特殊字符
[root@node1 ansible]# ansible testservers -m shell -a 'bash /root/test.sh' - raw模块 [类似于command模块、支持管道传递]
[root@node1 ansible]# ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print $2}' |awk -F: '{print $2}'"
copy模块见名知义,copy模块的作用就是拷贝文件,而copy模块是将ansible主机上的文件拷贝到远程主机中
-m copy -a "src=/data/module/tmp/jenkins/ac-wehub dest=/data/module/tmp/jenkins/"
fetch模块是从远程主机中拉取文件到ansible主机
file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等
synchronize模块:使用ansible copy模复制文件夹效率远远不及synchronize, 同一个77m大小的文件,copy模块需要耗时一分多,但是synchronize只要5秒[synchronize的主要弊端是需要安装rsync]
-m synchronize -a "src=/data/module/tmp/jenkins/ac-wehub dest=/data/module/tmp/jenkins/ delete=yes checksum=yes "
-m synchronize -a "src=/tmp/client/ dest=/tmp/server mode=pull" 【push 时,src 需要填本地目录,dest 填远程主机目录】
使用步骤概要
ssh免密登录
- ssh-keygen
- ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名字@192.168.x.xxx
- ssh 用户名字@192.168.x.xxx
如上2步即可免密登录远端机器
ansible
- 简单的单个的任务的执行使用
- 1 ansible.cfg
可选,是否修改运行的设置 - 2定义主机文件
分组、变量
必须- [proxy]
192.168.88.10
svr_proxy ansible_ssh_port=22 ansible_ssh_host=192.168.88.10
[seaweedfs]
192.168.88.11
svr_seaweed ansible_ssh_port=22 ansible_ssh_host=192.168.88.11
[server:children]
proxy
seaweedfs
[server:vars]
ansible_ssh_user ansible_ssh_pass
ansible_ssh_user=vagrant
ansible_ssh_private_key_file=./key/id_rsa
host_key_checking=false
- 常用命令解析
- ansible proxy -i inventory -m shell -a 'grep -rins "AES" /opt/openresty/nginx/conf/nginx.conf'
在哪些主机上执行,all是主机清单中的所有主机,上例是在proxy主机
-i 主机清单
-m 执行那个模块
-a 模块的参数设置
-v 最多4个-vvvv,越多越详细
- ansible proxy -i inventory -m shell -a 'grep -rins "AES" /opt/openresty/nginx/conf/nginx.conf'
- 模块的参数如何设置
- ansible-doc
- 这个参考非常详细,文档输出中有例子
ansible-playbook
- 运行一组编排好的命令
- 例子 sample.yml
-
hosts: all
tasks:- name: Recursively remove directory
file:
path: /tmp/seaweedfs
state: absent
- name: Recursively remove directory
-
hosts: proxy
tasks:-
name: SELINUX=disabled
selinux: state=disabled -
name: openresty service start
service:
name: openresty.service
state: "{{ CMD }}"
when: ( "started" == (CMD) )
ignore_errors: True
-
- ansible-playbook -i inventory sample.yml -e "CMD=started"
ROLE
- 涉及剧本重用
- Collection / galaxy
官网等地方有很多已经写好的角色,比如nginx的安装部署等等
XMind: ZEN - Trial Version