安装ansible
管理端
yum install -y ansible
被管理端
不需要安装任何软件,管理端通过ssh登录管理
ansible的配置文件
使用yum安装的ansible默认生成的配置文件为
/etc/ansible/ansible.cfg
/etc/ansible/hosts
配置文件生效顺序
1.环境变量 ANSIBLE_CONFIG
2.当前目录下的 ansible.cfg
3.家目录中的 .ansible.cfg
4./etc/ansible/ansible.cfg
会使用第一个找到的配置,找到之后就不会找其他的了
日志问题:
ansible对于远程机器的操作会被记录到远程机器的日志中,可以在ansible.cfg启用“no_log: True”避免
设置被管理的主机和组
/etc/ansible/hosts:没写在这个文件中的主机是不能用ansible管理的
不分组服务器:
192.168.10.52
分组:一台服务器可以同时属于多个组
[group]
192.168.10.52 192.168.10.53
简写模式
如果服务器的域名有明显的规律,可以使用类似www[1:10].xxx.xxx的方式www[a:f].xxx.xxx
特殊写法
可以为每一个主机设置连接类型和用户名密码
主机 ansible_connection=ssh ansible_ssh_user=mpdehaan ansible_ssh_pass=jack
给主机设置变量
主机 xxx=xxx
给组设置变量
[组名:vars]
xxx=xxx
组之间的包含(表示这个组中包含写的两个组)
[组名:children]
组名1
组名2
使用文件定义变量
/etc/ansible/group_vars/组名1
/etc/ansible/group_vars/组名2
/etc/ansible/host_vars/主机名
使anbible能够访问被管理的服务器
1.在/etc/ansible/hosts中写明账号密码
192.168.12.51 ansible_ssh_user=root ansible_ssh_pass=123456987 name=master
2.使用秘钥认证方式
生成一个key
ssh-keygen -t rsa -C '注释信息' #都使用默认的配置,公钥和私钥都保存在 ~/.ssh中
复制秘钥到被管理的服务器
ssh-copy-id 用户@远程服务器 #如果想要控制本机的话,自己也要复制一次
注意:
1.新机器known_hosts提示问题
在/etc/ansible/ansible.cfg中启用 #host_key_checking = False
2.有多个秘钥问题
在主机后面使用ansible_ssh_private_key_file 指定秘钥文件
使用ssh-agent
ssh-agent
ssh-agent是用来管理秘钥的一个工具,可以实现连接不同主机使用不同的秘钥以及自动输入秘钥的密码等
1.向ssh-agent中添加秘钥
ssh-add ~./ssh/id_dsa
ssh-add:能够把专用秘钥添加到ssh-agent的缓存中
2.从ssh-agent中删除秘钥
ssh-add -d ./ssh/id_xxx.pub
3.查看ssh-agent中的秘钥
ssh-add -l
启动ssh-agent
ssh-agent
查看ansible文档
ansible-doc -l 列出所有的模块
ansible-doc -s 模块名 显示简略的帮助信息
ansible-doc 模块名 显示详细的帮助信息
ansible命令格式
ansible 主机 -m 模块 -a '参数' [-f n]
主机:all,*,ip,主机名,组名
如果有多个用:分隔
组名1:!组名2:在组1中但不能包含在组2中
组名1:&组名2:必须同时在组1和组2中
-m:默认使用command模块
command模块不支持echo,不支持管道,变量等,如果有需要可以使用shell模块
-f:指定使用几个并行的进程
ansible all -m command -a 'date'
ansible all -a 'date'
ansible的一些常用模块
shell
与默认的command相比能够使用变量,变量
copy:复制文件
src=
dest=
mode=nnn
owner=
group=
ansible 47.52.128.79 -m copy -a "src=leke.sh dest=/home/rjjy/"
file:创建目录,设置文件属性,创建软链接
dest=
mode=
owner=
group=
state=directory
ansible 47.52.128.79 -m file -a "dest=/home/rjjy/aa state=directory"
yum:安装软件
name=软件名臣
state=present(安装)|absent(卸载)
user:管理用户
name=用户名
password:密码
state=absent
ansible all -u root -m user -a 'name=test state=present'
ansible all -u root -m user -a 'name=test state=absent'
service:启动服务
name=服务名
state=started|restarted|stopped
enabled=true|false 是否开机自动启动
script:运行脚本
将管理主机的脚本复制到每一个被管理主机上运行,默认复制到用户的家目录下
ansible 47.52.128.79 -m script -u root -a 'test.sh'
注意:这里的脚本要用相对路径,因为ansible是将脚本复制到远程主机上执行的,在远程主机上的路径不一定和本地主机一致
ping:测试被管理主机的连接
ansible 47.52.128.79 -m ping
setup:收集信息
可以实现给不同的主机设置不同的配置文件
template:
这个模块的作用其实也是复制文件,和copy的不同之处在于这个文件里面可以写变量,复制过去之后就替换了
如果用copy的话不能替换变量
playbook:如果对服务器需要进行多项操作,可以写成一个playbook进行运行
格式
- hosts:主机或组
remote_user: 执行命令的用户
tasks:
- name: 任务名称随便起
remote_user: 每一个task都能自己定义
模块名: 参数
如果太长可以分行,下一行要比上一行多一个缩进
sudo:yes 是否使用sudo
sudo_user sodu的用户
when:条件
该tasks只有在条件满足的时候才会执行,这里的变量名不用加 {{}}
playbook的变量
整个playbook的变量
- hosts :
vars:
xxx: xxx
xxx: xxx
调用变量
{{ 变量名 }}
每个task设置自己的变量
将变量名用{{ item }}替换,然后再后面增加
with_items:
- item1
- item2
就相当于让item循环items里面的元素
如果有多个元素要循环
将变量名用{{ item.xxx }}和{{ item.yyy }}替换
with_items:
- {xxx:,yyy:}
- {xxx:,yyy:}
示例:
- hosts: all
tasks:
- name: install httpd
yum: name={{ item }} state=installed
with_items:
- httpd
- telnet
- name: start
service: name=nagin state=started
触发器:
如果task没改变,那么task中的任务就不会执行,就不会触发notify,如果列表中有的改变有的没改变,那么只有改变的会触发
- hosts: all
tasks:
- template: src=b.pdf dest=/home/rjjy/iccc
notify:
- restart httpd
handlers:
- name: restart httpd
service: name=nginx state=restarted
playbook的执行
检测playbook的语法
ansible-playbook --syntax-check /path/to/playbook.yaml
测试运行playbook
ansible-playbook -C /path/to/playbook.yaml
查看playbook影响的机器
ansible-playbook test.yaml --list-hosts
运行
ansible-playbook /path/to/playbook.yaml
只运行部分task
tags:能够给一个task加标签,这样跑playbook的时候可以指定只运行某个tags的,多个任务可以写一个tags
tags : wwww
ansible-playbook c.yml --tags='wwww'
aisible的执行特点
幂等性:ansible的模块能够保证幂等性,即多次执行结果也是一致的(如果使用的command,shell等调用命令就要自己保证了)
执行顺序:逐个task执行的,一个task在所有的主机上都执行完成后才会执行下一个task
执行失败:如果playbook中某些任务执行失败(对shell来说是返回值不为0),所有已经执行的任务可能都会回滚(如果可以回滚)
解决方案
1.这时候可以使用 shell:命令||/bin/true 将返回码强行转换为成功的0
2.在tasks里面增加一个 ignore_errors:True 忽略失败
tasks:
- name
ignore_errors
role:
role的意义就在于将hosts和其他的分离出来
role应该包含的文件
tasks:应该至少包含一个main.yml,只写tasks,里面调用的模板,文件什么的直接写名称就行
files:应该包含由copy或者script调用的目录
templates:应该包含模板文件
handlers:应该包含一个main.yml
vars:应该包含一个main.yml文件,用到的变量,写在这的直接用就行
meta:应该包含一个main.yml文件,用于定义用到的变量和依赖关系
default:应该包含一个main.yml文件,为角色设置默认变量的时候使用
role的目录结构
.
└── roles
└── testrole
├── default
├── files
├── handlers
├── meta
├── tasks
├── templates
├── vars
└── yml
role的调用
一般应该在和role目录同级的目录中创建一个site.yml文件
调用方式为
- hosts:
remote_user:
roles:
- role1:
role2:
role示例:
├── roles
│ ├── test1
│ │ ├── files
│ │ │ └── testfile
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ └── test2
│ ├── files
│ │ └── testfile
│ ├── tasks
│ │ └── main.yml
│ └── vars
├── site.yml
site.yml
- hosts: 47.52.128.79
remote_user: rjjy
roles:
- test2
- hosts: 47.52.128.79
remote_user: rjjy
roles:
- test1
vim roles/test1/tasks/main.yml
- name: copy
copy: src=testfile dest=/home/rjjy/
- name: ddd
shell: wall 'meile'