写点什么

Ansible:实战笔记

  • 2022 年 3 月 24 日
  • 本文字数:13175 字

    阅读完需:约 43 分钟

Ansible:实战笔记

作者 | NChunHisenG.🐰


Anisble GitHUb:传送门

Ansible 官方文档:传送门

阿里云 Ansible 官方文档:传送门

什么是 Ansible?

Ansible 的作者是 Michael DeHaan( Cobbler 与 Func 作者)

Ansible 是一个开源的基于 OpenSSH 的自动化配置管理工具。它可以进行配置管理、应用程序部署、云配置、临时任务执行,网络自动化和多节点编排。Ansible 可以轻松完成复杂的变更操作,例如负载均衡零停机滚动更新。Ansible 的主要目标是简单和易用,并且它还高度关注安全性和可靠性。

Ansible 能做什么?

  • 配置管理 Configuration

  • 部署发布 Deployment

  • 命令行批量执行 Ad-Host Task

  • 多层次任务编排 Multi-Ter Orchestration


  • Ansible 适用于开发人员、系统管理员,以及介于两者之间的所有人。

  • Ansible 适合管理几乎所有的环境,从拥有少数实例的小型环境到有数千个实例的企业环境。

Ansible 特点

使用 Ansible 无须在被管理的客户端上安装代理。它通过标准 SSH 进行通信,以便从远程客户端检索信息、执行命令和复制文件。这是 Ansible 简化客户端管理的一种方式。任何 Ansible 可达的 SSH 端口的客户端都可以进行配置和管理。

Ansible 采用模块化的设计,所以非常容易扩展到各种特定的使用场景。模块可以用任何语言编写,并使用标准 JSON 进行通信。除了通过命令行工具(Ad-Hoc), Ansible 还可以通过配置剧本(Playbooks)与客户端进行交互。

Ansible 架构


  • Ansible:Ansible 核心程序。

  • Inventory:记录由 Ansible 管理的主机信息,包括 IP、端口、密码、变量等。

  • Ad-Hoc:使用单个模块的临时命令,支持批量主机执行单条命令。

  • Playbooks:YAML 格式文件,将多个任务定义在剧本中。由 Ansible 执行

  • CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。

  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。

  • Plugins:支持使用插件的方式对 Ansible 本身的功能进行扩展,模块是用来实现任务的,增强 Ansible 自己的功能就需要使用插件(如:logging 插件记录日志,email 插件发送邮件)

  • ConnectionPlugins:Ansible 基于连接插件连接到各个主机上,虽然默认情况下 Ansible 使用 SSH 连接到各个主机上,但它还支持其它的连接方法。

Ansible 执行流程

  1. 加载 Ansible Config,读取配置

  2. 读取 Anisble Inventory,找到需要执行任务的主机或组

  3. 加载任务需要的模块,如 command、file、copy 等

  4. 通过 Ansible 将模块或命令生成对应的临时 python 文件。将该文件传输至远程服务器,文件存放于对应执行用户的 ~/.ansible/tmp/xxx/xxx.py

  5. 授予 python 文件执行权限

  6. 执行并返回结果

  7. 删除临时 python 文件,退出


安装 Ansible

安装 Ansible 社区版本有两种可选的方式

  1. 通过 Linux Package 管理工具安装最新版本的 Ansible

  2. 通过 Python pip package 管理工具安装


Installing the Ansible community package

The ansible package includes the Ansible language and runtime plus a range of community curated Collections. It recreates and expands on the functionality that was included in Ansible 2.9.


You can choose any of the following ways to install the Ansible community package:


  • Install the latest release with your OS package manager (for Red Hat Enterprise Linux (TM), CentOS, Fedora, Debian, or Ubuntu).

  • Install with pip (the Python package manager).


/etc/ansible                # Ansible 主目录/etc/ansible/ansible.cfg    # Ansible 主配置文件/etc/ansible/hosts          # Ansible 主机清单/etc/ansible/roles          # Ansible 角色目录/usr/bin/ansible            # Ansible 主程序目录/usr/bin/ansible-connection # Ansible 连接工具/usr/bin/ansible-console    # Ansible 控制台/usr/bin/ansible-doc        # Ansible 文档工具/usr/bin/ansible-galaxy     # Ansible Galaxy/usr/bin/ansible-inventory  # Ansible 资产工具/usr/bin/ansible-playbook   # Ansible Playbook剧本工具/usr/bin/ansible-pull       # Ansible Pull是指在客户端组件基于Ansible Pull的方式从服务器上拉取文件~/.ansible/plugins/modules:/usr/share/ansible/plugins # 默认模块路径
复制代码

通过 Linux Package 管理工具安装

RHEL、CentOS 或 Fedora

sudo yum install -y epel-release # CentOS8: sudo dnf install -y epel-releasesudo yum install -y ansible # CentOS8: sudo dnf install -y ansible
复制代码

通过 Python pip package 管理工具安装

curl https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.pysudo python /tmp/get-pip.pysudo python -m pip install ansible
复制代码



Ansible Config


Ansible 官方文档 - Ansible Config 配置详情:传送门


安装 Ansible 完成后必须配置两样东西一个是 Ansible Config(ansible.cfg) ,另一个就是 Ansible Inventory(hosts)。Ansible Config 是 Ansible 的核心配置文件,一般情况下大部分配置不需要更改。


Ansible supports several sources for configuring its behavior, including an ini file named ansible.cfg, environment variables, command-line options, playbook keywords, and variables. See Controlling how Ansible behaves: precedence rules for details on the relative precedence of each source.

The ansible-config utility allows users to see all the configuration settings available, their defaults, how to set them and where their current value comes from. See ansible-config for more information.

Ansible Config 优先级

  1. ANSIBLE_CONFIG (设置环境变量的指定路径)

  2. ansible.cfg (当前目录下的配置文件)

  3. ~/.ansible.cfg (当前用户家目录下的配置文件)

  4. /etc/ansible/ansible.cfg

Ansible Config 配置详解

[default]inventory=/etc/ansible/hosts    # 被控端主机清单文件library=/usr/share/my_modules/  # 指定 Ansible 搜索模块位置,如果需要自定义 Ansible 模块,需要放到 library 所指定的目录下remote_tmp=~/.ansible/tmp       # 远程主机临时文件存放目录local_tmp=~/.ansible/tmp        # 本地主机临时文件存放目录       forks=5                         # Ansible在执行工作时进程数量poll_interval=15                # 默认轮询间隔时间,单位:秒sudo_user=root                  # 客户端默认执行 sudo 命令所切换的用户ask_sudo_pass=True              # 每次执行 sudo 命令时是否询问 sudo 到目标用户的密码ask_pass=True                   # 每次执行 Ansible 命令是否询问 SSH 密码transport=smart                 # 通信机制remote_port=22                  # 连接远程客户端 SSH 端口的默认端口号module_lang=C                   # 模块和系统之间通信的语言,默认为C语言gathering=implicit              # 控制默认 facts 收集,远程系统变量roles_path=/etc/ansible/roles   # 角色存储路径host_key_checking=False         # 是否检查远程主机密钥sudo_exe=sudo                   # sudo 远程执行命令sudo_flags=-H -S -n             # 传递 sudo 之外的参数timeout=10                      # SSH 超时时间remote_user=root                # 指定默认的远程连接用户log_path=/var/log/ansible.log   # Ansible 日志文件,执行 Ansible 的用户需要对日志文件具有写入权限module_name=command             # Ansible 默认执行的模块executable=/bin/sh              # 执行的 Shell 环境,用户 Shell 模块hash_behaviour=replace          # 如果变量重叠,优先级更高的一个是替换优先级低得还是合并在一起,默认为替换private_role_vars=yes           # 默认情况下,角色中的变量将在全局变量范围中可见。 为了防止这种情况,可以启用以下选项,只有 tasks 的任务和 handlers 得任务可以看到角色变量private_key_file=/path/to/file  # 私钥文件存储位置command_warnings=False          # command 模块 Ansible 默认发出警告nocolor=1                       # Ansible 输出不带上颜色区别,0表示开启,1表示关闭pipelining=False                # 开启 pipe ssh 通道优化
[inventory]
[privilege_escalation]# 出于安全角度考虑,部分公司不希望直接以root的高级管理员权限直接部署应用,往往会开放普通用户权限并给予sudo的权限,该部分配置主要针对sudo用户提权的配置become=True # 是否 sudobecome_method=sudo # sudo 方式become_user=root # sudo 后的用户become_ask_pass=False # sudo 时是否需要验证密码
[paramiko_connection]pty=False # 是否禁用 sudo 功能
[ssh_connection]# Ansible默认使用SSH协议连接对端主机,该部署是主要是SSH连接的一些配置,但配置项较少,多数默认即可ssh_args=-C -o ControlMaster=auto -o ControlPersist=60s # SSH 连接时的参数pipelining=False # SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,之所以默认关闭是为了兼容不同的 sudo 配置,主要是 requiretty 选项。如果不使用 sudo,建议开启。打开此选项可以减少 Ansible 执行没有传输时 ssh 在客户端上执行任务的连接数。不过,如果使用 sudo,必须关闭 requiretty 选项scp_if_ssh=smart # 该项为 True 时,如果连接类型是 SSH,使 Ansible 使用 scp,为 False,Ansible 使用 sftp 。默认为 smart ,smart 为先尝试 sftp,然后尝试 scp
[persistent_connection] # 保持连接connect_timeout=30 # Ansible 如果在30秒内没有收到请求,则关闭连接,默认为30秒command_timeout=30 # Ansible 执行命令如果在30秒内没有收到回应则认为命令超时
[accelerate] # 缓存加速accelerate_port=5099 # 加速连接 509 端口accelerate_timeout = 30 # 命令执行超时时间ccelerate_connect_timeout = 5.0 # 连接超时时间,单位为秒accelerate_daemon_timeout = 30 # 上一个活动连接的时间,单位为分钟accelerate_multi_key = yes # 允许多个私钥被加载到 daemon
[selinux]special_context_filesystems=nfs,vboxsf,fuse,ramfs,9p # 文件系统在处理安全上下文时需要特殊处理,定义复制现有上下文的文件系统libvirt_lxc_noseclabel = yes # 将此设置为 yes,以允许libvirt_lxc连接在没有SELinux的情况下工作
[colors]# Ansible对于输出结果的颜色也进行了详尽的定义且可配置,该选项对日常功能应用影响不大,几乎不用修改,保持默认即可。highlight = whiteverbose = bluewarn = bright purpleerror = reddebug = dark graydeprecate = purpleskip = cyanunreachable = redok = greenchanged = yellowdiff_add = greendiff_remove = reddiff_lines = cyan
[diff]always = nocontext = 3
复制代码



Ansible Inventory

安装 Ansible 完成后必须配置两样东西一个是 Ansible Config(ansible.cfg) ,另一个就是 Ansible Inventory(hosts)。Ansible Inventory 是一个由主机(IP/域名)或一组主机(多台主机组成的组)组成的主机清单。Ansible Inventory 不仅仅是一个主机清单,还可以通过对特定主机或特定的组赋值变量,供后续 Ansible 操作时使用。你可以在同一时间使用多个 Ansible Inventory,在命令行中使用 -i 参数可以指定特定的 Inventory 文件 。Ansible Inventory 里面分为 Static Inventory (静态,读取文件获取清单) 和 Dynamic Inventory (动态,调用 API 获取清单)。


Ansible works against multiple managed nodes or “hosts” in your infrastructure at the same time, using a list or group of lists known as inventory. Once your inventory is defined, you use patterns to select the hosts or groups you want Ansible to run against.


The default location for inventory is a file called /etc/ansible/hosts. You can specify a different inventory file at the command line using the -i <path> option. You can also use multiple inventory files at the same time, and/or pull inventory from dynamic or cloud sources or different formats (YAML, ini, and so on), as described in Working with dynamic inventory. Introduced in version 2.4, Ansible has Inventory Plugins to make this flexible and customizable.

Static Inventory


Ansible 官方文档 - 更多例子:传送门


这是一个默认的 Ansible Inventory 文件,默认存放在 /etc/ansible/hosts。

  • '#' 为注释符号

  • 空白行会被忽略

  • 组由 '[Group Name]' 分隔

  • 可以使用域名或 IP 定义主机

  • 一个 IP 或域名可以同时属于多个组

# 例子 1: 不分组的主机,需要在所有的[Group Name]前指定
## green.example.com## blue.example.com## 192.168.100.1## 192.168.100.10
# 例子 2: 一个属于 webservers 组的主机集合
## [webservers]## alpha.example.org## beta.example.org## 192.168.1.100## 192.168.1.110
# 如果你有多个主机遵循一种规范,则可以这样指定
## www[001:006].example.com
# 例子 3: 一个属于 dbservers 组的主机集合
## [dbservers]#### db01.intranet.mydomain.net## db02.intranet.mydomain.net## 10.25.1.56## 10.25.1.57
# 这是另一个主机范围的例子,这次范围中没有前导0
## db-[99:101]-node.example.com
# 例子 4:一个属于 nginx 组的主机集合,使用别名并指定用户和密码登陆[nginx]nginx_node1 ansible_ssh_host=172.26.3.57 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456nginx_node2 ansible_ssh_host=172.26.3.58 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=123456
# 例子 5:一个属于 redis 组的主机集合,使用组变量指定用户和密码登陆[redis]172.26.3.84172.26.3.85
[redis:vars]ansible_ssh_port=22ansible_ssh_user=rootansible_ssh_pass=123456
# 例子 6:一个属于 mysql 组的主机集合,使用 all 组变量指定用户和密码登陆[all:vars]ansible_ssh_port=22ansible_ssh_user=rootansible_ssh_pass=123456
复制代码

Dynameic Inventory


如果 Ansible Inventory 是会随着时间推移而更改,跟进业务需求而改变的。(如弹性伸缩、新增或移除大量主机等)那么 Static Inventory 就没办法满足我们的需求。Dynameic Inventory 支持从云提供程序、LDAP、Cobbler 和企业级 CMDB 系统获取 Inventory。实现的方式有两种,一种是 Ansible 插件,另一种是通过脚本实现。一般情况下推荐使用 Ansible 插件作 Dynameic Inventory 的获取方式,脚本作为确保向后兼容,或特殊需求实现方式使用。


If your Ansible inventory fluctuates over time, with hosts spinning up and shutting down in response to business demands, the static inventory solutions described in How to build your inventory will not serve your needs. You may need to track hosts from multiple sources: cloud providers, LDAP, Cobbler, and/or enterprise CMDB systems.

Ansible integrates all of these options through a dynamic external inventory system. Ansible supports two ways to connect with external inventory: Inventory Plugins and inventory scripts.

Inventory plugins take advantage of the most recent updates to the Ansible core code. We recommend plugins over scripts for dynamic inventory. You can write your own plugin to connect to additional dynamic inventory sources.

You can still use inventory scripts if you choose. When we implemented inventory plugins, we ensured backwards compatibility through the script inventory plugin. The examples below illustrate how to use inventory scripts.

If you prefer a GUI for handling dynamic inventory, the Red Hat Ansible Tower inventory database syncs with all your dynamic inventory sources, provides web and REST access to the results, and offers a graphical inventory editor. With a database record of all of your hosts, you can correlate past event history and see which hosts have had failures on their last playbook runs.


AWS



阿里云


阿里云官方文档 - 使用动态 Inventory:传送门


由于目前阿里云的动态 Inventory 处在被官方集成的过程中,因此在使用之前,需要安装 Inventory 依赖的组件 ansible_alicloud_module_utils。该组件用于 Inventory 对 OpenAPI 请求的调用:

# 安装 Python 3sudo yum install -y python3
# 安装 ansible_alicloud_module_utils 组件sudo pip3 install ansible_alicloud_module_utils
# 查看 footmark 版本sudo pip3 show footmark
# 如果 footmark 版本低于1.9.0,执行以下命令升级 footmark 版本。sudo pip3 install footmark --upgrade
复制代码


您可以通过阿里云动态 Inventory 动态获取指定过滤条件的主机信息。和其他 Inventory 一样,阿里云的动态 Inventory 也有两种使用方式:

显示指定:在执行 Ansible 命令时以 -i 参数显示地指定使用阿里云动态 Inventory 文件。

默认指定:就是将阿里云动态 Inventory 配置为默认 Inventory 文件


阿里云的动态 Inventory 文件会将每次执行结果进行缓存,以避免重复的 API 调用。这个缓存的设置可通过编辑 alicloud.ini 文件中的 cache_path 进行配置。如果想要显式地清空缓存,可以在执行 Inventory 时加上 --refresh-cache

显示指定

完成以下操作,指定配置阿里云动态 Inventory:

# 下载最新版本的阿里云动态 Inventory 文件sudo wget -O /etc/ansible/alicloud.py https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.py
# 赋予阿里云动态 Inventory 文件可执行权限sudo chmod +x /etc/ansible/alicloud.py
# 下载与阿里云动态 Inventory 配套的 alicloud.ini 配置文件sudo wget -O /etc/ansible/alicloud.ini https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini
复制代码


# 配置访问密钥sudo vi /etc/ansible/alicloud.ini
复制代码


alicloud_access_key = Abcd1234alicloud_secret_key = Abcd2345
复制代码


# 执行 Inventory 文件验证配置。sudo python3 /etc/ansible/alicloud.py --list
复制代码


默认指定

完成以下操作,将阿里云动态 Inventory 配置为默认 Inventory:

# 下载最新版本的阿里云动态 Inventory 文件sudo wget https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.py
# 赋予阿里云动态 Inventory 文件可执行权限sudo chmod +x alicloud.py
# 将阿里云动态 Inventory 文件替换为默认 Inventory 文件sudo cp alicloud.py /etc/ansible/hosts
# 下载与阿里云动态 Inventory 配套的 alicloud.ini 配置文件sudo wget -O /etc/ansible/alicloud.ini https://raw.githubusercontent.com/alibaba/ansible-provider/master/contrib/inventory/alicloud.ini
复制代码


# 配置访问密钥sudo vi /etc/ansible/alicloud.ini
复制代码


alicloud_access_key = Abcd1234alicloud_secret_key = Abcd2345
复制代码


# 执行 Inventory 文件验证配置。sudo python3 /etc/ansible/alicloud.py --list
复制代码


Ansible Ad-Hoc


Anisble 官方文档 - Ad-Hoc:传送门


从功能上讲,Ad-Hoc 是相对于 Ansible-Playbook 而言的,Ansible 提供两种完成任务方式:一种是 Ad-Hoc 命令集,也就是 ansible 命令,另一种是 Ansible-Playbook,即命令 ansible-playbook。Ad-Hoc,简而言之就是临时命令,英文中作为形容词有特别的,临时的含义。Ad-Hoc 只是官方对 Ansible 命令的一种称谓。


Introduction to ad-hoc commands

An Ansible ad-hoc command uses the /usr/bin/ansible command-line tool to automate a single task on one or more managed nodes. Ad-hoc commands are quick and easy, but they are not reusable. So why learn about ad-hoc commands first? Ad-hoc commands demonstrate the simplicity and power of Ansible. The concepts you learn here will port over directly to the playbook language. Before reading and executing these examples, please read How to build your inventory.

Ansible 命令详解

ansible --helpUsage: ansible <host-pattern> [options]
选项: -a MODULE_ARGS, --args=MODULE_ARGS # 指定模块的参数 --ask-vault-pass # 询问账号的密码 -B SECONDS, --background=SECONDS # 异步运行,在指定秒后异步运行失败 -C, --check # 不做出任何改变,只是进行测试检查 -D, --diff # 当更改(小)文件和模板时,显示这些文件中的差异 -e EXTRA_VARS, --extra-vars=EXTRA_VARS # 将其他变量设置为 key=value 或 YAML/JSON,如果是文件前面加@ -f FORKS, --forks=FORKS # 指定要使用的并行进程数,例如100台机器,-f指定每次运行几台,默认每次运行5台 -i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY # 指定主机清单路径 -l SUBSET, --limit=SUBSET # 将选定的主机限制为附加模式。 --list-hosts # 列出清单中的主机列表,不进行任何操作 -m MODULE_NAME, --module-name=MODULE_NAME # 指定要执行的模块名称,默认为 command 模块 -M MODULE_PATH, --module-path=MODULE_PATH # 指定要执行模块的路径 -o, --one-line # 压缩输出 --playbook-dir=BASEDIR # 指定 Playbook 文件目录 -P POLL_INTERVAL, --poll=POLL_INTERVAL # 指定轮询间隔时间,默认为15 --syntax-check # 如果使用了 Playbook 则执行 --syntax-check 对剧本进行语法检查 -t TREE, --tree=TREE # 将 Ansible 标准输出记录到指定目录 --vault-id=VAULT_IDS the vault identity to use --vault-password-file=VAULT_PASSWORD_FILES vault password file -v, --verbose # 详细模式(-vvv更多,-vvvv可启用连接调试) --version # 显示 Ansible 的版本号、配置文件位置、配置模块搜索路径、模块位置、可执行文件位置
特权提升选项: -b, --become # 是否提权为 --become-user 设置的用户,使用 --become-method 指定的提权方法 --become-method=BECOME_METHOD # 使用权限提升方法(默认值=sudo) --become-user=BECOME_USER # 以该用户的身份运行操作(默认值=root) -K, --ask-become-pass # 提权是否询问密码
连接选项: -k, --ask-pass # 连接是否询问密码 --private-key=PRIVATE_KEY_FILE, --key-file=PRIVATE_KEY_FILE # 指定私钥文件进行登录认证 -u REMOTE_USER, --user=REMOTE_USER # 指定连接用户,默认不指定则为hosts文件中用户 -c CONNECTION, --connection=CONNECTION # 连接方式,默认为 smart,还有 ssh 和 sftp -T TIMEOUT, --timeout=TIMEOUT # Ansible 连接超时时间,默认为10s --ssh-common-args=SSH_COMMON_ARGS # 指定要传递到 SFTP/SCP/SSH 的常见参数(例如ProxyCommand) --sftp-extra-args=SFTP_EXTRA_ARGS # 指定要传递到 SFTP 的额外参数(例如-f、-l) --scp-extra-args=SCP_EXTRA_ARGS # 指定要传递到 SCP 的额外参数(例如-1) --ssh-extra-args=SSH_EXTRA_ARGS # 指定只传递给 SSH 的额外参数(例如-R)
复制代码



Ansible Playbook

Ansible 提供两种完成任务方式:一种是 Ad-Hoc 命令集,也就是 ansible 命令,另一种是 Ansible-Playbook,即命令 ansible-playbook。前者更注重于解决一些简单的或者平时工作中临时遇到的任务,相当于 Linux 系统命令行下的 Shell 命令,后者更适合与解决复杂或是需要记录下来的任务,相当于 Linux 系统的 Shell Scripts。


Ansible Roles


实战笔记

· SSH 公钥推送

  1. 配置 Ansible 忽略主机密钥检查

sudo vi /etc/ansible/ansible.cfg
复制代码


# 将此选项设置成 False# uncomment this to disable SSH key host checking# host_key_checking = False
复制代码


  1. 生成 SSH 公钥、私钥

ssh-keygen -t rsa -b 2048
复制代码


默认密钥存放路径

~/.ssh/id_rsa (私钥)

~/.ssh/id_rsa.pub (公钥)


Generating public/private rsa key pair.Enter file in which to save the key (/root/.ssh/id_rsa):Created directory '/root/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:Your identification has been saved in /root/.ssh/id_rsa.Your public key has been saved in /root/.ssh/id_rsa.pub.The key fingerprint is:SHA256:Toju/qJscs8LoMY6SZ0jxH2M8YaQTHcwS2bg/7UJ7w4 root@localhost.localdomainThe key's randomart image is:+---[RSA 2048]----+|oooB..           ||.+=.+            ||..o.*            || o.+ * .         ||o ..=...S        ||o+ =. +oo        ||o+o oE +.        ||*.o+. o          ||.=o+*+oo         |+----[SHA256]-----+
复制代码


  1. 使用 Ansible 推送控制端公钥到被控端

sudo vi push_ssh_public_key.yml
复制代码


---- hosts: all  gather_facts: no
tasks: - name: Push Ansible Server Public Key authorized_key: user: root state: present key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
复制代码


ansible-playbook push_ssh_public_key.yml
复制代码



PLAY [all] ***********************************************************************************************************
TASK [push ansible server public key] ********************************************************************************changed: [192.168.49.12]changed: [192.168.49.13]changed: [192.168.49.11]
PLAY RECAP ***********************************************************************************************************192.168.49.11 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0192.168.49.12 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0192.168.49.13 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复制代码


  1. 验证被控端可达性

ansible all -m ping
复制代码


192.168.49.12 | SUCCESS => {    "ansible_facts": {        "discovered_interpreter_python": "/usr/bin/python"    },    "changed": false,    "ping": "pong"}192.168.49.13 | SUCCESS => {    "ansible_facts": {        "discovered_interpreter_python": "/usr/bin/python"    },    "changed": false,    "ping": "pong"}192.168.49.11 | SUCCESS => {    "ansible_facts": {        "discovered_interpreter_python": "/usr/bin/python"    },    "changed": false,    "ping": "pong"}
复制代码


· Web 服务器:安装 Nginx

目标步骤:

  1. 关闭 Selinux

  2. 安装 Nginx Yum Repository

  3. 安装 Nginx Package

  4. 自定义 nginx.conf 文件

  5. 创建 Nginx 日志目录

  6. 关闭防火墙

  7. 重启 Nginx 服务


· PlayBook 实现

sudo vi nginx_service.yml
复制代码


---- hosts: nginx  vars_files:    - vars/install_nginx_service_vars.yml
tasks: - name: Disable Selinux selinux: state: disabled
- name: Add Nginx Yum Repolist yum_repository: name: Nginx description: Nginx Yum repo baseurl: http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck: yes gpgkey: https://nginx.org/keys/nginx_signing.key
- name: Make Nginx Yum Pepolist Cache command: yum makecache fast
- name: Install Nginx Package yum: name: nginx state: latest
- name: Custom nginx.conf file template: src: j2/nginx.conf.j2 dest: /etc/nginx/nginx.conf owner: root group: root mode: 0644
- name: Create Nginx Logs Dir file: path: "{{ NGINX_LOG_DIR }}" state: directory owner: nginx group: nginx mode: '0755'
- name: Stop and Disable Firewalld Service service: name: firewalld state: stopped
- name: Restart Nginx Service service: name: nginx state: restarted
复制代码


sudo vi vars/install_nginx_service_vars.yml
复制代码


NGINX_LOG_DIR: /data/logs/nginxNGINX_WORKER_CONNECTIONS_NUMBER: 2048
复制代码


sudo vi j2/nginx.conf.j2
复制代码


user nginx;worker_processes auto;error_log {{ NGINX_LOG_DIR }}/error.log crit;pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events { worker_connections {{ NGINX_WORKER_CONNECTIONS_NUMBER }};}
http { log_format access '{"time":"$time_iso8601","http_host":"$http_host","http_referer":"$http_referer","request":"$request","args":"$args","status":"$status","body_bytes_sent":"$body_bytes_sent","request_time":"$request_time","remote_addr":"$remote_addr","http_x_forwarded_for":"$http_x_forwarded_for","http_user_agent":"$http_user_agent"}'
access_log {{ NGINX_LOG_DIR }}/access.log access;
sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;
gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\.";
server_tokens off;
include /etc/nginx/mime.types; default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
}
复制代码



---待续未完



发布于: 2022 年 03 月 24 日阅读数: 19
用户头像

公众号『NChunHisenG』 2018.11.08 加入

🎓广州大学夜校在读 | 👨‍💻在职运维工程师

评论

发布
暂无评论
Ansible:实战笔记_ansible_NChunHisenG.🐰_InfoQ写作平台