ansible七种武器
第一种武器
Ansible命令,用于执行临时性的工作,也是我们之前主要学习的功能,必须掌握
第二种武器
Ansible-doc是Ansible模块文档说明,针对每个模块都有详细的用法说明及应用安案例介绍,功能和Linux系统man命令类似,必须掌握
第三种武器
Ansible-console是Ansible为用户提供的款交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令,这为习惯于使用Shell交互方式的用户提供良好的使用体验。
第四种武器
Ansible-galaxy 从github上下载管理Roles的一款工具,与python的pip类似。
第五种武器
Ansible-playbook是日常应用中使用频率最高的命令,其工作机制是:通过读取预先编写好的playbook文件实现批量管理。要实现的功能与命令 ansible 一样,
可以理解为按一定条件组成的 ansible 任务集,必须
掌握
第六种武器
– ansible-vault 主要用于配置文件加密,如编写的
Playbook 配置文件中包含敏感信息,不希望其他人随
意查看, ansible-vault 可加密/解密这个配置文件
Json简介
Json是Javascript对象表示法,它是一种基于文本独立于语言的轻量级数据交换格式
Json语法
数据在名称/值对
数据由逗号分隔
大括号保存对象
中括号保存数组
第七种武器
– ansible-pull
– Ansible 有两种工作模式 pull/push ,默认使用 push
模式工作,pull 模式和通常使用的 push 模式工作机
理刚好相反
– 适用场景:有数量巨大的机器需要配置,即使使用高
并发线程依旧要花费很多时间;
– 通常在配置大批量机器的场景下会使用,灵活性稍有
欠缺,但效率几乎可以无限提升,对运维人员的技术
水平和前瞻性规划有较高要求。
Json数据的书写格式是:名称/值对
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值
Json语法规则之数组
{
“key”:
[“value”,”value”,”value”]
}
复合复杂类型
{
“key”:
[{“test”:”testvalue”,”test1”:”test1value”},
{},
{},
{}]
}
yaml简介
• yaml 是什么
– 是一个可读性高,用来表达数据序列的格式。
– YAML:YAML Ain't Markup Language
– YAML参考了其他多种语言,包括:C语言、Python、
Perl,并从XML、电子邮件的数据格式(RFC 2822)
中获得灵感。Clark Evans在2001年首次发表了这种语
言[1],另外Ingy döt Net与Oren Ben-Kiki也是这语
言的共同设计者[2]。目前已经有数种编程语言或脚本
语言支持(或者说解析)这种语言。
yaml简介
• yaml 基础语法
– YAML的结构通过空格来展示
– 数组使用"- "来表示
– 键值对使用": "来表示
– YAML使用一个固定的缩进风格表示数据层级结构关系
– 一般每个缩进级别由两个以上空格组成
– # 表示注释
• 注意:
– 不要使用tab,缩进是初学者容易出错的地方之一
– 同一层级缩进必须对齐
yaml简介
• yaml高级语法
– | 与 > 表示对应的值为多行字符, > 与 | 的区别是会
把 \n 转换为空格
– ! 可以设置类型,!! 可以强制类型转换
– 为了维持文件的简洁,并避免数据输入的错误,YAML
提供了结点参考(*)和散列合并(<<)参考到其他
结点标签的锚点标记(&)。参考会将树状结构加入锚
点标记的内容,并可以在所有数据结构中运作,合并
只有散列表可以使用,可以将键值自锚点标记复制到
指定的散列表中
jinja2模版简介
• jinja2 是什么
– Jinja2是基于python的模板引擎,包含 变量 和 表达
式两部分,这两者在模板求值的时候会被替换为值。
模板中还有标签,控制模板的逻辑。
• 为什么要学习 jinja2 模版
– 要使用 ansible 就要深入学习 playbook 配置及模板。
playbook 的模板使用 python 的 jinja2 模块来处理的jinja2模版简介
• jinja2 模版基本语法
– 模板的表达式都是包含在分隔符 "{{
}}" 内的;
– 控制语句都是包含在分隔符 "{% %}" 内的;
– 另外,模板也支持注释,都是包含在分隔符 "{# #}"
内,支持块注释。
– 调用变量
{{varname}}
– 计算
{{2+3}}
– 判断
{{1 in [1,2,3]}}
jinja2模版简介
• jinja2 过滤器
– 变量可以通过 过滤器 修改。过滤器与变量用管道符号
( | )分割,并且也 可以用圆括号传递可选参数。多
个过滤器可以链式调用,前一个过滤器的输出会被作
为 后一个过滤器的输入。
– 例如:
– 把一个列表用逗号连接起来: {{ list|join(', ') }}
– 过滤器这里不一一列举,需要的可以查询在线文档
http://docs.jinkan.org/docs/jinja2/templates.html
#builtin-filters
Playbook是什么
Playbook是ansible用于配置,部署,和管理托管主机剧本,通过playbook的详细
描述,执行其中的一系列的tasks,可以让远端主机达到预期的状态。
playbook语法基础
• playbook 语法格式
– playbook由 YAML 语言编写,遵循 YAML 标准
– 在同一行中,#之后的内容表示注释
– 同一个列表中的元素应该保持相同的缩进
– playbook 由一个或多个 play 组成
– play 中 hosts,variables,roles,tasks 等对象的表示
方法都是键值中间以 ": " 分隔表示
– YAML 还有一个小的怪癖. 所有的 YAML 文件开始行都
应该是 ---. 这是 YAML 格式的一部分, 表明一个文件的
开始
playbook 语法格式
– playbook由 YAML 语言编写,遵循 YAML 标准
– 在同一行中,#之后的内容表示注释
– 同一个列表中的元素应该保持相同的缩进
– playbook 由一个或多个 play 组成
– play 中 hosts,variables,roles,tasks 等对象的表示
方法都是键值中间以 ": " 分隔表示
– YAML 还有一个小的怪癖. 所有的 YAML 文件开始行都
应该是 ---. 这是 YAML 格式的一部分, 表明一个文件的
开始
playbook语法基础
• playbook 构成
– Target: 定义将要执行 playbook 的远程主机组
– Variable: 定义 playbook 运行时需要使用的变量
– Tasks: 定义将要在远程主机上执行的任务列表
– Handler: 定义 task 执行完成以后需要调用的任务playbook语法基础
• Playbook执行结果
• 使用 ansible-playbook 运行playbook文件,得到输
出内容为 JSON 格式。并且由不同颜色组成,便于识
别。一般而言
• 绿色代表执行成功
• ***代表系统代表系统状态发生改变
• 红色代表执行失败
playbook语法基础
• 第一个playbook
---
- hosts: all
remote_user: root
tasks:
- ping:
# 第一行,表示开始
ansible-playbook myping.yml -f 5
– -f 并发进程数量,默认是 5
– hosts 行的内容是一个或多个组或主机的 patterns,以
逗号为分隔符
– remote_user 就是账户名
[root@ansible ~]# cat ping.yml
---
- hosts: all
remote_user: root
tasks:
- ping:
[root@ansible ~]# ansible-playbook ping.yml
续 ... ...
– tasks
– 每一个 play 包含了一个 task 列表(任务列表).
– 一个 task 在其所对应的所有主机上(通过 host
pattern 匹配的所有主机)执行完毕之后,下一个 task
才会执行.
– 有一点需要明白的是(很重要),在一个 play 之中,
所有 hosts 会获取相同的任务指令,这是 play 的一个
目的所在,也就是将一组选出的 hosts 映射到 task,执
行相同的操作
[root@ansible ~]# cat /etc/ansible/hosts
# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character
# - Blank lines are ignored
# - Groups of hosts are delimited by [header] elements
# - You can enter hostnames or ip addresses
# - A hostname/ip can be a member of multiple groups
# Ex 1: Ungrouped hosts, specify before any group headers.
## green.example.com
## blue.example.com
## 192.168.100.1
## 192.168.100.10
# Ex 2: A collection of hosts belonging to the 'webservers' group
## [webservers]
## alpha.example.org
## beta.example.org
## 192.168.1.100
## 192.168.1.110
# If you have multiple hosts following a pattern you can specify
# them like this:
## www[001:006].example.com
# Ex 3: A collection of database servers in the 'dbservers' group
## [dbservers]
##
## db01.intranet.mydomain.net
## db02.intranet.mydomain.net
## 10.25.1.56
## 10.25.1.57
# Here's another example of host ranges, this time there are no
# leading 0s:
## db-[99:101]-node.example.com
[web]
web1
web2
[web:vars]
ansible_ssh_user="root"
ansible_ssh_pass="123456"
[db]
db1
db2
[other]
192.168.6.33 ansible_ssh_user="root" ansible_ssh_pass="123456"
[app:children]
web
db
[root@ansible ~]# cat user01.yml
---
- hosts: web
remote_user: root
tasks:
- user: name=plj group=wheel uid=2000
- shell: echo 123456 | passwd --stdin plj
- name: ooxx
shell: chage -d 0 plj
[root@ansible ~]# ansible-playbook user01.yml
[root@ansible ~]# ansible-doc user
# Add the user 'johnd' with a specific uid and a primary group of 'admin'
- user:
name: johnd
comment: "John Doe"
uid: 1040
group: admin
Playbook练习
编写playbook实现以下效果
安装apache yum
修改apache监听的端口为8080 lineinfile
为apache增加NameServer配置
设置默认主页hello world copy
启动服务
设置开机自启动 service
- name: install the latest version of Apache
yum:
name: httpd
state: latest
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen '
insertafter: '^#Listen '
line: 'Listen 8080'
- copy:
src: /mine/ntp.conf
dest: /etc/ntp.conf
owner: root
group: root
mode: 0644
backup: yes
- service:
name: httpd
enabled: yes
[root@ansible ~]# curl http://web1:8080
hello
[root@ansible ~]#
[root@ansible ~]# cat apache.yml
---
- hosts: web
remote_user: root
tasks:
- yum:
name: httpd
state: installed
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^Listen'
insertafter: '^#Listen'
line: 'Listen 8080'
- lineinfile:
path: /etc/httpd/conf/httpd.conf
regexp: '^ServerName'
line: 'ServerName localhost'
- copy:
src: /root/index.html
dest: /var/www/html/index.html
owner: apache
group: apache
mode: 0644
- service:
name: httpd
state: started
enabled: yes
[root@ansible ~]# ls
anaconda-ks.cfg apache.retry apache.yml ifcfg-eth0 index.html ping.yml RPM-GPG-KEY-CentOS-7 user01.retry user01.yml