我试用了Ansible

首先

为了学习自动化基础设施管理和DevOps,我决定学习Ansible。
虽然开源软件的安装步骤因版本不同而有所差异,但我觉得现在是时候学习一种”轻松部署”环境的方法了。

版本信息

パッケージバージョンCentOS7.6.1810 (Core)Ansible2.9.10

中央控制设备配置、协调和管理的开源自动化工具。

简述

在由RedHat提供的配置管理工具中,通过被称为控制节点的管理机器,向目标节点推动在playbook中记录的配置更改,从而实现大规模服务器配置管理的可能性。

举个例子,可以轻松地对被归类为Web服务器群组的机器安装httpd软件包,或对被归类为数据库服务器群组的机器安装mysql软件包,以便对多台服务器进行各种不同的修改。

“playbook”是什么意思?

Playbook是指Ansible读取的一组配置文件,用于执行一系列操作。

Playbook文件的组成和协作概述

playbook文件将与以下服务(包)的角色配置文件进行协作。
※以下是为httpd设置而创建的playbook。

image.png

服务器配置

No.Ansibleの役割ホスト名IPアドレスセットアップする機能1コントロールノードansiblehost10.0.1.111-2ターゲットノードansibletest110.0.1.112webserver

我想在Playbook上执行任务。

整理目标节点或者想要在测试环境中执行的任务。
※建议使用虚拟化基础设施的快照功能等,在执行步骤之前将状态还原,以便更容易进行确认。

在这个环境中,需要将以下任务从控制节点分发到目标节点。

    • selinuxの無効化

 

    • apache(httpd)のインストールとサービスの有効化(開始)

 

    Firewalldにhttp通信許可ポリシーの追加

操作步骤

1. 准备好

在控制节点上安装Ansible。

根据据说可以从epel-relase仓库获取软件包并进行安装配置,我将按照这一点来安装Ansible。

安装1.1.1.epel-release软件仓库。

[root@ansiblehost]# yum install -y epel-release

1.1.2 安装 Ansible

[root@ansiblehost]# yum install -y ansible

1.1.3.检查Ansible是否已安装

[root@ansiblehost]# ansible --version
ansible 2.9.10
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20158623 (Red Hat 4.0.5-36)]

在控制节点上生成加密密钥并分发给目标节点。

为了在控制节点和目标节点之间无需密码登录,需要将公钥复制到目标节点上。

创造一个密码键

[root@ansiblehost]# ssh-keygen
Generating public/private rsa pair.
Enter file in which to save the key (/root/.ssh/id_rsa): [何も入力せずにEnterキーを押下]
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): [何も入力せずにEnterキーを押下]
Enser same passphrase again: [何も入力せずにEnterキーを押下]
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:FXXPAU665kgaxMSrf2cogEke5j0hdVGdXWW617s8huM rootpansiblehost
+---[RSA 2040]---+
|     .00.0.+o+o+|
|   . .p. .. .. o|
|  = ... .  .  ..|
| = * o.S. p  ...|
|     +. ...  .. |
|       o o .Eoo.|
+----[SHA256]----+

将1.2.2.的加密密钥分发给目标节点。

[root@ansiblehost]# cd /root/.ssh
[root@ansiblehost]# cp-p id_rsa.pub authorized_keys
[root@ansiblehost]# cd /root
[root@ansiblehost]# scp -pr .ssh root@10.0.1.112:~/

在中国是以中文为母语的情况下,将以下内容进行改写:
1.登录到目标节点的ssh。

[root@ansiblehost]# ssh root@10.0.1.112
Last login: Fri Sep 11 16:52:42 2020 from 10.0.1.111
[root@ansibletest1]#

2. Ansobile通信确认

2.1. 将名称解析设置配置到hosts文件中


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.0.1.112 ansibletest1 ansibletest1.dev.local

2.2. 创建清单文件

# 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

[test]
ansibletest1

用Ansible命令进行连接测试。

[root@ansiblehost]# ansible all -m ping
ansibletest1 | SUCCESS => [
  "ansible_facts": [
    "discovered_interpreter_python": "/usr/bin/python"
  ]
  "changed": false,
  "ping": "pong"
]

如果显示出以下结果,则表示无法解析名称或者hosts中的内容有误。

ansibetest1.dev.local | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname ansibetest1.dev.local: Name or service not known",
    "unreachable": true
}

创建一个playbook

在Ansible控制节点上进行playbook创建。

进入管理playbook的文件夹

[root@ansiblehost]# cd /etc/ansible/roles
SSH password: **********

创建一个SELinux任务 4.2.

创建管理selinux任务的目录(译文可能有多种方式,请选择一个):4.2.1. 创建用于管理selinux任务的目录。

image.png

编辑4.2.2.任务相关文件。

- name: disable_selinux
  selinux:
    state: disable
    policy: targeted
  notify: reboot
- import_tasks: selinux.yml

编辑4.2.3中的处理器相关文件。

- name: reboot
  reboot:

创建一个4.3.httpd任务。

创建一个管理4.3.1.httpd任务的目录。

image.png

编辑与任务相关的文件

- name: install_httpd_by_yum
  yum:
    name: httpd
    state: present
  notify: enable
- import_tasks: install.yml

4.3.3. 编辑处理程序相关文件

- name: enable
  systemd:
    name: httpd.service
    state: started
    enabled: yes

创建 4.4. firewalld 任务

创建一个管理firewalld任务的目录

image.png

编辑与任务相关的文件。

- name: add_http_rule
  firewalld:
    service: http
    zone: public
    permanent: yes
    state: enabled
  notify: reload

- meta: flush_handlers
- import_tasks: allowhttpd.yml

编辑4.4.3.处理程序相关文件

- name: reload
  service:
    name: firewalld
    state: reloaded

编辑4.5.playbook文件。

---
- hosts: all
  gather_facts: false
  remote_user: root
  roles:
    - httpd
    - firewalld
    - selinux

5. 运行playbook

[root@ansiblehost]# cd /etc/ansible
[root@ansiblehost]# ansible-playbook webserver.yml -i hosts -k
SSH password: *******

PLAY [all] ********************************************************************************************************************

TASK [install_httpd_by_yum] ***************************************************************************************************
change: [ansibletest1]

TASK [firewalld: add_httpd_rules] *********************************************************************************************
change: [ansibletest1]

RUNNING HANDLER [httpd: enable] ***************************************************************************************************
change: [ansibletest1]

RUNNING HANDLER [firewalld: reload] ***************************************************************************************************
change: [ansibletest1]

TASK [disable_selinux] ********************************************************************************************************
[WARNING]: SELinux state temporarily changed from 'enforcing' to 'permissive'. State change will take effect next reboot.
changed: [ansibletest1]

RUNNING HANDLER [selinux : reboot] ********************************************************************************************
changed: [ansibletest1]

PLAY RECAP ********************************************************************************************************************
ansibletest1              : ok=6   changed=6    unreachable=0    failed=0    skipped=0     rescued=0    ignored=0

如果出现错误的情况下

在最初的测试中,我错误地更改了selinux的配置步骤。此时显示的错误如下所示。

fatal: [ansibletest1]:FAILED! => ["changed": false, "msg": "value of state must be one of: enforcing, permissive, disabled. go
t: disable"]

如果要重新建立目标服务器的话

如果重新建立目标服务器,需要在控制服务器上删除.ssh/hosts中记录的目标服务器的ssh信息。

ansible-playbook 命令格式

ansible-playbook {playbook file} -i {inventory file} -l {host group} -k
オプション説明-ispecify inventory host path or comma separated host list.-kask for connection password-lfurther limit selected hosts to an additional pattern

可以参考

    • Ansible入門者向け学習ガイド(CentOS編) http://c.itdo.jp/technical-information/ansible/ansible-tutorial/#back3

5分でSSHの公開鍵認証を有効化する方法【ファイル転送ソフト不要】 https://hackers-high.com/linux/easy-ssh-publickey-authentication/

インベントリーの構築方法 https://docs.ansible.com/ansible/2.9_ja/user_guide/intro_inventory.html

AnsibleコマンドでPING疎通する https://docs.ansible.com/ansible/2.9_ja//user_guide/intro_getting_started.html

systemdモジュール https://docs.ansible.com/ansible/latest/modules/systemd_module.html#systemd-module

handlersとnotifyの関係について https://blog.amedama.jp/entry/2015/09/01/214912

playbook実行時にホストグループを指定 https://tech.withsin.net/2017/07/19/ansible-playbook-l/

广告
将在 10 秒后关闭
bannerAds