自动化运维工具ansible
目录
安装与配置
#yum安装
yum install epel-release -y
yum install ansible –y
#查看ansible版本
ansible --version
#管理节点与被管理节点建⽴SSH信任关系
1.生成私钥
[root@server ~]# ssh-keygen
2.向主机分发私钥
[root@server ~]# ssh-copy-id root@192.168.37.122
[root@server ~]# ssh-copy-id root@192.168.37.133
#修改配置文件,创建主机清单文件 写在[]里的是组名,[ ]下面的是组内的主机名
[root@server ~]# vim /etc/ansible/hosts
[web]
192.168.37.122
192.168.37.133
命令行模块
ansible <ip组> -m <模块> -a <argument参数> [options]
命令的工作目录默认是远程用户的主目录(~),command 模块不会保留shell的环境状态(包括当前工作目录)
ping模块
ansible all -m ping
command模块
chdir=/etc/sysconfig ---执行命令前先切换到指定目录
creates=/doc/1.txt:判断指定文件是否存在,如果存在,不执行后面的操作
removes:判断指定文件是否存在,如果存在,执行后面的操作
- 注意,该命令不支持
| 管道命令
。
ansible all -m command -a ‘removes=/etc/sysconfig/network-scripts/ifcfg-ens33 ip addr ’
shell模块
ansible all -m shell -a 'echo "niki_ansible" |cat >>1.txt
ansible webservers -m shell -a 'ifconfig | grep ens33’
ansible webservers -m shell -a 'ifconfig > /opt/kx.txt’
file模块
state #状态,有以下选项:
directory:如果目录不存在,就创建目录
file:文件不存在,不会被创建
touch:文件不存在,创建新文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件
link:创建软链接,hard:创建硬链接
ansible web -m file -a 'path=/data/app state=directory’
创建目录
ansible web -m file -a 'path=/data/a state=absent’
删除文件
ansible dbservers -m file -a ' group=root mode=644 path=/opt/host_ansible'
#修改文件的属主属组权限等
copy模块-将文件复制到远程主机
src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content #用于替换"src",可以直接指定文件的值
dest #必选项,将源文件复制到的远程主机的绝对路径
backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode #递归设定目录的权限,默认为系统默认权限
ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666’
fetch 模块-从远程主机获取文件到本地
dest:用来存放文件的目录
src:在远程拉取的文件,**并且必须是一个file**,不能是目录
ansible web -m fetch -a 'src=/data/hello dest=/data'
yum/apt 模块
name:要管理的包名
state:#present--->安装 latest--->安装最新的, absent---> 卸载软件。
playbook-剧本
playbook格式
playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。类似于脚本
- p
-
和:
后必须空一格 - 大小写敏感,使用缩进表示层级关系
- 缩进时不允许使用tab键、只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
---
- name: Example playbook
hosts: all # 指定此 Play 将在哪些主机上运行
remote_user: root
tasks:
- name: connect test
ping:
- name: new file
file:
group: root
mode: 744
path: /niki1/file1
state: touch
#以上为普通形式,行数较多,但更容易操作。任务的关键字垂直堆叠,更容易区分。
#以下可以运行但不推荐
tasks:
- name: shorthand form
service: name=httpd enabled=true state=started
运行playbook
空运行 ansible-playbook -C pb.yml
直接运行 ansible-playbook pb.yml
语法验证 ansible-playbook --syntax-check pb.yml
指定从某个task开始运行ansible-playbook pb.yml --start-at-task='xxx'
| 绿色代表执行成功,系统保持原样
| 黄色代表系统代表系统状态发生改变
| 红色代表执行失败,显示错误输出
Handler-触发器
在特定条件下触发;接收到其它任务的通知notify
时被触发
Handlers 最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
Tag-标签
为tasks或play添加标记,选择性地执行playbook的特定部分。
错误处理
如果命令或脚本的退出码不为零,可以使用如下方式替代
tasks:
-name: run this command and ignore the result
shell: /usr/bin/somecommand || /bin/true
转错为正 如果命令失败则执行 true
或者使用ignore_errors来忽略错误信息
tasks:
-name: run this command and ignore the result
shell: /usr/bin/somecommand
ignore_errors: True 忽略错误
Variable-变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
变量定义:直接定义 key=value
1.系统自带:ansible setup模块
ansible all -m setup -a 'filter="ansible_nodename"' #查询主机名
2./etc/ansible/hosts(主机清单)中定义变量
3.在playbook中定义
vars:
- var1: value1
- var2: value2
4.在独立的变量YAML文件中定义
vim vars.yml
pack: vsftpd
service: vsftpd
引用变量文件
vars_files:
- vars.yml
变量调用:
通过{{ variable_name }} 调用变量
通过-e指定
ansible-playbook test.yml -e "hosts=123"
示例
#调用变量文件
---
- hosts: web
name: vars_log file
vars_files:
- /niki2/vars.yml
tasks:
- name: new file
file:
path: /niki1/{{ name1 }}_log.txt
mode: "{{ mode1 }}"
state: touch
Template-模板
---
- hosts: all
remote_user: root
tasks:
- name: install nginx #安装nginx,若为centos7需要启用 EPEL 仓库
yum:
name: nginx
state: present
- name: copy template
template:
src: /etc/ansible/templates/nginx.conf.j2
#nginx.conf.j2模板设置worker_processes {{ ansible_processor_vcpus*2}};
dest: /etc/nginx/nginx.conf
notify: restart service
- name: service start
service:
name: nginx
state: started
enabled: yes #开机自启
handlers:
- name: restart service
service:
name: nginx
state: restarted