目录

介绍

安装

默认配置文件结构

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(二)相关推荐

  1. DevOps—持续开发Gitlab(三)

    目录 基本概念 服务端gitlab安装 服务端初始化配置 查找临时密码(24h有效) 服务端常用命令 客户端git安装 客户端环境初始化配置 客户端常用命令 基本概念 gitlab 代码管理平台是CD ...

  2. CI持续集成、持续交付、持续部署

    互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI). 一.概念 持续集成(Continuous Integratio ...

  3. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(三.实现CD持续部署管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  4. 【万字好文】一文看懂持续部署按需发布!DevOps部署和发布方法大全

    云妹导读: 敏捷DevOps的一个主要目的是要达成持续的最短的周期进行价值交付,这就离不开快速的部署和发布.那么问题就来了,部署和发布到底是一个概念还是不同的概念?有哪些常见的部署和发布策略?本文将会 ...

  5. ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

    通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了.本文我会对使用Azure DevOps进行C ...

  6. ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(二)

    在上文中我介绍了ASP.NET Core应用程序容器化时需要注意的几个问题,并给出了一个案例应用程序:tasklist.今天接着上文的内容,继续了解一下如何使用Azure DevOps进行ASP.NE ...

  7. 自动/持续部署Docker 的tomcat web项目(二)

    自动/持续部署Docker 的tomcat web项目(二) 安装jenkins Jenkins环境配置 创建Jenkins任务 源码拉取 maven构建 SSH连接 一键构建 脚本自动/持续部署 续 ...

  8. 【华为敏捷/DevOps实践】8. 持续交付,持续部署,傻傻分不清楚

    文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 "持续交付与持续部署,到底谁应 ...

  9. DevOps笔记-07:持续集成,持续交付,持续部署之间的区别

    假如把开发工作流程分为以下几个阶段: 编码 -> 构建 -> 集成 -> 测试 -> 交付(deliver) -> 部署(deploy) 1.持续集成 持续集成:Cont ...

最新文章

  1. 具有SSM框架的CRUD与多条件查询
  2. outlook 发送邮件!
  3. ABAP算术运算函数
  4. Winform DataGridView控件添加行号
  5. 几个使用linux内核的系统,[科普] Linux 的内核与 Linux 系统之间的关系
  6. 停车场管理系统c语言程序,c语言程序设计 停车场管理系统 停车场有1-20个车位号,设计一个停车场管理系统,实现停车场管理...
  7. postgresql mysql数据类型_PostgreSQL和mysql数据类型对比兼容
  8. OOM框架AutoMapper基本使用(2)
  9. 十天学会php 零基础,十天学会php:第一天
  10. 学学习笔记:利用TCGA Assembler工具下载及处理数据
  11. window启动activemq失败
  12. exlsx中定义名称步骤_excel定义名称详解
  13. ElasticSearch~received plaintext http traffic on an https channel, closing connection Netty4HttpChan
  14. 语雀转换发布CSDN和语雀导出图片图片无法识别处理(针对typora)
  15. eos安装区块链开发环境
  16. wpa_supplicant的用法
  17. TextView(显示文本)
  18. JavaScript canvas
  19. 王者荣耀段位计算器软件
  20. 计算机应用基础教学内容,计算机应用基础教学大纲

热门文章

  1. sybase 快速删除大数据库的手顺方法
  2. android EditText 设置弹出数字输入法键盘
  3. 偏门赚钱日赚1000,这个创业项目我本来不想说的....
  4. 简记_插件电阻功率选型及使用注意事项
  5. 溯源供应链引擎APS的历史(蔡颖)
  6. 惠普打印机驱动下载(电脑系统和打印机型号自动匹配)
  7. 开发好APP了如何上架apple store市场
  8. 2019北航计科保研夏令营(非优营)
  9. 在IDEA中集成Jenkins插件 解决Missing or bad crumb data异常
  10. 双向可控硅详细用法说明