ansible官方文档
ansbile官方文档中文版
一 安装使用 1.1 离线安装ansible首先,在一台能联网的机器上,下载ansible的epel源以及createrepo rpm包
# yum install createrepo && yum install yum-utils #上rpm search下载需要的rpm包
# yum install https:*//dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
其次下载ansible需要的所有依赖包到本地目录
# mkdir /root/mypackages
# yumdownloader --resolve --destdir /root/mypackages/ ansible
离线机器上配置本地yum
# vi /etc/yum.repos.d/centos76.repo
[centos76]
name=centos76
baseurl=file:///root/centos76
gpgcheck=0
enabled=1
上传ansible包到本地yum源,并上传createrepo rpm包
# rz
# tar zxvf ansible.tar.gz
# mv mypackages/* /root/centos76/Packages/
# yum install createrepo
# yum clean all
# createrepo /root/centos76 # 提前使用rpm -ivh的方式安装createrepo的rpm包
# yum update
# yum repolist
# yum list|grep ansible # 查看ansible源
安装ansible
# yum install -y ansible
1.2 ansible小试牛刀
ansible是集合众多运维工具的优点为一身的、基于python开发的自动化运维工具,实现了批量配置、批量部署、批量运行命令等等功能。
通过账号密码管理多台主机
# vim /etc/ansible/hosts
[webservers]
172.24.110.171:22
[webservers]是名字自定义的组,通过分组管理,执行命令判断是否连接成功
# ansible dbservers -m ping -uroot -k
当然也可以,在配置文件中指定账号和密码
[webservers]
172.24.110.171:22 ansible_ssh_user=root ansible_ssh_pass="1qaz2wsx!@"
# ansible dbservers -m ping
指定私钥文件,进行ssh认证(推荐)
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.24.110.171 #回车输入密码
# vim /etc/ansible/hosts
[webservers]
172.24.110.171:22 ansible_ssh_private_key_file=/root/.ssh/id_rsa
# ansible dbservers -m ping
二 ansible常见模块
2.1 shell模块
shell模块 执行shell命令
- name: 在指定目录执行cmd命令.
shell:
cmd: ls -l | grep log
chdir: somedir/
cmd 可执行命令
chdir 工作目录
# ansible webservers -m shell -a 'chdir=/root echo 'xx'> test.txt && cat test.txt'
2.2 copy模块
copy模块 文件复制
- name: 复制本机文件到远程主机,并指定属主、属组、权限
copy:
src: /srv/myfiles/foo.conf
dest: /etc/foo.conf
owner: foo
group: foo
mode: '0644'
src 本机文件或者整个目录
dest 远程主机文件或者目录,不存在目录会自动创建
owner 指定复制后的属主
group 指定复制后的属组
mode 指定文件或者目录权限
# ansible webservers -m copy -a 'src=/root/test/ dest=/root/test/ mode=777'
# ansible webservers -m shell -a 'ls /root/test'
2.3 file模块
file模块 文件管理
- name: 不存在的情况下创建一个目录
file:
path: /etc/some_directory
state: directory
mode: '0755'
- name: 创建文件指定权限
file:
path: /etc/foo.conf
state: touch
mode: u=rw,g=r,o=r
- name: 递归更改目录以及目录下文件的属组、属主
file:
path: /etc/foo
state: directory
recurse: yes
owner: foo
group: foo
- name: 递归删除目录
file:
path: /etc/foo
state: absent
2.4 yum模块
yum模块 软件包管理
- name: 通过网络链接安装nginx
yum:
name: http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
state: present
- name: 安装多个软件依赖包
yum:
name:
- nginx
- postgresql
- postgresql-server
state: present
- name: 卸载软件依赖包
yum:
name: httpd
state: absent
- name: 下载nginx依赖包到指定目录,而不安装
yum:
name:
- nginx
state: latest
download_only: true
download_dir: /root/download
name 指定软件列表
state present安装、absent卸载、latest安装
download_only 下载依赖包
download_dir 依赖包下载后保存的目录
# ansible webservers -m yum -a 'name=nginx state=latest download_dir=/root/nginx download_only=true'
通过shell模块查看/root/nginx目录,可以看到安装nginx需要的依赖包
# ansible webservers -m shell -a 'ls /root/nginx'
172.24.110.171 | CHANGED | rc=0 >>
centos-indexhtml-7-9.el7.centos.noarch.rpm
dejavu-fonts-common-2.33-6.el7.noarch.rpm
nginx-mod-http-image-filter-1.16.1-1.el7.x86_64.rpm
......
2.5 systemd 模块
systemd模块 服务管理
- name: 重启crond服务
systemd:
state: restarted
daemon_reload: yes
name: crond
- name: 重启,并设置为系统服务
systemd:
name: docker
state: restarted
enabled: yes
name 服务名称
state started|stopped|restarted
2.6 unarchive 模块
unarchive模块 解压缩
2.7 debug模块debug模块 调试打印模块
- debug: 打印消息msg,msg不指定默认 Hello World
msg: "message"
- name: 用来打印变量
debug:
var: hostvars[inventory_hostname]
verbosity: 4
msg 指定消息类容
var 变量
verbosity 消息级别,默认0
# ansible webservers -m debug -a 'var=hostvars[inventory_hostname] verbosity=0'
# ansible webservers -m debug -a 'var=abc' -e abc=123 -e指定变量abc的值为123
三 playbook 使用
3.1 变量
ansbile变量教程
变量是应用于多个主机的便捷方式; 实际在主机执行之前,变量会对每个主机添加,然后在执行中引用。
命令行传递-e var=value
# ansible webservers -m debug -a 'var=abc' -e abc=123
主机变量、组变量、所有组变量, inventory中定义
[webservers]
172.24.110.171:22 ansible_ssh_private_key_file=/root/.ssh/id_rsa app1=web1
[webservers:vars]
app2=we2
[all:vars]
app3=web3
# ansible webservers -m debug -a 'var=app2' #在主机中上可以使用app1、app2、app3这三个变量
单文件存储
Ansible中的首选做法是不将变量存储在Inventory中。
除了将变量直接存储在Inventory文件之外,主机和组变量还可以存储在相对于Inventory文件的单个文件中。
组变量:
group_vars 存放的是组变量
group_vars/all.yml 表示所有主机有效,等同于[all:vars]
grous_vars/etcd.yml 表示etcd组主机有效,等同于[etcd:vars]
# vi /etc/ansible/group_vars/all.yml
work_dir: /data
# vi /etc/ansible/group_vars/webservers.yml
nginx_port: 80
# ansible webservers -m debug -a 'var=nginx_port'
在Playbook中定义
- hosts: webservers
vars:
http_port: 80
server_name: www.ctnrs.com
Register变量
register变量是将执行结果保存到register字段中,该字段如下result为JSON类型
- shell: /usr/bin/uptime
register: result
- debug:
var: result
3.2 playbook示例
playbook入门
playbook官方中文教程
playbook 是对任务进行管理、批量执行的快捷工具,参数如下:
— 对多个组进行分割
hosts 指定运行任务的主机组
vars 定义变量
tasks 多个任务组成,每个任务由 -name开始
name 任务名称 shell 任务模块为shell模块 register 将执行结果注入到变量中 tags 指定任务标签,对任务进行分组 when 条件判断,成立则运行任务 with_items …循环,循环结果保存在 item变量中 ……
---
- hosts: webservers
remote_user: root
vars:
http: 80
tasks:
- name: ls
shell:
chdir: /
cmd: ls
register: result
tags: ls
- name: 打印ls执行结果
debug: var=result.stdout_lines
tags: debug,print
- name: when条件执行
debug:
msg: "{{ http }}"
when: http == 80
- name: 普通循环演示
debug: var={{ item }}
with_items:
- 1
- 2
匹配任务标签,进行相应的任务
# ansible-playbook playbook01.yaml -t "ls,debug"
3.3 template模板文件
playbook中的模板文件能使用playbook中的变量,同时可以使用jinja2语言进行编程操作,能够进行持久化保存并且能够使配置得到高效的管理
模板文件存放在playbook文件同层次的templates目录,以 .j2为后缀如下安装nginx,并设置nginx虚拟主机:
# vim playbook02.yaml
---
- hosts: all
remote_user: root
vars:
nginx_vhost_port:
- 81
- 82
- 83
tasks:
- name: Templage Nginx Config
template: src=nginx.conf.j2 dest=/tmp/nginx_test.conf
# vim templates/nginx.conf.j2
{% for port in nginx_vhost_port %}
server{
listen: {{ port }};
server_name: localhost;
}
{% endfor %}
# ansible-playbook playbook02.yaml
上另外一台主机查看:
# cat /tmp/nginx_test.conf
server{
listen: 81;
server_name: localhost;
}
server{
listen: 82;
server_name: localhost;
}s
server{
listen: 83;
server_name: localhost;
}
3.4 roles管理
ansible roles分模块对不同的模块的任务进行管理,roles目录结构固定
# ansible-galaxy init nginx
# tree .
├── site.yml
├── nginx
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
如下只需要在tasks下面的main.yml正常定义任务即可
# vim nginx/tasks/main.yml
---
- name: nginx任务
shell:
chdir: /
cmd: ls
tags: ls,print
register: result
- name: debug任务
debug: var=result
# vim site.yml
- hosts: webservers
gather_facts: false
roles:
- nginx
roles 指定nginx目录的名字,通过目录名字区分模块
# ansible-playbook site.yaml -t 'ls'
3.5 使用技巧
group_vars或者ansible.cfg目录和配置文件可以单独指定,应该和hosts在同层次路径,hosts可以在运行ansible命令时通过-i参数指定。
比如我们要部署大型集群,可以单独指定一个目录存放所有的相关配置:
# tree lamp/
lamp/
├── ansible.cfg
├── group_vars
│ └── all.yml
├── hosts
├── nginx
│ ├── defaults
│ │ └── main.yml
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── meta
│ │ └── main.yml
│ ├── README.md
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ ├── tests
│ │ ├── inventory
│ │ └── test.yml
│ └── vars
│ └── main.yml
└── site.yml
# cat lamp/group_vars/all.yml
work_dir: /opt/lamp
cat lamp/nginx/tasks/main.yml
---
# tasks file for nginx
- name: 打印全局组变量
debug:
var: work_dir
指定-i hosts运行时,nginx任务打印的work_dir参数,能够从hosts同层次目录的group_vars中获取
# ansible-playbook -i hosts site.yml
......
PLAY [webservers] ***********************************************************************************************************************************
TASK [nginx : 打印全局组变量] ******************************************************************************************************************************
ok: [172.17.239.251] => {
"work_dir": "/opt/lamp"
}
ok: [172.17.239.252] => {
"work_dir": "/opt/lamp"
}
PLAY RECAP ******************************************************************************************************************************************
172.17.239.251 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.17.239.252 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
201711
原创文章 4获赞 0访问量 2275
关注
私信
展开阅读全文