我试用了Ansible
首先
为了学习自动化基础设施管理和DevOps,我决定学习Ansible。
虽然开源软件的安装步骤因版本不同而有所差异,但我觉得现在是时候学习一种”轻松部署”环境的方法了。
版本信息
中央控制设备配置、协调和管理的开源自动化工具。
简述
在由RedHat提供的配置管理工具中,通过被称为控制节点的管理机器,向目标节点推动在playbook中记录的配置更改,从而实现大规模服务器配置管理的可能性。
举个例子,可以轻松地对被归类为Web服务器群组的机器安装httpd软件包,或对被归类为数据库服务器群组的机器安装mysql软件包,以便对多台服务器进行各种不同的修改。
“playbook”是什么意思?
Playbook是指Ansible读取的一组配置文件,用于执行一系列操作。
Playbook文件的组成和协作概述
playbook文件将与以下服务(包)的角色配置文件进行协作。
※以下是为httpd设置而创建的playbook。
服务器配置
我想在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任务的目录。
编辑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任务的目录。
编辑与任务相关的文件
- 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任务的目录
编辑与任务相关的文件。
- 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
可以参考
-
- 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/