博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ansible基础使用
阅读量:2398 次
发布时间:2019-05-10

本文共 24294 字,大约阅读时间需要 80 分钟。

ansible基础

ansible是基于Python研发,实现了批量操作系统配置,批量程序部署,批量执行命令等功能的IT自动化和DevOps软件。自动化运维和运维开发两个职位、下一步架构工程师、
ansible可以实现:自动化部署APP;自动化管理配置项;自动化持续交付;自动化(AWS)云服务管理。
ansible优点:只需要SSH和Python即可使用;无客户端;ansible功能强大,模块丰富;上手容易,门槛低;基于Python开发,做二次开发更容易;使用公司比较多,社区活跃。
ansible特性:模块化设计,调用特定的模块完成特定任务;基于Python语言实现(paramiko、PyYAML半结构化语言、Jinja2);其模块支持JSON等标准输出格式,可以采用任何编程语言重写。部署简单;主从模式工作;支持自定义模块;支持playbook;易于使用;支持多层部署;支持异构IT环境。
ansible主机工作流程:主机的集合,命令的集合
对管理主机:要求Python 2.6或Python 2.7
ansible使用的模块:paramiko、PyYAML、Jinmja2、httpdlib2、six
对于被托管主机的要求:ansible默认通过SSH协议管理机器;被管理主机要开启ssh服务,允许ansible主机登录;在托管节点上也需要安装Python2.5或以上的版本;如果托管节点上开启了SELinux,需要安装libselinux-python
4.执行ansible命令时会调用配置文件去执行,调用配置文件的顺序如下:
首先检测ANSIBLE——CONFIG变量定义的配置文件
其次检查当前目录下的./ansible.cfg文件
再次检查当前用户家目录下~/ansible.cfg文件
最后检查/etc/ansible/ansible.cfg文件(是ansible的默认配置文件路径)
!!!也就是说有自定义配置文件时,要切换到该自定义配置文件所在的目录才能执行ansible命令。!!!

一、部署ansible

1.启动6台虚拟机:2cpu,1.5G以上内存,10G以上硬盘,1块网卡
ansible 192.168.1.40 管理主机
web1 192.168.1.41 托管主机
web2 192.168.1.42 托管主机
db1 192.168.1.43 托管主机
db2 192.168.1.44 托管主机
cache 192.168.1.45 托管主机
2.真机
]# cp -a /linux-soft/04/ansible /var/ftp/
]# createrepo /var/ftp/ansible/
]# base-vm ansible web1 web2 db1 db2 cache
3.给每台机配IP,改主机名,配yum源
]# eip 40
]# hostnamectl set-hostname ansible
]# vim /etc/yum.repos.d/local.repo
搭建阿里云yum仓库
[aliyun_os]
name=aliyun_os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0

[aliyun_extras]

name=aliyun_extras
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0

[aliyun_epel]

name=aliyun_epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0

4.给ansible主机装软件

]# yum -y install ansible
]# ansible --version #查版本ansible 2.4.2.0
]# ansible-config dump | grep -i fork
DEFAULT_FORKS(default) = 5 #改为大一点,比如50,一次可以执行的主机数量
]# vim /etc/ansible/ansible.cfg
forks = 100 #改第19行把5改大
5.改配置文件ansible主机
]# vim /etc/ansible/ansible.cfg
inventory = /etc/ansible/hosts #14行去除注释即可,托管主机群文件路径
host_key_checking = False #61行去除注释即可,ssh管理主机时不需要输入yes
6.定义hosts主机名
]# vim /etc/hosts #增加以下内容
192.168.1.40 ansible
192.168.1.41 web1
192.168.1.42 web2
192.168.1.43 db1
192.168.1.44 db2
192.168.1.45 cache
]# scp /etc/hosts root@192.168.1.41:/etc/
7.定义主机名
]# vim /etc/ansible/hosts #在最后面增加以下内容
[web]
web1 #也可以写成web[1:2],如果有10台可以写成web[1:10];也可以写IP地址,如:192.168.1.[41:42]

[db]

db1
db2

[other]

cache
8.ansible命令基础:ansible 主机集合 -m 模块名称 -a 模块参数
主机集合:主机名或分组名,多个使用“逗号分隔”
-i inventory文件路径,或可执行脚本
-k 使用交互式登录密码
-e 定义变量
-v 显示详细信息
]# ansible web --list-hosts #显示所有web组的主机
]# ansible db --list-hosts #显示所有db组的主机
]# ansible web1 --list-hosts #显示web1主机
]# ansible web1,db --list-hosts #显示web1主机和所有db组的主机
]# ansible all --list-hosts #显示所有的主机
]# ansible web -m ping #报错,因为没有密码,可以先设置免密登录
]# ansible web -m ping -k #输入密码
9.创建一对密钥,设置免密登录
]# cd /root/.ssh
]# ssh-keygen -t rsa -b 2048 -N ‘’ -f key
]# ssh-copy-id -i key.pub web1 #输入密码
]# ssh-copy-id -i key.pub web2 #输入密码
]# ssh-copy-id -i key.pub db1 #输入密码
]# ssh-copy-id -i key.pub db2 #输入密码
]# ssh-copy-id -i key.pub cache #输入密码
10.验证免密
]# ssh -i /root/.ssh/key web1
]# ssh -i /root/.ssh/key web2
]# ssh -i /root/.ssh/key db1
]# ssh -i /root/.ssh/key db2
]# ssh -i /root/.ssh/key cache
11.如果连接的远程主机是个普通用户,应按以下操作
]# vim /etc/ansible/ansible.cfg
[defaults]
inventory = inventory
remote_user = zhangsan

[priviledge_escalation] #提权

become = yes #需要切换用户
become_method = sudo #切换的方式是sudo(另一种方式是su)
become_user = root #切换成管理员
become_ask_pass = no #不询问切换密码
]# vim /etc/sudoers #被管理的服务器,需要配置sudo
zhangsan ALL=(ALL) NOPASSWD: ALL

二、inventory扩展参数

1.设置免密路径一
]# vim /etc/ansible/hosts #增加以下内容,对other组申明密钥对路径
[other:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
]# ansible other -m ping
2.设置免密路径二
]# vim /etc/ansible/hosts #增加以下内容,对所有主机申明密钥对路径
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/key"
]# ansible all -m ping #验证
3.设置免密路径三
]# vim /etc/ansible/hosts #增加以下内容,对db2主机申明密钥对路径
[db]
db1
db2 ansible_ssh_private_key_file="/root/.ssh/key"
]# ansible db2 -m ping #验证
4.设置端口
]# vim /etc/ansible/hosts #增加以下内容,对db2主机申明ssh端口号
[db]
db1
db2 ansible_ssh_port=222 #同时db2主机的ssh配置文件的端口改为222,重启sshd服务才有效。ansible_ssh_user=用户名
]# vim /etc/ssh/sshd_config #db2主机修改端口号
Port 222
]# systemctl restart sshd #db2主机重启sshd服务
]# ssh 192.168.1.44 #在ansible主机远程测试,报错
]# ssh -p 222 192.168.1.44 #在ansible主机远程测试,成功
]# ansible db2 -m ping # #在ansible主机测试,成功
5.设置子组
]# vim /etc/ansible/hosts #定义子组,增加以下内容
[app:children]
web #web组
db #db组
]# ansible app --list-hosts

三、自定义配置文件

1.自定义配置文件
]# mkdir /myansible
]# cd /myansible
]# vim ansible.cfg
[defaults]
inventory = myhosts
host_key_checking = False
]# vim myhosts
[app1]
web1
db1
]# ansible app1 --list-hosts #要在当前/myansible目录下才可以执行此命令
2.利用脚本自定义配置文件
]# mkdir /myansible
]# cd /myansible
]# vim ansible.cfg
[defaults]
inventory = aa.py
host_key_checking = False
]# vim aa.py
#!/usr/bin/python
import json
hostlist = {}
hostlist[“aa”] = [“web1”,“db2”]
hostlist[“bb”] = [“web2”,“db1”,“cache”]
print json.dumps(hostlist)
]# chmod 755 aa.py
]# ./aa.py
]# ansible aa --list-hosts #要在当前/myansible目录下才可以执行此命令
]# ansible bb --list-hosts #要在当前/myansible目录下才可以执行此命令

四、ansible模块:

1.ansible-doc:模块的手册相当于shell的man
]# ansible-doc -l #列出所有模块
]# ansible-doc aci_ap #查看aci_ap的帮助,aci_ap是用ansible-doc -l命令查的
2.ping模块:测试ssh的连通性
]# ansible all -m ping
3.command模块:默认模块,远程执行命令。若命令里有如下字符(<,>,|,&)则执行不成功。不能解析系统变量。不启动shell直接在ssh进程中执行,
]# ansible all -m command -a ‘date +%F_%T’ #查看所有机器的日期和时间
4.shell模块:是通过/bin/sh进行执行命令,可以执行任意命令,不能执行交互式的命令,如:vim top等。能用shell模块的尽量不要用command模块。有变量时按这样写’echo ${HOSTNAME}’
]# ansible all -m shell -a ‘uptime’
]# ansible web1 -m shell -a ‘useradd nb’ #给web1主机添加nb用户
]# ansible web1,db2 -m shell -a ‘useradd nb’ #给web1,db2主机添加nb用户
]# ansible web1,db2 -m shell -a ‘echo 123 | passwd --stdin nb’ #给web1,db2主机添加nb用户设置密码为123
]# ansible cache -m shell -a ‘cd /tmp’ #此命令执行完后,还是回到cache主机的家目录,并不会保持在/tmp目录
]# ansible cache -m shell -a ‘touch testfile’ #此时testfile文件在cache主机的家目录
]# ansible cache -m shell -a ‘chdir=/tmp touch testfile’ #表示切换到/tmp目录下执行touch命令,此处的chdir的作用是cd的作用
]# ansible web -m shell -a ‘echo ${HOSTNAME}’
!!?????!!
变量解析:ansible执行命令是二次解析;第一次在本机解析,第二次在执行机器解析;需要第二次解析的变量要转义(\)
]# ansible web -m shell -a “echo ${HOSTNAME}”
web2 | SUCCESS | rc=0 >>
ansile
web1 | SUCCESS | rc=0 >>
ansile
]# ansible web -m shell -a ‘echo ${HOSTNAME}’ #'echo ${HOSTNAME}'和"echo ${HOSTNAME}"结果一样
web1 | SUCCESS | rc=0 >>
web1
web2 | SUCCESS | rc=0 >>
web2
]# ansible cache -m shell -a ‘echo ${HOSTNAME}’ #'echo ${HOSTNAME}'和"echo \${HOSTNAME}"结果一样
cache | SUCCESS | rc=0 >>
${HOSTNAME}
]# ansible cache -m command -a ‘echo ${HOSTNAME}’
cache | SUCCESS | rc=0 >>
${HOSTNAME}
!!?????!!
5.script模块:在本机写脚本,对所有机批量执行。
]# vim user.sh
#!/bin/bash
id nb
if [ $? != 0 ];then
useradd wk
echo 123 | passwd --stdin wk
fi
]# chmod 755 user.sh
]# ansible web -m script -a ‘./user.sh’ #给所有web主机添加wk用户,要求nb用户与wk用户不能出现在同一台主机上,设置wk用户的密码是123
6.yum模块:安装和移除软件
]# ansible db -m yum -a ‘name=mariadb-server state=installed’ #给db组的所有主机安装mariadb-server软件
]# ansible db -m yum -a ‘name=mariadb-server state=removed’ #给db组的所有主机删除mariadb-server软件
7.service模块:设置开机启动,启动、停止、重启、重新加载。enabled=yes/on;
state=started/stoped/restarted/reloaded。正在运行的服务,修改配置文件后,用reload重新加载。

]# ansible db -m service -a ‘name=mariadb state=started enabled=yes’ #给db组的所有主机启动mariadb和设为开机自启动

8.copy模块:复制本机文件到远程主机。src:本机。dest:目录机。baskup:覆盖前先备份原文件,备份文件包含时间信息,有两个选项:yes/no。force:若目标主机包含该文件,但内容不同,如果设为yes,则强制覆盖,设为no,则只有当目标主机的目标位置不存在该文件时才复制,默认为yes。
]# ansible all -m copy -a ‘src=/etc/resolv.conf dest=/etc/resolv.conf’ #把本机的resolv.conf文件复制给所有主机
]# ansible all -m copy -a ‘src=/etc/yum.repos.d/ dest=/etc/yum.repos.d/’ #把本机的/etc/yum.repos.d/目录下的所有内容复制给所有主机,如果/etc/yum.repos.d这样表示把
]# ansible ansible-demo3 -m copy -a “src=/testdir/copytest dest=/testdir/ force=no”
]# ansible ansible-demo3 -m copy -a “src=/testdir/copytest dest=/testdir/ backup=yes”
yum.repos.d目录复制
给所有db主机开启binlog日志
]# scp /etc/my.cnf root@192.168.1.40:/root #在db1主机把my.cnf配置文件复制给ansible主机
]# vim my.cnf #在ansible主机把my.cnf配置文件改好,增加以下两行
[mysqld]
log_bin = mysql-bin
binlog-format = mixed
]# ansible db -m copy -a ‘src=my.cnf dest=/etc/my.cnf’ #把改好的配置文件复制给db组的所有主机
9.lineinfile模块(line=整行要写完整):替换文件的某一行,正则匹配有多行时只换一行
]# ansible db -m lineinfile -a ‘path="/etc/my.cnf" regexp="^binlog-format" line=“binlog-format = row”’ #把db组的所有主机的/etc/my.cnf文件中binlog-format开头的行的值修改为row
]# ansible db -m shell -a ‘grep -i binlog-format /etc/my.cnf’ #查看修改结果
10.replace模块(replace=只写修改的字符):替换文件的指定字符
]# ansible db -m replace -a ‘path="/etc/my.cnf" regexp=" row$" replace=" mixed"’ ##把db组的所有主机的/etc/my.cnf文件中row结尾的改为mixed
]# ansible db -m shell -a ‘grep -i mixed /etc/my.cnf’ #查看修改结果
11.setup模块:获取主机信息
]# ansible cache -m setup #查看cache主机的信息
]# ansible cache -m setup | grep hostname #查看cache主机的主机名
]# ansible web -m setup | grep hostname #查看web组的所有主机的主机名
]# ansible cache -m setup -a ‘filter=ansible_distribution’ #filter过滤所需信息
]# ansible web -m setup | grep distribution

一、常用命令

1.ansible命令,用于执行临时性的工作,必须掌握。!!
2.ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌据。!!
3.ansible-playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集,必须掌握。!!
4.ansible-console是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用ansible内置的各种命令,这为习惯使用Shell交互方式的用户提供了良好的使用体验
5.ansible-galaxy从github上下载管理Roles的一款工具,与python的pip类拟。
6.ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不榻其他人随意查看,可用它加密/解密这个文件。
7.ansible有两人种工作模式pull/push,默认使用push模式工作,pull和push工作模式机制刚好相反。适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间。通常在配置大批量机器的场景下用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。一般用push,2000台以上用pull。

二、JSON简介

1.JSON是JavaScript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式。JSON中的分隔符限于单引号、小括号、中括号、大括号、冒号、逗号
2.JSON特性:是纯文本,具有“自我描述性”(人类可读),具有层级结构(值中存在值),可通过JavaScript进行解析
3.JSON数据的书写格式是:名称/值对(包括字段名称(在双引号中),后面写一个冒号,然后是值)。如:“诗仙”:“李白”
4.语法规则:数据在名称/值对中;数据由逗号分隔;大括号保存对象;中括号保存数组
{key: value} #大括号保存对象
[a,b,c,d,e] #中括号保存数组
[“a”,“b”,“123”] #数据由逗号分隔
key: [“a”,“b”,“123”] #数据在名称/值对中
[“a”,“b”,“d”: “123”]
[“a”,“b”,[1,2,3]]
key:{k1:v1}
“第一阶段”: “nb”
{
“讲师”: [“nb”,“wk”,“plj”]
}
{“讲师”:
[{“姓名”: “nb”,“爱好”: “唱歌”},
{“姓名”: “wk”,“爱好”: “看书”},
{“姓名”: “plj”,“爱好”: “写字”}]
}

三、YAML简介

1.YAML是一个可读性高的语言,用来表达数据序列的格式。
2.YAML基础语法:YAML的结构通过空格来展示;数组使用“- ”来表示;键值对使用“: ”来表示;YAML使用一个固定的缩进风格表示数据层级结构关系;一般每个缩进级别由两个以上空格组成;#表示注释。
3.注意:不要使用tab,缩进是初学者容易出错的地方之一;同一层级缩进必须对齐。
4.YAML的键值表示方法:采用冒号分隔;冒号后面必须有一个空格。
如:“诗仙”: “李白” #不能用中文的冒号,冒号后面要有空格,不能用tab键产生的空格
“诗仙”:
“李白”

{key: value} #JSON格式

{key: value} #YAML格式

[“a”,“b”,“123”] #JSON格式

  • “a” #YAML格式,"-"后要有空格
  • “b”
  • “123”

key: [“a”,“b”,“123”] #JSON格式

key: #YAML格式

  • “a” #要有缩进,"-"后要有空格
  • “b”
  • “123”

“第一阶段”: “nb” #JSON格式

“第一阶段”: “nb” #YAML格式,冒号后要有空格

“讲师”: [“nb”,“wk”,“plj”] #JSON格式

“讲师”:

  • “nb” #YAML格式,要有缩进,"-"后要有空格
  • “wk”
  • “plj”

{“讲师”: #JSON格式

[{“姓名”: “nb”,“爱好”:“唱歌”},
{“姓名”: “wk”,“爱好”:“看书”},
{“姓名”: “plj”,“爱好”:“写字”}]
}

“讲师”: #YAML格式

“姓名”: “nb”
“爱好”: “唱歌”

“姓名”: “wk”
“爱好”: “看书”

“姓名”: “plj”

“爱好”: “写字”

四、Jinja2模版简介

1.Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑。
2.为什么要学习Jinja2模版:因为playbook的模板使用Python的Jinja2模块来处理。
3.Jinja2模版基本语法:
模板的表达式都是包含在分隔符"{
{ }}“内的
控制语句都是包含在分隔符”{% %}“内的
模板支持注释,都是包含在分隔符”{# #}"内,支持块注释
调用变量 {
{varname}}
计算 {
{2+3}}
判断 {
{1 in [1,2,3]}}
Jinja2模版控制语句
{% if name == ‘诗仙’ %}
李白
{% elif name == ‘诗圣’ %}
杜甫
{% elif name == ‘诗魔’ %}
白居易
{% else %}
李贺
{% endif %}
Jinja2模版控制语句
{% if name == … … %}
… …
{% elif name == ‘于谦’ %}
{% for method in [抽烟,喝洒,打牌] %}
{
{do method}}
{% endfor %}
… …
{% endif %}
Jinja2过滤器:变量可以通过过滤器修改。过滤器与变量用管道符号(|)分割,也可以用圆括号传递可选参数,多个过滤器可以链式调用,前一个过滤器的输出会会被作为后一个过滤器的输入。
如:加密一个字符串{
{‘astr’|password_hash(‘sha512’)}}
http://docs.jinkan.org/docs/jinja2/templates.html

五、playbook:即是ansible的脚本

1.playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期状态。
2.执行复杂任务时,最好使用playbook,可以反复使用编写的代码,可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,处理的大部分操作都是在编写playbook
3.playbook语法格式:
playbook由YAML语言编写,遵循YAML标准
在同一行中,#之后的内容表示注释
同一个列表中的元素应该保持相同的缩进
playbook由一个或多个play组成
play中hosts、variables、roles、tasks等对象的表示方法都是键值中间发": "分隔表示
YAML还有一个小的怪癖,它的文件开始行都应该是—,这是YAML格式的一部分,表明一个文件的开始
4.playbook构成:
hosts: 定义将要执行playbook的远程主机组。主机的集合,定义要执行任务的主机。
vars: 定义playbook运行时需要使用的变量。
tasks: 定义将要在远程主机上执行的任务列表。命令的集合,每一个play包含了一个task列表(任务列表),一个task在其所对应的所有主机上(通过host pattern匹配的所有主机)执行完毕之后,下一个task才会执行。
handlers: 定义task执行完成以后需要调用的任务
5.playbook执行结果
使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别,绿色代表执行成功,***代表系统状态发生改变,红色代表执行失败。

六、playbook案例

1.测试所有主机ssh连通性
]# vim ping.yml #要求.yml或.yaml后缀
— #表示开始。语法格式

  • hosts: all #hosts是数组,所以前面要有"- "。内容是一个(多个)组或主机的patterns,以逗号为分隔符。如:all;web;db;web,db
    remote_user: root #用户名
    tasks: #注意冒号后面的空格不能少
    • ping: #注意冒号后面的空格不能少
      ]# ansible-playbook ping.yml #测试
      ]# ansible-playbook ping.yml -f 5 #-f并发进程数量,默认是5,可以写CPU核数的8倍
      ]# rm -f ping.retry ???
      清除缓存 ???

2.给web主机添加用户z3,设置默认密码123,并把z3用户添加到users组
]# vim user.yml

  • hosts: web
    remote_user: root
    tasks:
    • name: create user z3 #此行为说明,可有可无
      user:
      name: z3
      group: users
    • name: set password #此行为说明,可有可无
      shell: echo 123 | passwd --stdin z3
      ]# ansible-playbook user.yml #测试

3.给所有web主机安装Apache,修改配置文件的监听端口为8080,设置默认主页hello world,启动服务,设置开机自启
]# vim yum.yml

  • hosts: web
    remote_user: root
    tasks:
    • name: install the latest version of Apache #ansible-doc yum查看帮助
      yum:
      name: httpd
      state: latest
    • name: change port #ansible-doc replace查看帮助
      replace:
      path: /etc/httpd/conf/httpd.conf
      regexp: Listen 80
      replace: Listen 8080
    • name: copy file #ansible-doc copy查看帮助
      copy
      src : index.html #当前路径的index.html
      dest: /var/www/html/index.html #目标路径的index.html
      owner: apache #所属者
      group: apache #所属组
      mode: 0644 #权限
    • name: state,enabled #ansible-doc service查看帮助
      service:
      name: httpd
      state: started
      enabled: yes
      ]# echo “hello world” > index.html
      ]# ansible-playbook yum.yml #执行playbook脚本
      ]# ansible web -m shell -a ‘ss -upantl | grep :8080’ #验证8080端口
      ]# ansible web -m shell -a ‘ss -upantl | grep :8080’ #验证8080端口
      ]# ansible web -m shell -a ‘curl 192.168.1.41:8080’ #验证页面

4.设置变量,给web主机添加用户l4,设置默认密码123,并把l4用户添加到users组
]# vim user.yml

  • hosts: web
    remote_user: root
    vars:
    username:l4
    tasks:
    • name: create user “{
      {username}}”
      user:
      name: “{
      {username}}”
      group: users
    • name: set password
      shell: echo 123 | passwd --stdin “{
      {username}}”
      ]# ansible-playbook user.yml #测试

5.设置变量,给web主机添加用户l5,设置默认密码123,并把l5用户添加到users组
]# vim user.yml

  • hosts: web
    remote_user: root
    vars:
    username: l5
    tasks:
    • name: create user “{
      {username}}”
      user:
      name: “{
      {username}}”
      group: users
      password: “{
      {‘123’|password_hash(‘sha512’)}}” #直接设置密码
      ]# ansible-playbook user.yml #测试

6.先定义变量,给web主机添加用户zhang,设置默认密码123,并把zhang用户添加到users组
]# vim user.yml

  • hosts: web
    remote_user: root
    tasks:
    • name: create user “{
      {username}}”
      user:
      name: “{
      {username}}”
      group: users
      password: “{
      {‘123’|password_hash(‘sha512’)}}”
      ]# vim args.yml #先定义变量

username:

“zhang”
]# ansible-playbook user.yml -e @args.yml #调用变量文件,测试 。-e 参数(参数格式必须是json或yaml,yaml格式时可以使用文件)

7.测试时直接定义变量,给web主机添加用户dc,设置默认密码123,并把dc用户添加到users组
]# vim user.yml

  • hosts: web
    remote_user: root
    tasks:
    • name: create user “{
      {username}}”
      user:
      name: “{
      {username}}”
      group: users
      password: “{
      {‘123’|password_hash(‘sha512’)}}”
      ]# ansible-playbook user.yml -e ‘{“username”: “dc”}’ #直接定义变量,测试

7.也以用等号代替冒号空格
]# vim user.yml

  • hosts: web
    remote_user: root
    vars:
    username: mn
    tasks:
    • name: create user “{
      {username}}”
      user:
      name={
      {username}} #也可以用=
      password={
      {‘123’|password_hash(‘sha512’)}} #也可以用=
      group=users #也可以用=
      ]# ansible-playbook user.yml

8.对error的处理:尽量不要用shell模块改用file模块,或在shell模块下面加入ignore_errors: True
]# vim mkdir.yml

  • hosts: web
    remote_user: root
    tasks:
    • shell: mkdir /tmp/apache
      ignore_errors: True #加入这句的作用是当有报错时忽略错误,继续执行。ignore_errors: False表示遇到错误时就停止执行。默认为False
    • name: ReStart service httpd
      service:
      name: httpd
      state: restarted
      ]# ansible-playbook mkdir.yml

9.用file代替shell
]# vim mkdir.yml

  • hosts: web
    remote_user: root
    tasks:
    • file:
      path: /tmp/abc
      state: directory #创建上面的目录
    • name: ReStart service httpd
      service:
      name: httpd
      state: restarted
      ]# ansible-playbook mkdir.yml

10.tags打标签、notfy定义触发器、handlers触发后的动作
handlers当关注的资源发生变化时采取的操作
notify这个tion可用于在每个play的最后被触发,这样可以避免有多次改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成后一次性地执行指定操作
在notify中列出的操作称为handler,即notify调用handler中定义的操作
]# vim copy.yml

  • hosts: web
    remote_user: root
    tasks:
    • copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
      owner: root
      group: root
      mode: 0644
      tags: chage_conf #打上标签
      notify: #触发器
      • reload_httpd #此处名字要和下面的handlers的name: reload_httpd一致。触发后重启httpd
    • copy:
      src: index.html
      dest: /var/www/html/index.html
      owner: apache
      group: apache
      mode: 0644
      tags: chage_index #打上标签
      handlers: #触发之后要做的动作
    • name: reload_httpd #此处不是说明,而是动作的名字
      service:
      name: httpd
      state: restarted
      ]# scp /var/www/html/index.html root@192.168.1.40:/root
      ]# scp /etc/httpd/conf/httpd.conf root@192.168.1.40:/root
      ]# vim httpd.conf
      Listen 808 #修改端口号
      ]# vim index.html
      nsd1905 #修改主页页面内容
      ]# ansible web -m shell -a ‘curl 192.168.1.41:8080’ #结果为hello world
      ]# ansible-playbook copy.yml -t chage_index #执行脚本的标签,带了标签时只执行脚本中此标的内容
      ]# ansible web -m shell -a ‘curl 192.168.1.41:8080’ #结果为nsd1905
      ]# ansible-playbook copy.yml -t chage_conf #执行脚本的标签,带了标签时只执行脚本中此标的内容
      ]# ansible web -m shell -a ‘curl 192.168.1.41:8080’ #结果为报错,因为端口已经是808
      ]# ansible web -m shell -a ‘curl 192.168.1.41:808’ #把端口改为808时,结果为nsd1905
      ]# ansible-playbook copy.yml #执行脚本的所有内容

lftp sftp://web1 ?? #下载web1的配置文件????????????????

11.when条件、register保存执行结果
when:有些时候需要在满足特定的条件后再触发某一项操作,或在特定的条件下终止某个行为,这个时候需要进行条件判断,when正是解决这个问题的最佳选择,远程中的系统变量facts作为when的条件,可以通过setup模块查看
register:有时候我们还需要更复杂的例子,如判断前一个命令的执行结果去处理后面的操作,这时候就需要register模块来保存前一个命令的返回状态,在后面进行调用。
]# vim load.yml

  • hosts: web
    remote_user: root
    tasks:
    • shell: uptime | awk ‘{printf("%.2f\n",$(NF-2))}’ ???
      register: result #定义变量,变量名为result
    • service:
      name: httpd
      state: stopped
      when: result.stdout|float > 0.7 #当负载超过0.7时关闭httpd。stdout表示标准输出
      ]# awk ‘BEGIN{while(1){}}’ & #在web1主机上编写死循环
      ]# watch -n 1 uptime #动态查看负载变化情况
      ]# ansible-playbook load.yml #当负载超过0.7后在ansible执行脚本,结果web1主机显示为httpd关闭状态

12.with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{
{item}}获取每次迭代的值
]# vim user01.yml

  • hosts: db
    remote_user: root
    tasks:
    • name: add user “{
      {item}}”
      user:
      name: “{
      {item.username}}”
      group: “{
      {item.group}}”
      password: “{
      {item.password | password_hash(‘sha512’)}}”
      with_items:
      -
      username: nb
      group: users
      password: “123456”
      -
      username: wk
      group: bin
      password: banana
      -
      username: jj
      group: daemon
      password: “qqq123…A”
      ]# ansible-playbook user01.yml

13.利用include把其他文件包含进来

一般所需的目录层级有
vars:变量层
tasks:任务层
handlers:触发条件
files:文件
template:模板
default:默认,优先级最低
tasks:

  • include: tasks/setup.yml
  • include: tasks/users.yml user=plj #users.yml中可以通过{
    {user}}来使用这些变量。 #这个为说明
    handlers:
  • include: handlers/handlers.yml

]# mkdir -p /root/a/handler
]# vim /root/a/handler/handler.yml

- name: reload_httpd  service:     name: httpd    state: restarted

]# vim t.yml

  • hosts: web
    remote_user: root
    tasks:
    • copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
      owner: root
      group: root
      mode: 0644
      tags: chage_conf
      notify:
      • reload_httpd
    • copy:
      src: index.html
      dest: /var/www/html/index.html
      owner: apache
      group: apache
      mode: 0644
      tags: chage_index
      handlers:
    • include: a/handler/handler.yml #include的使用
      ]# ansible-playbook t.yml

14.利用role把a文件夹下的相关文件自动添加进这个play
]# mkdir -p /root/a/tasks
]# mkdir -p /root/a/handler
]# vim /root/a/handler/copy.yml

handlers:
- name: reload_httpd
service:
name: httpd
state: restarted
]# vim /root/a/tasks/copy.yml

  • hosts: web
    remote_user: root
    tasks:
    • copy:
      src: httpd.conf
      dest: /etc/httpd/conf/httpd.conf
      owner: root
      group: root
      mode: 0644
      tags: chage_conf
      notify:
      • reload_httpd
    • copy:
      src: index.html
      dest: /var/www/html/index.html
      owner: apache
      group: apache
      mode: 0644
      tags: chage_index
      ]# vim t.yml

  • hosts: web
    roles: #roles的使用
    • a
      ]# ansible-playbook t.yml

15.调试:
排错调试方法之检测语法(不太准):ansible-playbook --syntax-check playbook.yml
排错调试方法之测试运行(不太准):ansible-playbook -C playbook.yml
显示受到影响的主机 --list-hosts
显示工作的task --list-tasks
显示将要运行的tag --list-tags
]# vim load.yml

  • hosts: web
    remote_user: root
    tasks:
    • shell: uptime | awk ‘{printf("%.2f\n",$(NF-2))}’ ???
      register: result
    • service:
      name: httpd
      state: stopped
      when: result.stdout|float > 0.7
    • name: Show debug info
      debug: var=result #debug模块可以在运行时输出更为详细的信息,帮助我们排错
      ]# awk ‘BEGIN{while(1){}}’ & #在web1主机上编写死循环
      ]# watch -n 1 uptime #动态查看负载变化情况
      ]# ansible-playbook load.yml #当负载超过0.7后在ansible执行脚本,结果web1主机显示为httpd关闭状态
      ]# ansible-playbook --syntax-check load.yml #–syntax-check 检测语法(不太准)
      ]# ansible-playbook -C load.yml #-C 测试运行(不太准)
      ]# ansible-playbook load.yml --list-hosts #显示受到影响的主机
      ]# ansible-playbook load.yml --list-tasks #显示工作的task
      ]# ansible-playbook load.yml --list-tags #显示将要运行的tag

####################

playbook总结:即是ansible的脚本,用YAML语言格式编写

一、YAML简介
1.YAML是一个可读性高的语言,用来表达数据序列的格式。
2.YAML基础语法:
YAML的结构通过空格来展示
数组使用“- ”来表示,横线后面必须有一个空格
键值对使用“: ”来表示,不能用中文的冒号,冒号后面必须有一个空格
YAML使用一个固定的缩进风格表示数据层级结构关系
一般每个缩进级别由两个以上空格组成
在同一行中,#之后的内容表示注释
不要使用tab缩进
同一个列表中的元素应该保持相同的缩进,必须对齐
YAML还有一个小的怪癖,它的文件开始行都应该是—,这是YAML格式的一部分,表明一个文件的开始
文件名要求.yml或.yaml结尾
二、playbook
1.playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期状态。
2.执行复杂任务时,最好使用playbook,可以反复使用编写的代码,可以放到不同的机器上面,像函数一样,最大化的利用代码
3.playbook语法格式:
playbook由YAML语言编写,遵循YAML标准
playbook由一个或多个play组成
play中hosts、variables、roles、tasks等对象的表示方法都是键值中间发": "分隔表示
尽量不要用shell模块改用file模块,或在shell模块下面加入ignore_errors: True加入这句的作用是当有报错时忽略错误,继续执行。ignore_errors: False表示遇到错误时就停止执行。默认为False
4.tags打标签、notfy定义触发器、handlers触发后的动作
handlers当关注的资源发生变化时采取的操作
notify这个tion可用于在每个play的最后被触发,这样可以避免有多次改变发生时每次都执行指定的操作,取而代之仅在所有的变化发生完成后一次性地执行指定操作
在notify中列出的操作称为handler,即notify调用handler中定义的操作
11.when条件、register保存执行结果
when:有些时候需要在满足特定的条件后再触发某一项操作,或在特定的条件下终止某个行为,这个时候需要进行条件判断,when正是解决这个问题的最佳选择,远程中的系统变量facts作为when的条件,可以通过setup模块查看
register:有时候我们还需要更复杂的例子,如判断前一个命令的执行结果去处理后面的操作,这时候就需要register模块来保存前一个命令的返回状态,在后面进行调用。
12.with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{
{item}}获取每次迭代的值
5.playbook构成:
hosts: 定义将要执行playbook的远程主机组。主机的集合,定义要执行任务的主机。内容是一个(多个)组或主机的patterns,以逗号为分隔符。如:- hosts: all/web/db/web,db
vars: 定义playbook运行时需要使用的变量。
tasks: 定义将要在远程主机上执行的任务列表。命令的集合,每一个play包含了一个task列表(任务列表),一个task在其所对应的所有主机上(通过host pattern匹配的所有主机)执行完毕之后,下一个task才会执行。任务模块用ansible-doc查看,如:ansible-doc copy
handlers: 定义task执行完成以后需要调用的任务
5.playbook执行结果
使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别,绿色代表执行成功,***代表系统状态发生改变,红色代表执行失败。
13.利用include把其他文件包含进来
14.利用role把a文件夹下的相关文件自动添加进这个play
15.debug: var=result #debug模块可以在运行时输出更为详细的信息,帮助我们排错

一般所需的目录层级有

vars:变量层
tasks:任务层
handlers:触发条件
files:文件
template:模板
default:默认,优先级最低

一、典型案例

]# vim es.yml #要求.yml或.yaml后缀
— #表示开始

  • hosts: es #定义主机集合
    remote_user: root #用户名
    vars: #定义变量
    username:l4 #变量名为l4
    tasks: #定义将要在远程主机上执行的任务列表
    • name: create user “{
      {username}}” #此行为说明,可有可无
      user: #创建用户模块
      name: “{
      {username}}” #调用变量创建用户
      group: users
      password: “{
      {‘123’|password_hash(‘sha512’)}}” #直接设置密码
    • user:
      name: “{
      {item.username}}”
      group: “{
      {item.group}}”
      password: “{
      {item.password | password_hash(‘sha512’)}}”
      with_items: #with_items是playbook标准循环,可以用于迭代一个列表或字典,通过{
      {item}}获取每次迭代的值
      -
      username: nb
      group: users
      password: “123456”
      -
      username: wk
      group: bin
      password: banana
    • copy: #ansible-doc copy查看帮助
      src: local.repo #当前路径的local.repo
      dest: /etc/yum.repos.d/local.repo #目标路径的local.repo
      owner: root #所属者
      group: root #所属组
      mode: 0644 #权限
    • file: #用file代替shell,报错时忽略错误,继续执行后面的操作。如下:当已经有/tmp/abc文件夹时,忽略错误会继续执行后面的操作
      path: /tmp/abc
      state: directory #创建上面的目录
    • yum:
      name: java-1.8.0-openjdk,elasticsearch
      state: installed
    • replace:
      path: /etc/httpd/conf/httpd.conf
      regexp: Listen 80
      replace: Listen 8080
    • lineinfile:
      • include: a/copy/copy.yml #include的使用
        tags: chage_index #打上标签
    • shell: uptime | awk ‘{printf("%.2f\n",$(NF-2))}’ ???
      register: result #register保存执行结果。变量名为result
    • service:
      name: httpd
      state: stopped
      when: result.stdout|float > 0.7 #when条件。当负载超过0.7时关闭httpd。stdout表示标准输出
    • name: Show debug info
      debug: var=result #debug模块可以在运行时输出更为详细的信息,帮助我们排错
    • template:
      src: elasticsearch.yml
      dest: /etc/elasticsearch/elasticsearch.yml
      owner: root
      group: root
      mode: 0644
      notify: reload elasticsearch #触发器
      tags: esconf #打上标签
    • service:
      name: elasticsearch
      state: started
      enabled: yes
      handlers: #触发之后要做的动作。当关注的资源发生变化时采取的操作
    • name: reload elasticsearch
      service:
      name: elasticsearch
      state: restarted

二、调试:

]# ansible-playbook load.yml #当负载超过0.7后在ansible执行脚本,结果web1主机显示为httpd关闭状态
]# ansible-playbook --syntax-check load.yml #–syntax-check 检测语法(不太准)
]# ansible-playbook -C load.yml #-C 测试运行(不太准)
]# ansible-playbook load.yml --list-hosts #显示受到影响的主机
]# ansible-playbook load.yml --list-tasks #显示工作的task
]# ansible-playbook load.yml --list-tags #显示将要运行的tag
]# ansible-playbook ping.yml -f 5 #-f并发进程数量,默认是5,可以写CPU核数的8倍
]# ansible-playbook user.yml -e @args.yml #调用变量文件,测试 。-e 参数(参数格式必须是json或yaml,yaml格式时可以使用文件)
]# ansible-playbook copy.yml -t chage_index #执行脚本的标签,带了标签时只执行脚本中此标的内容

转载地址:http://nlfob.baihongyu.com/

你可能感兴趣的文章
超市食品名称中英文对照(zt)
查看>>
第六章 预测与决策
查看>>
14大管理方法工具(zt)
查看>>
职业生涯规划与管理实操(zt)
查看>>
国贸、货代常用词汇(zt)
查看>>
人力资源术语英汉对照(zt)
查看>>
传说中的100句英语可以帮你背7000单词(zt)
查看>>
网管IT服务管理五个心得 (zt)
查看>>
沟通管理 让你的团队动起来(zt)
查看>>
循序渐进学SAP系列(一):--SAP该如何入门
查看>>
PMP考试经验谈(转载)
查看>>
緣分是找到包容你的人(转载)
查看>>
怎样确保项目评估的精确
查看>>
[思维导图学习二] 如何绘制思维导图?
查看>>
物流系统管理课程(二十五)
查看>>
60句经典话语
查看>>
提高执行力的5个法则(zt)
查看>>
第十二章 管理人员的选聘,考评及培训
查看>>
ERP实施的项目管理
查看>>
关注人力资源管理的十大变化(转)
查看>>