ansible常用套路(一)
一、SSH互信
1 配置/etc/ansible/hosts 文件
[zabbix_agent]
172.26.4.203
172.26.4.204
172.26.4.205
[zabbix_agent:vars]
ansible_ssh_user=root
ansible_ssh_pass=root1234
ansible_ssh_port=22
2 在ansible-server端生成秘钥对
ssh-keygen -t rsa
3 创建playbook
1) 第一种方式:
# 新增本地(ansible-server)公钥内容到远端客户端.ssh目录中authorized_keys文件,没有则创建authorized_keys文件
# state: 1) present 添加,2) absent 删除
---
- hosts: zabbix_agent
gather_facts: false tasks:
- name: deliver authorized_keys
authorized_key:
user: root
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub) }}" # 解释:
# 添加或移除authorized keys为特定用户:比如上面的是添加读取本地的id_rsa.pub文件到远端主机的authorized_keys文件中
# 把ansible-server中的/root/.ssh/id_ras.pub中的文件内容,拷贝到其他主机中的/root/.ssh/authorized_keys 文件中,实现SSH互信
第二种书写方式:
- hosts: zabbix_agent
remote_user: root tasks:
- name: mkdir /root/.ssh
command: mkdir -p /root/.ssh - name: copy ssh key
copy: src=/root/.ssh/id_rsa.pub dest=/root/.ssh owner=root group=root mode=0644
这个playbook是经过测试的
# 新增本地(ansible-server)公钥内容到远端客户端.ssh目录中authorized_keys文件,没有则创建authorized_keys文件
# state: 1) present 添加,2) absent 删除
---
- hosts: zabbix_agent
gather_facts: false
remote_user: root tasks:
- name: deliver authorized_keys
authorized_key:
user: root
key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
4 运行
cd /etc/ansible/playbook/ssh_trust
ansible-playbook rsync_key.yml
5 可能出现的错误和解决方法
这里只会罗列出,我遇到的错误以及解决方法,如果你和我一样遇到了这个错误,那么恭喜你。咱俩还挺有缘
[root@ansible-server ssh_trust]# ansible-playbook rsync_key.yml PLAY [zabbix_agent] ************************************************************************************************************************************************ TASK [deliver authorized_keys] *************************************************************************************************************************************
fatal: [172.26.4.204]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}
fatal: [172.26.4.203]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}
fatal: [172.26.4.205]: FAILED! => {"msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."}
to retry, use: --limit @/etc/ansible/playbook/ssh_trust/rsync_key.retry PLAY RECAP *********************************************************************************************************************************************************
172.26.4.203 : ok=0 changed=0 unreachable=0 failed=1
172.26.4.204 : ok=0 changed=0 unreachable=0 failed=1
172.26.4.205 : ok=0 changed=0 unreachable=0 failed=1 2)原因和解决办法:
ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到 ~/.ssh/known_hosts 文件中。而本机的~/.ssh/known_hosts文件中并有fingerprint key串
解决方法:在ansible.cfg文件中更改下面的参数:
#host_key_checking = False 将#号去掉即可
二 批量安装配置zabbix-agent
上面的很简单是不是,下面咱们来票大的。这里需要说明的是,使用playbook编写文件时,尽量使用ansible提供的模块,尽量避免使用shell这个模块。因为ansible具有【幂等性】这个特点,具体什么是幂等性,请自行谷歌吧。这里只是简单的说一下。举个栗子,假如我们创建一个文件,第一次没有,我们运行可以创建成功,如果第二次运行一般会报错,说文件已存在。如果使用ansible提供的模块,因为具备【幂等性】特点,则不会报错。他应该有检查机制,存在则不创建了。好了,下面开始咱们看一下使用ansible的最常用的套路吧
如果各位看官对playbook有兴趣可以移步:https://galaxy.ansible.com/
下面开始我们的实战了,激动不。
1 定义hosts文件
这个hosts文件位于/etc/ansible/hosts 如果是yum安装的,一般配置文件都位于这里,hosts文件中定义的组,主机等等。都是我们操作的对象
/etc/ansible/hosts
[zabbix_agent]
172.26.4.203
172.26.4.204
172.26.4.205
[zabbix_agent:vars]
ansible_ssh_user=root
ansible_ssh_pass=root1234
ansible_ssh_port=22
2 查看我们的目录结构
下面的目录结构是不是觉得很多,是很多,但是每个都是很有用的。
给你一个创建的shell吧,下面创建的目录是在 /etc/ansible 目录中创建的
#!/bin/bash mkdir zabbix_centos7
mkdir zabbix_centos7/zabbix_agent
mkdir zabbix_centos7/zabbix_agent/roles
mkdir zabbix_centos7/zabbix_agent/roles
mkdir zabbix_centos7/zabbix_agent/roles/{common,install,uninstall,configure}/{handlers,files,meta,tasks,templates,vars} -p
下面是展开的样子
[root@ansible-server ansible]# tree zabbix_centos7
zabbix_centos7
├── init.sh
├── readme.md
└── zabbix_agent
├── roles
│ ├── common
│ │ ├── files
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── meta
│ │ ├── tasks
│ │ │ └── main.yml
│ │ ├── templates
│ │ └── vars
│ │ └── main.yml
│ ├── configure
│ │ ├── files
│ │ │ └── zabbix_scripts
│ │ │ ├── discovery_tcp_port.sh
│ │ │ └── tcp_connect_status.sh
│ │ ├── handlers
│ │ │ └── main.yml
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── 01-sync-clock.yml
│ │ │ ├── 02-allow-sudo.yml
│ │ │ ├── 03-sync-conf_files.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ ├── Userparameter_script.conf
│ │ │ └── zabbix_agentd.conf
│ │ └── vars
│ │ └── main.yml
│ ├── install
│ │ ├── files
│ │ │ └── ansible-zabbix-4.0.0.tar.gz
│ │ ├── handlers
│ │ ├── meta
│ │ ├── tasks
│ │ │ ├── 01-create-user.yml
│ │ │ ├── 02-copy-code.yml
│ │ │ ├── 03-start-zabbix.yml
│ │ │ ├── 04-add-iptables.yml
│ │ │ └── main.yml
│ │ ├── templates
│ │ │ ├── zabbix_agentd.conf
│ │ │ └── zabbix-agent.service
│ │ └── vars
│ │ └── main.yml
│ └── uninstall
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ │ ├── main.yml
│ │ └── uninstall_zabbix.yml
│ ├── templates
│ └── vars
│ └── main.yml
├── zabbix_configure.retry
├── zabbix_configure.yml
├── zabbix_delete.retry
├── zabbix_delete.yml
├── zabbix_install.retry
└── zabbix_install.yml
3 安装程序的tasks任务列表
1)定义安装程序入口文件 zabbix_install.yml
[root@ansible /etc/ansible/zabbix_centos7/zabbix_agent ]# vim zabbix_install.yml
---
- hosts: testhosts
remote_user: root
gather_facts: True
roles:
- common
- install 2) 定义安装程序-创建用户任务01-create-user.yml
[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# vim roles/install/tasks/01-create-user.yml
---
- name: Create zabbix user
user: name={{ zabbix_user }} state=present create_home=no shell=/sbin/nologin 3) 定义安装程序-拷贝安装文件任务02-copy-code.yml
[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# vim roles/install/tasks/02-copy-code.yml
---
- name: Create src dir
file: path=/opt/source state=directory mode=0755 - name: Create install dir
file: path={{ zabbix_dir }} state=directory mode=0755 - name: Copy zabbix agentd code file to clients
copy: src=ansible-zabbix-{{ zabbix_version }}.tar.gz dest=/opt/source/ansible-zabbix-{{ zabbix_version }}.tar.gz
owner=root group=root - name: Uncompression ansible-zabbix-{{ zabbix_version }}.tar.gz
shell: tar xf /opt/source/ansible-zabbix-{{ zabbix_version }}.tar.gz -C {{ zabbix_dir }} - name: Copy zabbix start scripts
template: src=zabbix-agent.service dest=/usr/lib/systemd/system/zabbix-agent.service owner=root group=root mode=0755 - name: Copy zabbix config file
template: src=zabbix_agentd.conf dest={{ zabbix_dir }}/etc/zabbix_agentd.conf owner={{ zabbix_user }} group={{ zabbix_user }}
mode=0644 - name: Modify zabbix basedir permission
file: path={{ zabbix_dir }} owner={{ zabbix_user }} group={{ zabbix_user }} mode=0755 recurse=yes - name: Link zabbix-agent.service command
file: src={{ zabbix_dir }}/sbin/zabbix_agentd dest=/usr/local/sbin/zabbix_agentd state=link - name: Delete ansible-zabbix-{{ zabbix_version }}.tar.gz source file
shell: rm -f /opt/source/ansible-zabbix-{{ zabbix_version }}.tar.gz 4) 定义安装程序-启动zabbix_agentd服务任务03-start-zabbix.yml
[root@ansible /etc/ansible/zabbix_rhel/zabbix_agent ]# vim roles/install/tasks/03-start-zabbix.yml
---
- name: add permit tmp
file: path=/tmp owner=root mode=0777 recurse=yes
- name: Start zabbix service
service: name=zabbix-agent.service state=started enabled=yes 5) 定义安装程序-添加iptable规则04-add-iptables.yml
---
- name: insert iptables rule for zabbix
lineinfile: dest=/etc/sysconfig/iptables create=yes state=present regexp="{{ zabbix_agentd_port }}"
insertafter="^:OUTPUT"
line="-A INPUT -p tcp --dport {{ zabbix_agentd_port }} -s {{ zabbix_server_ip }} -j ACCEPT" notify: stop firewalld 6) 定义安装程序-tasks任务列表的主调用接口文件main.yml
---
- include: 01-create-user.yml
- include: 02-copy-code.yml
- include: 03-start-zabbix.yml
- include: 04-add-iptables.yml
总结一下上面的
总结: tasks任务列表说明:
Playbook允许用户将tasks任务细分为多个任务列表,通过一个main任务来调用。
当然你也可以将涉及的所有任务全部写到main.yml文件中。
继续...
下面的提供一下git地址吧。自行去看吧。
https://github.com/wanstack/playbook
ansible常用套路(一)的更多相关文章
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
- ansible常用命令
一.ansible常用命令 一.ansible命令的常用参数 ansible 默认提供了很多模块来供我们使用.在 Linux 中,我们可以通过 ansible-doc -l 命令查看到当前 ansib ...
- ansible常用模块用法
ansible常用模块用法 2015-07-21 10:25 24458人阅读 评论(1) 收藏 举报 分类: Linux(44) ansible 版权声明:本文为博主原创文章,未经博主允许不得 ...
- Ansible常用模块介绍及使用(week5_day1_part2)--技术流ken
Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)--技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几 ...
- Ansible常用模块命令
Ansible常用模块命令 一.安装ansible yum install epel-release yum install ansible 二.配置文件配置 vi /etc/ansible/ansi ...
- Ansible常用功能
Ansible 是近几年十分流行的DevOps工具架构什么的我就不在这里赘述了,网上一找一堆 这里写点我在ansible常用功能 1.命令串 #copy文件 #ansible host文件中的主机组 ...
- iptables详解(14):iptables小结之常用套路
不知不觉,已经总结了13篇iptables文章,这些文章中有一些需要注意的地方. 此处,我们对前文中的一些注意点进行总结,我们可以理解为对"常用套路"的总结. 记住这些套路,能让我 ...
- Ansible常用模块介绍及使用(2)
Ansible模块 在上一篇博客<Ansible基础认识及安装使用详解(一)–技术流ken>中以及简单的介绍了一下ansible的模块.ansible是基于模块工作的,所以我们必须掌握几个 ...
- centos ansible常用命令
ansible在日常运维中经常使用,特别是批量执行多台服务器的时候,有效减小重复的操作成本,以下从安装到使用仅讲解工作中常用的几种方式,模块很多功能很强大,但不做全面讨论. ansible安装 在ce ...
随机推荐
- HDU_1457_后缀自动机四·重复旋律7
#1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成 ...
- 比特币 BTC本地测试节点
BTC本地测试节点 #环境 ubuntu 16.4 #客户端安装 #下载页面 #https://bitcoin.org/zh_CN/download cd /opt/ wget https://bit ...
- 小米范工具系列之十:小米范SSH批量命令执行工具
小米范SSH批量命令执行工具的主要功能是自动登录多台机器,并执行指定的命令,比如批量抓取shadow.批量获取系统版本.或者做基线时批量抓取配置等. 此工具使用java 1.8以上版本运行. 界面如下 ...
- React Native入门-刘望舒
React Native入门(一)环境搭建与Hello World React Native入门(二)Atom+Nuclide安装.配置与调试 React Native入门(三)组件的Props(属性 ...
- 【Lua】面向对象编程(一)
类和对象: account.lua module(...,package.seeall) Account={balance=} Account.new=function(self,o) local ...
- 2.3 The Object Model -- Computed Properties
一.What are computed properties? 1. 简而言之,计算属性让你声明函数为属性.你通过定义一个计算属性作为一个函数来创建一个,当你请求这个属性时,Ember会自动调用这个f ...
- 3.4 Templates -- Displaying A List of Items(展示一个集合)
一. 概述 1. example 如果你需要遍历一个对象集合,使用Handlebars的{{#each}}. <ul> {{#each people key="id" ...
- NodeJS学习笔记五
Promise简介 所谓Promise,就是一个对象,用来传递异步操作的消息. Promise对象有以下两个特点. (1)对象的状态不受外界影响.Promise对象代表一个异步操作,有三种状态:Pen ...
- 探索C++虚函数在g++中的实现
本文是我在追查一个诡异core问题的过程中收获的一点心得,把公司项目相关的背景和特定条件去掉后,仅取其中通用的C++虚函数实现部分知识记录于此. 在开始之前,原谅我先借用一张图黑一下C++: “无敌” ...
- Struts2中struts.multipart.maxSize配置
今天使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制 ...