Ansible

什么是ansible
• ansible是2013年推出的一款IT自动化和DevOps软件,2015年被RedHat收购。是基于Python研发,糅合很多老运维工具的优点,实现了批量操作系统配置,批量程序部署,批量运行命令等功能
• ansible可以实现:
– 自动化部署APP
– 自动化管理配置项
– 自动化持续交付
– 自动化(AWS)云服务管理

 

为什么选择ansible
• 选择一款配置管理软件,无外乎从以下几点来权衡利弊
– 活跃度(社区)
– 学习成本
– 使用成本
– 编码语言
– 性能
– 使用是否广泛

• ansible优点
– 只需要SSH和Python即可使用
– 无客户端
– ansible功能强大,模块丰富
– 上手容易,门槛低
– 基于Python开发,做二次开发更容易
– 使用公司比较多,社区活跃

 

 

ansible特性
• 模块化设计,调用特定的模块完成特定任务
• 基于Python语言实现
– paramiko
– PyYAML (半结构化语言)
– Jinja2
• 其模块支持JSON等标准输出格式,可以采用任何编程语言重写

• 部署简单
• 主从模式工作
• 支持自定义模块
• 支持playbook
• 易于使用
• 支持多层部署
• 支持异构IT环境

 

Python -->YAML --> 输出JSON

 

2个集合:  主机的集合();   命令的集合

 

读取配置------> 主机机器过滤出来(主机集合)---> 命令的集合(模块)  

 

工作流程

 

 

• Yum安装
– 把软件包拷贝到(真机) ftp 共享目录中

ansible-2.4.2.0-2.el7.noarch.rpm         python-passlib-1.6.5-2.el7.noarch.rpm
python2-jmespath-0.9.0-3.el7.noarch.rpm  repodata
python-httplib2-0.9.2-1.el7.noarch.rpm   sshpass-1.06-2.el7.x86_64.rpm
python-paramiko-2.1.1-4.el7.noarch.rpm


– 更新索引文件
createrepo --update .                   
• 安装及验证
– 在 ansible 托管主机上配置 yum 配置文件
– 安装 yum install ansible
– 验证 ansible --version

 

环境准备
ansible 192.168.5.40 管理主机
web1 192.168.5.41 托管主机
web2 192.168.5.42 托管主机
db1    192.168.5.43 托管主机
db2    192.168.5.44 托管主机
cache 192.168.5.45 托管主机

 

[root@ansible ansible]# vim /etc/ansible/ansible.cfg 

 14 inventory      = /etc/ansible/hosts                        

 61 host_key_checking = False                              #False,不需要输入 yes    |    True,等待输入 yes

[root@ansible ansible]# vim /etc/ansible/hosts 

[web]
web1
web2

[db]
db[1:2]

[other]
cache

[root@ansible ansible]# vim /etc/hosts
192.168.5.40 ansible
192.168.5.41 web1
192.168.5.42 web2
192.168.5.43 db1
192.168.5.44 db2
192.168.5.45 cache
 

[root@ansible ansible]# ansible web --list-hosts
[root@ansible ansible]# ansible web,cache --list-hosts
[root@ansible ansible]# ansible all --list-hosts

 

• ansible 主机集合 -m 模块名称 -a 模块参数

 主机集合 主机名或分组名,多个使用"逗号"分隔
-m 模块名称,默认 command 模块
-a  or --args 模块参数
• 其他参数
– -i inventory文件路径,或可执行脚本
– -k 使用交互式登录密码
– -e 定义变量
– -v 显示详细信息

 

 

• 批量检测主机
– ansible all -m ping -k                  #与ping工具没有关系,测试ssh的,-k要所有主机密码一样;密码写入配置文件安全性很差

ssh-keygen 

ssh-copy-id web1/web2/db1/db2/cache                      #依次传给每一个主机,部署公钥

ansible all -m ping            #这次不报错了

[root@web1 ~]# vim /etc/ssh/sshd_config 

Port 999

[root@web1 ~]#  systemctl restart sshd

[root@ansible .ssh]# ansible all -m ping  #有一个会报错,原因:连接22端口失败

[root@ansible .ssh]# vim  /etc/ansible/hosts

[web]
web1 ansible_ssh_port=999                                #如果该主机ssh端口不是默认22需添加此项声明端口
web2

[db]
db1 
db2

[other]
cache
[root@ansible .ssh]# ansible all -m ping           
 

[root@ansible .ssh]# pwd
/root/.ssh
[root@ansible .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts
[root@ansible .ssh]# mv id_rsa  id_rsa.ansible           #改私钥名称
[root@ansible .ssh]# ansible all -m ping
[root@ansible .ssh]# ansible all -m ping                        #此时全部报错


  

[web]
web1 ansible_ssh_port=999
web2

[db]
db1
db2

[other]
cache
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible"                                        #私钥文件位置,vars变量定义,用于组名后面
 

[root@ansible .ssh]# ansible all -m ping                       #私钥认证正确
 

[web]
web1 ansible_ssh_port=999
web2

[db]
db1
db2

[other]
cache
[all:vars]
ansible_ssh_private_key_file="/root/.ssh/id_rsa.ansible"
[app:chldren]                                                                              #children 子组定义,用于引用其他组名称
web
db
 

 

查找顺序(优先级):

1.环境变量,脚本里             – 首先检测ANSIBLE_CONFIG变量定义的配置文件

2.当前路径下的ansible.cfg – 其次检查当前目录下的 ./ansible.cfg 文件

3.– 再次检查当前用户家目录下 ~/ansible.cfg 文件

4./etc/ansible下                  – 最后检查/etc/ansible/ansible.cfg文件(默认配置文件路径)

 

  mkdir ooxx
 cd ooxx
 vim ansible.cfg

[defaults]
inventory   =  t.py                      #inventory指定的配置文件,写入远程主机的地址,定义托管主机地址配置文件路径名
host_key_checking = False

 vim myhost

[app1]                                      #[组名称] ,  主机名称或ip地址,其他参数
web1
[app2]
db1

 ansible web --list-host     #列出要执行的主机
 ansible app1 --list-host
 ansible app2 --list-host
 cd                                           #回到root目录下再执行查看结果
 ansible app1 --list-host
 ansible web1 --list-host
 ansible web --list-host
 ansible db --list-host

 


 

 

 

动态主机

• 无限可能
– ansible Inventory包含静态和动态的Inventory,静态
Inventory指在文件/etc/ansible/hosts中指定的主机和组,
动态Inventory指通过外部脚本获取主机列表,按照其要求
格式返回给ansilbe命令
• Json
– JSON(JavaScript Object Notation,JavaScript对象表示
法),一种基于文本独立于语言的轻量级数据交换格式

 

[root@ansible ~]# ansible-doc -l

 

 

 

 

command模块

 

 

 

 

 

 

 

 

ansible七种武器

 

ansible七种武器
• 第一种武器
– ansible 命令,用于执行临时性的工作,必须掌握
• 第二种武器
– ansible-doc是ansible模块的文档说明,针对每个模块都有详细的说明及应用案例介绍,功能和Linux系统man命令类似,必须掌握ansible七种武器(续1)
• 第三种武器
– ansible-console是ansible为用户提供的交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用ansible内置的各种命令,这为习惯使用Shell交互方式的用户提供了良好的使用体验
• 第四种武器
– ansible-galaxy从github上下载管理Roles的一款工具,与python的pip类似ansible七种武器(续2

• 第五种武器
– ansible-playbook是日常应用中使用频率最高的命令,工作机制:通过读取先编写好的playbook文件实现批量管理,可以理解为按一定条件组成的ansible任务集,必须掌握
• 第六种武器
– ansible-vault主要用于配置文件加密,如编写的playbook文件中包含敏感信息,不想其他人随意查看,可用它加密/解密这个文件

– ansible-pull
– ansible有两种工作模式pull/push ,默认使用push模式工作,pull和push工作模式机制刚好相反
– 适用场景:有大批量机器需要配置,即便使用高并发线程依旧要花费很多时间
– 通常在配置大批量机器的场景下使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求JSON简介

  • • JSON是什么

– JSON是JavaScript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式
– JSON中的分隔符限于单引号" ' " 、小括号" () " 、中括号" [ ] " 、大括号" { } " 、冒号 " : " 和逗号 " , "
• JSON 特性
– JSON是纯文本
– JSON具有"自我描述性"(人类可读)
– JSON具有层级结构(值中存在值)
– JSON可通过JavaScript进行解析

 

JSON简介(续1)
• JSON 语法规则
– 数据在名称/值对中
– 数据由逗号分隔
– 大括号保存对象
– 中括号保存数组
• JSON 数据的书写格式是:名称/值对
– 名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值,例如:
"诗仙" : "李白"
 

• JSON语法规则之数组
{ "诗人":
["李白", "杜甫", "白居易", "李贺"]
}
• 复合复杂类型
{ "诗人":
[ {"李白":"诗仙", "年代":"唐"},
{"杜甫":"诗圣", "年代":"唐"},
{"白居易":"诗魔", "年代":"唐"},
{"李贺":"诗鬼", "年代":"唐"}
]
}

  • YAML简介

– 是一个可读性高,用来表达数据序列的格式
– YAML(YAML Ain't Markup Language)
– YAML参考了多种语言,如:C语言、Python、Perl等,并从XML、电子邮件的数据格式中获得灵感,Clark Evans在2001年首次发表了这种语言,目前已有数种编程语言或脚本语言支持这种语言

– YAML的结构通过空格来展示
– 数组使用"- "来表示
– 键值对使用": "来表示
– YAML使用一个固定的缩进风格表示数据层级结构关系
– 一般每个缩进级别由两个以上空格组成
– # 表示注释
• 注意:
– 不要使用tab,缩进是初学者容易出错的地方之一
– 同一层级缩进必须对齐

 

YAML的键值表示方法
– 采用冒号分隔
– : 后面必须有一个空格
– YAML键值对例子
"诗仙" : "李白"
或者
"李白":
"诗仙"

 

– 复杂YAML的键值对嵌套
"诗人":
"李白": "诗仙"

"诗人":
"李白":
"诗仙"
数组
["李白", "杜甫", "白居易", "李贺"]

 

 

• YAML 数组表示方法
– 使用一个短横杠加一个空格
– YAML数组例子
- "李白"
- "杜甫"
- "白居易"
- "李贺"
– 哈希数组复合表达式
"诗人":
- "李白"
- "杜甫"
- "白居易"
- "李贺"

 

– 高级复合表达式

"诗人":
-
"李白": "诗仙"
"年代": "唐"
-
"杜甫": "诗圣"
"年代": "唐“
-
"白居易": "诗魔"
"年代": "唐"
-
"李贺": "诗鬼"
"年代": "唐"

 

 

Jinja2模版简介

– Jinja2是基于Python的模板引擎,包含变量和表达式两部分,两者在模板求值时会被替换为值,模板中还有标签,控制模板的逻辑
• 为什么要学习Jinja2模版
– 因为playbook的模板使用Python的Jinja2模块来处理

 

 

• 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

 

– playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期状态
– 也可以说,playbook字面意思即剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情

 

• 为什么要使用playbook
– 执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但有时一个设施过于复杂时,执行ad-hoc命令是不合适的,最好使用playbook
– playbook可以反复使用编写的代码,可以放到不同的机器上面,像函数一样,最大化的利用代码,在使用ansible的过程中,处理的大部分操作都是在编写playbook

 

• playbook语法格式
– playbook由YAML语言编写,遵循YAML标准
– 在同一行中,#之后的内容表示注释
– 同一个列表中的元素应该保持相同的缩进
– playbook由一个或多个play组成
– play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以": "分隔表示
– YAML还有一个小的怪癖,它的文件开始行都应该是 ---,这是YAML格式的一部分,表明一个文件的开始

 

• playbook构成
– hosts: 定义将要执行playbook的远程主机组
– vars: 定义playbook运行时需要使用的变量
– tasks: 定义将要在远程主机上执行的任务列表
– handlers: 定义task执行完成以后需要调用的任务

• playbook执行结果
• 使用ansible-playbook运行playbook文件,输出内容为JSON格式,由不同颜色组成便于识别
– 绿色代表执行成功
– ***代表系统代表系统状态发生改变
– 红色代表执行失败

 

• 第一个playbook

vim  ping.yml

---                                  # 第一行,表示开始
- hosts: all
remote_user: root
tasks:
- ping:


]# ansible-playbook myping.yml -f 5


– -f 并发进程数量,默认是5
– hosts行 内容是一个(多个)组或主机的patterns,以
逗号为分隔符
– remote_user 账户名

 

• tasks
– 命令的集合
– 每一个play包含了一个task列表(任务列表)
– 一个task在其所对应的所有主机上(通过 host pattern匹配的所有主机)执行完毕之后,下一个task才会执行
• hosts
– 主机的集合
– 定义要执行任务的主机

 

• playbook执行命令
– 给web主机添加用户z3,设置默认密码123
– 使用 user 模块

---
- hosts: web
remote_user: root
tasks:
- name: create user z3
user:
name=z3
- shell: echo 123 | passwd --stdin z3

需要使用什么模块就查看用法:   ansible-doc  模块名称  

练习1:playbook练习
1. 安装Apache
2. 修改配置文件的监听端口为8080
3. 设置默认主页 hello world
4. 启动服务
5. 设置开机自启

[root@ansible ~]# vim http.yml

---
- hosts: web
  remote_user: root
  tasks:
    - yum:
        name: httpd
        state: latest
    - lineinfile:
        path: /etc/httpd/conf/httpd.conf
        regexp: '^Listen '
        line: 'Listen 8080'
    - copy:
          src: index
          dest: /var/www/html/index.html
          owner: apache
          group: apache
          mode: 0644
    - service:
        name: httpd
        enabled: yes
        state: started
 

[root@ansible ~]#  echo "hello  work"   >  index.html
[root@ansible ~]# ansible-playbook http.yml

curl http://web1:8080

curl http://web2:8080

 

语法进阶

 

变量

• 添加用户
– 给 db 主机添加用户l4,设置默认密码456

 

---
- hosts: db
remote_user: root
vars:
username: l4
tasks:
- name: create user "{{username}}"
user:
name={{username}}
- shell: echo 456 | passwd --stdin "{{username}}"

 

• 设密码
– 解决密码明文问题
– user模块的password为什么不能设置密码呢
– 经过测试发现,password是把字符串直接写入shadow,并没有改变,而Linux的shadow密码是经过加密的,所以不能使用
• 解决方案
– 变量过滤器password_hash
{{ 'urpassword' | password_hash('sha512')}}

 

15:00视频

 

• 变量过滤器
– 给db主机添加用户plj,设置默认密码123qqq...A
- hosts: db
remote_user: root
vars:
username: plj
tasks:
- name: create user "{{username}}"
user:
password={{'123qqq...A'|password_hash('sha512')}}
name={{username}}

 

 

• 变量参数
– 传递参数

– -e 参数
– 参数格式必须是 json 或 yaml
– yaml 格式 可以使用参数文件,例如

user01.yml

---
- hosts: db
  remote_user: root
  vars:
    username: W5
    pwd: 123
  tasks:
    - user:
        name: "{{username}}"
    - shell: echo "{{pwd}}" | passwd --stdin "{{username}}"


vim  args.yml
---
username: nb

pwd: 123...qqqA
]# ansible-playbook user01.yml  -e @args.yml                                     #yaml格式

]# ansible-playbook user01.yml  -e '{"username":plj,"pwd":"123...qqqA"}'   #JSON 格式

 

 [root@ansible ~]# vim web.yaml 

---
- hosts: web
  remote_user: root
  tasks:
    - copy:
        src: httpd.conf
        dest: /etc/httpd/conf/httpd.conf
        owner: root
        group: root
        mode: 0644
      tags: httpdconf
      notify:
        - restart httpd
    - copy:
        src: index.html
        dest: /var/www/html/index.html
        owner: apache
        group: apache
      tags: index
      notify:
        - restart httpd
  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted
 

[root@ansible ~]# vim index.html 
OOOXXXXXXXXXXX
[root@ansible ~]# ansible-playbook web.yaml

[root@ansible ~]# curl web1:888
OOOXXXXXXXXXXX

 

[root@ansible ~]# vim uptime.yml

---
- name: uptimeCPU
  hosts: web
  remote_user: root
  tasks:
    - shell: uptime | awk '{printf("%.2f",$(NF-2))}'                                                                   #
      register: result
    - service:
        name: httpd
        state: stopped
      when: result.stdout|float > 0.7                                                                                        #1分钟的CPU负载值超过0.7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值