DevOps—持续部署Ansible(二)
目录
介绍
安装
默认配置文件结构
Ansible服务配置
Inventory 介绍
Inventory 参数
Inventory配置案例
Ansible常用模块
Ansible执行方式
执行ad-hoc 命令
执行ansible playbook 剧本
介绍
Ansible执行工具是CD持续部署(Continuous Deployment)常用软件。Ansible基于Python语言实现,由paramiko和PyYAML两个关键模块构建。Ansible的编排引擎可以出色地完成配置管理,流程控制,资源部署等多方面工作。
安装
安装Ansible前需要安装Python 2.4 或更高版本的Python,RHEL或CentOS操作系统,需要配置 EPEL,配置EPEL请参考如下指导执行:https://docs.fedoraproject.org/en-US/epel
Ansible安装方式有如下三种:
1、GCC源码安装
git clone https://github.com/ansible/ansible.git --recursive
cd ./ansible
使用 Bash:
source ./hacking/env-setup2、YUM安装
以centos 7为例:
yum -y install epel-release
yum -y install ansible3、RPM离线安装,建议采用方法二。
方法一:制作rpm 包:前提是已安装了 rpm-build, make, and python2-devel .
git clone https://github.com/ansible/ansible.git
cd ./ansible
make rpm
rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm
方法二:通过yum 下载rpm 包:
yum deplist ansible
yum -y install yum-utils
yumdownloader --resolve ansible --destdir=/tmp
rpm -Uvh /tmp/*.rpm
默认配置文件结构
Ansible服务配置
模认配置文件路径为/etc/ansible/ansible.cfg,服务配置含义如下:
配置项 |
说明 |
默认值 |
inventory |
ansible inventory文件路径 |
/etc/ansible/hosts |
library |
ansible模块文件路径 |
/usr/share/my_modules/ |
remote_tmp |
ansible远程主机脚本临时存放目录 |
~/.ansible/tmp |
local_tmp |
ansible管理节点脚本临时存放目录 |
~/.ansible/tmp |
forks |
ansible执行并发数 |
5 |
poll_interval |
ansible异步任务查询间隔 |
15 |
sudo_user |
ansible sudo用户 |
root |
ask_sudo_pass |
运行ansible是否提示输入sudo密码 |
True |
ask_pass |
运行ansible是否提示输入密码 |
True |
transport |
ansible远程传输模式 |
smart |
remote_port |
远程主机SSH端口 |
22 |
module_lang |
ansible模块运行默认语言环境 |
C |
gathering |
facts信息收集开关定义 |
smart |
roles_path |
ansible role存放路径 |
/etc/ansible/roles |
timeout |
ansible SSH连接超时时间 |
10 |
remote_user |
ansible远程认证用户 |
root |
log_path |
ansible日志记录文件 |
/var/log/ansible.log |
module_name |
ansible默认执行模块 |
command |
executable |
ansible命令执行shell |
/bin/sh |
hash_behaviour |
ansible主机变量重复处理方式 |
replace |
private_role_vars |
默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有tasks的任务和handlers得任务可以看到角色变量 |
yes |
vault_password_file |
指定vault密码文件路径 |
无 |
ansible_managed |
定义的一个Jinja2变量,可以插入到Ansible配置模版系统生成的文件中 |
Ansible managed |
display_skipped_hosts |
开启显示跳过的主机 |
True |
error_on_undefined_vars |
开启错误,或者没有定义的变量 |
False |
action_plugins |
ansible action插件路径 |
无 |
cache_plugins |
ansible cache插件路径 |
无 |
callback_plugins |
ansible callback插件路径 |
无 |
connection_plugins |
ansible connection插件路径 |
无 |
lookup_plugins |
ansible lookup插件路径 |
无 |
inventory_plugins |
ansible inventory插件路径 |
无 |
vars_plugins |
ansible vars插件路径 |
无 |
filter_plugins |
ansible filter插件路径 |
无 |
terminal_plugins |
ansible terminal插件路径 |
无 |
strategy_plugins |
ansible strategy插件路径 |
无 |
factfact_caching |
定义ansible facts缓存方式 |
memory |
fact_caching_connection |
定义ansible facts缓存路径 |
无 |
Inventory 介绍
Ansible 本身通过基于文本的方式来记录 inventory 配置信息,默认配置文件为/etc/ansible/hosts,文件位置可以在服务配置文件/etc/ansible/ansible.cfg中定义。
Inventory 参数
ansible_hostname #将要连接的远程主机名。
ansible_ssh_host #将要连接的远程主机IP。
ansible_ssh_port #端口号.如果不是默认的端口号,通过此变量设置。
ansible_ssh_user #默认的 ssh 用户名。
ansible_ssh_pass #密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)。
ansible_su_pass #su 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)。
ansible_sudo_pass #sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)。
ansible_become #是否进行提权操作。如果需要,设置为yes 是
ansible_become_user #设置为具有所需特权的用户-您想要成为的用户,而不是您登录时使用的用户
ansible_become_method #指定权限工具,如sudo,su,pfexec,doas,pbrun,dzdo,ksu,runas,machinectl
ansible become_flags #play或task级别上,允许为任务或角色使用特定的标志。一种常见的用法是,当shell设置为no login时,将用户更改为nobody。此指令是在Ansible 2.2中添加。
ansible_connection #与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行。
ansible_ssh_private_key_file #ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况。
ansible_shell_type #目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'。
ansible_python_interpreter #目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26)。
ansible_ruby_interpreter #与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
Inventory配置案例
vi /etc/ansible/hosts
[qitu] //主机组
192.168.1.2 ansible_hostname: "host1" //主机1参数信息
192.168.1.2 ansible_hostname: "host2" //主机2参数信息
[rds]
192.168.1.3 ansible_hostname: "host3"
[qitu:vars] //主机组参数信息
ansible_ssh_user: "test_user"
ansible_ssh_pass: "123456"
#切换用户执行
#ansible_become: "yes"
#ansible_become_user: "root"
#ansible_become_method: "su"
#ansible_become_pass: "XXXXXX"
[all:vars] //全局参数信息
ntp_server: “ntp.qitu.example.com
Ansible常用模块
ping[网络测试模块]
功能:网络连通测试
ansible all -m pingcommand[命令模块]
功能:命令执行
ansible 172.16.1.31 -m command -a "chdir=/tmp/ pwd"shell[万能模块]
功能:shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息 < > | ;
ansible 172.16.1.41 -m shell -a "hostname;pwd"
可以使用该名模,执行所有linux的命令,所以叫万能模块script[脚本模块]
功能:调用本地脚本远程执行
ansible 172.16.1.7 -m script -a "/server/scripts/mk.sh"
copy[远程复制下发模块]
功能:从本地的文件拷贝到远程主机
常用参数
backup 对数据信息进行备份
src 定义要推送数据信息
dest [必须]定义将数据推送到远程主机什么目录中
owner 设置复制后的文件属主权限
group 设置复制后的文件属组权限
mode 设置复制后的文件权限(600 755)
举例
ansible 172.16.1.41 -m copy -a "src=/tmp/01.txt dest=/tmp/ backup=yes"fetch[远程复制上传模块]
功能:从远程主机的文件拷贝到本地
常用参数
backup 对数据信息进行备份
src 定义要推送数据信息
dest [必须]定义将数据推送到远程主机什么目录中
owner 设置复制后的文件属主权限
group 设置复制后的文件属组权限
mode 设置复制后的文件权限(600 755)
举例
ansible 172.16.1.41 -m fetch -a "src=/tmp/01.txt dest=/tmp/ backup=yes"template[模块定义模块]
功能:和copy module一样强大
常用参数
backup 对数据信息进行备份
src 定义要推送数据信息
dest [必须]定义将数据推送到远程主机什么目录中
owner 设置复制后的文件属主权限
group 设置复制后的文件属组权限
mode 设置复制后的文件权限(600 755)
validate 验证文件
举例:
ansible 172.16.1.41 -m template -a "src=etc/ssh/sshd_config.j2 dest=/etc/ssh/sshd_config.j2 owner=root group=root mode='0600' validate=/usr/sbin/sshd -t %s backup=yes"file[文件操作模块]
功能:文件处理
常见参数
src 定义要推送数据信息
dest [必须]定义将数据推送到远程主机什么目录中
owner 设置文件属主权限
group 设置文件属组权限
mode 设置文件权限(600 755)
state 用于指定创建目录或文件
举例
权限参数
ansible 172.16.1.7 -m file -a "dest=/tmp/01.txt owner=test group=test mode=600"
state创建文件
ansible 172.16.1.41 -m file -a "dest=/tmp/02.txt state=touch"
state创建目录
ansible 172.16.1.41 -m file -a "dest=/tmp/01dir state=directory"yum[包管理模块]
功能:软件安装
常用参数
name [必须]执行要安装软件的名称,以及软件的版本
state installed安装 absent(卸载)
list 指定软件名称,查看软件是否可以安装,以及是否安装过
举例
ansible 172.16.1.41 -m yum -a "name=iftop state=installed"
ansible 172.16.1.41 -m yum -a "name=iftop state=absent"
ansible 172.16.1.41 -m yum -a "list=iftop"service[系统服务管理模块]
常用参数
name [必须]指定要管理的服务名称(管理的服务一定在chkconfig中可以看到)
state stopped started restarted reloaded
enabled yes表示服务开机自启动 no表示服务开机不要自动启动
举例
ansible 172.16.1.41 -m service -a "name=crond state=started enabled=yes"cron[定时任务模块]
常用参数
minute 分,写法同系统定时任务,如[0-59] [*] [*/n]
hour 时,写法同上
day 日,写法同上
month 月,写法同上
weekday 周,写法同上
job 执行命令,如job='/bin/sh /server/scripts/test.sh &>/dev/null'
举例
添加定时任务
ansible 172.16.1.41 -m cron -a "minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
ansible 172.16.1.41 -m cron -a "name=test02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null'"
删除定时任务
ansible 172.16.1.41 -m cron -a "name=test02 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' state=absent"
ansible 172.16.1.41 -m cron -a "name=test01 state=absent"
注释定时任务
ansible 172.16.1.41 -m cron -a "name=test01 minute=0 hour=0 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=yes"a
ansible 172.16.1.41 -m cron -a "name=test01 job='/bin/sh /server/scripts/test.sh &>/dev/null' disabled=no"
Ansible执行方式
提供两种方式去执行任务:
方法一是以执行 ad-hoc 命令的形式;
方法二是以执行 Ansible playbook 剧本的形式;
前者可以解决一些简单的任务, 后者解决较复杂的任务
执行ad-hoc 命令
在模块介绍的时候列举了相关命令,语法如下:
ansible 主机信息 -m 模块名称 -a "相关模块参数"主机信息:远程主机IP地址,主机组名称,all代表所有主机
-a #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”,linux的命令等等
-k #登录密码,提示输入SSH密码而不是假设基于密钥的验证
-K #提示密码使用sudo,sudo表示提权操作
-B #后台运行超时时间
-C #模拟运行环境并进行预运行,可以进行查错测试
-c #连接类型使用
-f #并行任务数,默认为5
-i #指定主机清单的路径,默认为/etc/ansible/hosts
–list-hosts #查看有哪些主机组
-m == #执行模块的名字,默认使用 command 模块==,所以如果是只执行单一命令可以不用 -m参数
-S #用 su 命令
-R #指定 su 的用户,默认为 root 用户
-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户
-T #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u #远程用户,默认为 root 用户
-v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
执行ansible playbook 剧本
语法如下:
字典以简单的形式表示:key: value
#语法书写格式:
# An employee record
martin:name: Martin D'vloperjob: Developerskill: Elite(冒号后面必须有一个空格)#剧本书写案例:
cat /tmp/sshd.yaml
---
#以创建主机ssh 互信为例
- hosts: myhost //操作的主机remote_user: test //执行tesk的用户gater_facts: false //关闭系统变量tasks:- name: create rsashell: yes y |ssh-keygen -b 2048 -t rsa -f /home/test/.ssh/id_rsa -q -N ""- name: Non secret authenticationauthorized_key: user=test key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" state=present exclusive=yes- name: upload id_rsa.pubfetch: src=/home/test/.ssh/id_rsa.pub dest=/data/roles/sshd/files/{{inventory_hostname}}- name: clean authorized_key.templatesshell: "echo >/data/roles/sshd/templates/authorized_keys.templates"delegate_to: localhostwhen: "'test' in group_names"- name: create authorized_keyshell: "grep -r '.*' /data/roles/sshd/files/ |grep 192-168-1 |cut -d ':' -f2 |grep -v shell >> /data/roles/sshd/templates/authorized_keys.templates"delegate_to: localhostwhen: "'test' in group_names"- name: upload authorized_keytemplate: src=authorized_keys.templates dest=/home/test/.ssh/authorized_keys owner=test group=test mode=0700#命令执行格式:
ansible-playbook // 查看帮助
ansible-playbook a.yml --syntax-check //检查yaml文件的语法是否正确
ansible-playbook a.yml --list-task //检查tasks任务
ansible-playbook a.yml --list-hosts //检查生效的主机
ansible-playbook a.yml --start-at-task='Copy Nginx.conf' //指定从某个task开始运行ansible-playbook --syntax-check -e "hosts=c7" xx.yml -s -k // 语法检查
ansible-playbook -i hostslist ***.yml --limit 192.168.0.1 // 排除单个主机
ansible-playbook -i hostslist ***.yml --limit @failed.txt // 排除多个主机ansible-playbook update-stg.yml -f 10 -s -k // 启用10个并行进程数执行
上一篇:DevOps—基本概念(一)
下一篇:DevOps—持续开发gitlab(三)
DevOps—持续部署Ansible(二)相关推荐
- DevOps—持续开发Gitlab(三)
目录 基本概念 服务端gitlab安装 服务端初始化配置 查找临时密码(24h有效) 服务端常用命令 客户端git安装 客户端环境初始化配置 客户端常用命令 基本概念 gitlab 代码管理平台是CD ...
- CI持续集成、持续交付、持续部署
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI). 一.概念 持续集成(Continuous Integratio ...
- Azure DevOps+Docker+Asp.NET Core 实现CI/CD(三.实现CD持续部署管道)
前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...
- 【万字好文】一文看懂持续部署按需发布!DevOps部署和发布方法大全
云妹导读: 敏捷DevOps的一个主要目的是要达成持续的最短的周期进行价值交付,这就离不开快速的部署和发布.那么问题就来了,部署和发布到底是一个概念还是不同的概念?有哪些常见的部署和发布策略?本文将会 ...
- ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署
通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了.本文我会对使用Azure DevOps进行C ...
- ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)
在上文中我介绍了ASP.NET Core应用程序容器化时需要注意的几个问题,并给出了一个案例应用程序:tasklist.今天接着上文的内容,继续了解一下如何使用Azure DevOps进行ASP.NE ...
- 自动/持续部署Docker 的tomcat web项目(二)
自动/持续部署Docker 的tomcat web项目(二) 安装jenkins Jenkins环境配置 创建Jenkins任务 源码拉取 maven构建 SSH连接 一键构建 脚本自动/持续部署 续 ...
- 【华为敏捷/DevOps实践】8. 持续交付,持续部署,傻傻分不清楚
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 "持续交付与持续部署,到底谁应 ...
- DevOps笔记-07:持续集成,持续交付,持续部署之间的区别
假如把开发工作流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付(deliver) -> 部署(deploy) 1.持续集成 持续集成:Cont ...
最新文章
- 具有SSM框架的CRUD与多条件查询
- outlook 发送邮件!
- ABAP算术运算函数
- Winform DataGridView控件添加行号
- 几个使用linux内核的系统,[科普] Linux 的内核与 Linux 系统之间的关系
- 停车场管理系统c语言程序,c语言程序设计 停车场管理系统 停车场有1-20个车位号,设计一个停车场管理系统,实现停车场管理...
- postgresql mysql数据类型_PostgreSQL和mysql数据类型对比兼容
- OOM框架AutoMapper基本使用(2)
- 十天学会php 零基础,十天学会php:第一天
- 学学习笔记:利用TCGA Assembler工具下载及处理数据
- window启动activemq失败
- exlsx中定义名称步骤_excel定义名称详解
- ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
- 语雀转换发布CSDN和语雀导出图片图片无法识别处理(针对typora)
- eos安装区块链开发环境
- wpa_supplicant的用法
- TextView(显示文本)
- JavaScript canvas
- 王者荣耀段位计算器软件
- 计算机应用基础教学内容,计算机应用基础教学大纲