主机规划
主机名称 | 操作系统版本 | 内网IP | 外网IP(模拟) | 安装软件 |
---|---|---|---|---|
ansi-manager | CentOS7.5 | 172.16.1.180 | 10.0.0.180 | ansible |
ansi-haproxy01 | CentOS7.5 | 172.16.1.181 | 10.0.0.181 | |
ansi-haproxy02 | CentOS7.5 | 172.16.1.182 | 10.0.0.182 | |
ansi-web01 | CentOS7.5 | 172.16.1.183 | 10.0.0.183 | |
ansi-web02 | CentOS7.5 | 172.16.1.184 | 10.0.0.184 | |
ansi-web03 | CentOS7.5 | 172.16.1.185 | 10.0.0.185 |
添加用户账号
说明:
1、 运维人员使用的登录账号;
2、 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放;
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
# 使用一个专门的用户,避免直接使用root用户
# 添加用户、指定家目录并指定用户密码
# sudo提权
# 让其它普通用户可以进入该目录查看信息
useradd -u 1050 -d /app yun && echo '123456' | /usr/bin/passwd --stdin yun
echo "yun ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
chmod 755 /app/
Ansible 配置清单Inventory
之后文章都是如下主机配置清单
[yun@ansi-manager ansible_info]$ pwd
/app/ansible_info
[yun@ansi-manager ansible_info]$ cat hosts_key
# 方式1、主机 + 端口 + 密钥
[manageservers]
172.16.1.180:22
[proxyservers]
172.16.1.18[1:2]:22
# 方式2:别名 + 主机 + 端口 + 密码
[webservers]
web01 ansible_ssh_host=172.16.1.183 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.184 ansible_ssh_port=22
web03 ansible_ssh_host=172.16.1.185 ansible_ssh_port=22
Jinja2 模板概述
官网地址
http://docs.jinkan.org/docs/jinja2/
Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全。
Ansible 如何使用 jinja2 模板
Ansible 使用 jinja2 模板,也就是 template 模板。该模块和 copy 模块一样,都是将文件复制到目标机器,但是区别在于 template 模块可以获取要复制文件中的变量的值,而 copy 则是原封不动的把文件内容复制过去。
实际运用,比如:针对不同的主机定义不同的变量,template 会在将文件分发前读取变量到 jinja2 模板,之后再然后分发到不同的被管理主机上。
Jinja2 常用语法
赋值
为变量赋值,优先级高于 playbook 中的优先级。
{% set username = 'zhang' %}
{% set navigation = [('index.html', 'Index'), ('about.html', 'About')] %}
注释
{# ... #}:要把模板中一行或多行注释掉,默认的注释语法。
变量
{
{ ... }}:把表达式的结果打印到模板上。
你可以使用点( . )来访问变量的属性,作为替代,也可以使用所谓的“下标”语 法( [] )。如下示例:
{
{ foo.bar }}
{
{ foo['bar'] }}
示例:{
{ a_variable }}、{
{ foo.bar }}、{
{ foo['bar'] }}
花括号不是变量的一部分,而是打印语句的重要一部分。
条件判断
Jinja 中的 if 语句可比 Python 中的 if 语句。
在最简单的形式中,你可以测试一个变量是否未定义,为空或 false:
简单形式:
{% if 条件表达式 %}
……
{% endif %}
多分支形式:
{% if 条件表达式 %}
……
{% elif 条件表达式 %}
……
{% else %}
……
{% endif %}
循环语句
for 循环语句
{% for user in users %}
{
{ user.username }}
{% endfor %}
空白控制
默认配置中,模板引擎不会对空白做进一步修改,所以每个空白(空格、制表符、换行符 等等)都会原封不动返回。
此外,你也可以手动剥离模板中的空白。当你在块(比如一个 for 标签、一段注释或变量表达式)的开始或结束放置一个减号( - ),可以移除块前或块后的空白。如下:
{% for item in range(1,9) -%}
{
{ item }}
{%- endfor %}
输出的所有元素前后不会有任何空白,输出会是 123456789 。
转义
有时想要或甚至必要让 Jinja 忽略部分,而不会把它作为变量或块来处理。那么有如下两种方式:
单行转义:简单方式
需求:把 “{ {” 作为原始字符串使用,而不是一个变量的开始部分。
{
{ '{
{' }}
多行转义:
需求:将如下一块代码不进行任何处理,直接打印输出。
{% raw %}
<ul>
{% for item in seq %}
<li>{
{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
HTML 手动转义
如果你有一个可能包含 >、<、& 或 " 字符的变量,那么你需要转义它;否则会被 HTML 使用。
转义通过用管道传递到过滤器 |e 来实现,如:
{
{ user.username|e }} 。
宏定义
宏类似常规编程语言中的函数。它们用于把常用行为作为可重用的函数,取代手动重复的工作。
如果宏在不同的模板中定义,你需要首先使用 import 。
示例:
## 宏变量顺序和具体内容变量顺序一致「推荐写法」
{% macro input(name, value='', type=