Ansible使用教程

Lena ·
更新时间:2024-11-13
· 783 次阅读

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 关注 私信 展开阅读全文
作者:201711



ansible 教程

需要 登录 后方可回复, 如果你还没有账号请 注册新账号