0%

Ansible 使用总结

Ansible 使用总结

Ansible默认通过 SSH 协议管理机器.

安装Ansible之后,不需要启动或运行一个后台进程,或是添加一个数据库.只要在一台电脑(可以是一台笔记本)上安装好,就可以通过这台电脑管理一组远程的机器.在远程被管理的机器上,不需要安装运行任何软件,因此升级Ansible版本不会有太多问题.

  • 管理主机

  • 托管节点

    管理主机使用 ssh 协议与托管节点通信,默认使用 sftp, 可在 ansible.cfg 文件中配置成 scp 方式。托管节点需要安装 Python

ansible 配置文件

查找ansible.cfg文件的顺序

  • ANSIBLE_CONFIG 环境变量所指定的文件
  • ./ansible.cfg
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

配置举例:

1
2
#指定inventory文件位置
inventory = hosts

inventory 配置文件

用于配置托管节点的主机信息。

1
2
3
4
5
[test]
virtualbox ansible_ssh_host=host.docker.internal ansible_ssh_port=2222 ansible_ssh_user=root ansible_ssh_pass='root'

# 配置托管节点 python 解析器路径
# ansible_python_interpreter=/usr/bin/python3

1
2
3
4
ansible myhost --sudo -m raw -a "yum install -y python2 python-simplejson"


ansible test --su --su-user="root" -m raw -a "dnf search python"

test 组中所有托管节点执行以下命令

1
ansible test -m shell -a "pwd"

ansible

Ansibe AD-Hoc 临时命令执行工具,常用于临时命令的执行

ansible-doc

ansible-doc 命令常用于获取模块信息及其使用帮助。

1
2
3
4
#获取全部模块的信息
ansible-doc -l
#获取指定模块的使用帮助
ansible-doc -s MOD_NAME

ansible-playbook

Ansible 定制自动化的任务集编排工具。

ansible-galaxy

Galaxy 是一个查找和分享 ansible 内容的中心。ansible-galaxy 可以通过这个平台,下载共享者的 roles

ansible-vault

Ansible 文件加密工具

ansible-console

Ansible基于Linux Consoble界面可与用户交互的命令执行工具

playbook

playbook是ansible实现批量自动化最重要的手段,采用yaml语法。

Create Directory by root 任务开始执行。

1
ansible-playbook demo.yml --start-at-task="Create Directory by root"

roles

role是task文件、变量文件、handlers文件的集合体,这个集合体的显著特点是:可移植性和可重复执行性。

实践中,通常我们以部署某个服务为单元作为一个role ,然后将这些服务单元(role)放在一个roles目录下。主playbook文件通过调用roles目录下的role,来实现各种灵活多变的部署需求。

使用 ansible-galaxy 创建一个 php 服务实例:

1
ansible-galaxy init php

使用 ansible-galaxy 命令自动创建的role是最全的目录结构,根据需求,可以删除不用的目录文件。

  • tasks目录:存放task列表。若role要生效,此目录必须要有一个主task文件main.yml,在main.yml中可以使用include包含同目录(即tasks)中的其他文件。
  • handlers目录:存放handlers的目录,若要生效,则文件必须名为main.yml文件。
  • files目录:在task中执行copy或script模块时,如果使用的是相对路径,则会到此目录中寻找对应的文件。
  • templates目录:在task中执行template模块时,如果使用的是相对路径,则会到此目录中寻找对应的模块文件。
  • vars目录:定义专属于该role的变量,如果要有var文件,则必须为main.yml文件。
  • defaults目录:定义角色默认变量,角色默认变量的优先级最低,会被任意其他层次的同名变量覆盖。如果要有var文件,则必须为main.yml文件。
  • meta目录:用于定义角色依赖,如果要有角色依赖关系,则文件必须为main.yml。

参考:

​ - https://www.cnblogs.com/f-ck-need-u/p/7567417.html

托管节点 python 环境安装

1
ansible -m raw -a "dnf install -y python3" virtualbox

查看内置的 Facts 变量

1
ansible -m setup virtualbox

无界面模式启动虚拟机

1
VBoxManage startvm --type headless centos-8.1.1911

项目构建

1
2
3
4
5
6
7
8
9
10
mkdir product
cd product
touch php.yml mysql.yml nginx.yml
mkdir roles
cd roles
ansible-galaxy init php
ansible-galaxy init mysql
ansible-galaxy init nginx
cd ../../

目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
tree ./product -L 3

./product
├── mysql.yml
├── nginx.yml
├── php.yml
└── roles
├── mysql
│   ├── README.md
│   ├── defaults
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── tests
│   └── vars
├── nginx
│   ├── README.md
│   ├── defaults
│   ├── handlers
│   ├── meta
│   ├── tasks
│   ├── tests
│   └── vars
└── php
├── README.md
├── defaults
├── handlers
├── meta
├── tasks
├── tests
└── vars

对托管节点进行部署

1
ansible-playbook ./product/php.yml
什么是 EPEL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
yum install -y epel-release
vi /etc/yum.repos.d/epel.repo

# 编辑[epel]下的baseurl前的#号去掉,mirrorlist前添加#号。正确配置如下:
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearchfailovermethod=priorityenabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6


yum makecache



yum config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo

首先需要安装一个叫”epel-release”的软件包,这个软件包会自动配置yum的软件仓库。当然你也可以不安装这个包,自己配置软件仓库也是一样的。

1
2
3
4
5
# 安装 epel 
yum install -y epel-release

# 卸载 epel
rpm -e epel-release

使用 阿里云 epel 源

1
2
3
4
yum install -y wget
wget -P /etc/yum.repos.d/ https://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
1
yum install -y php-pear php-devel

php 7.4.9 默认编译安装后,没有 pecl 命令。

php-config 得到扩展安装目录

1
/data/php/bin/php-config --extension-dir

vi /data/php/etc/php.ini

1
2
3
4
extension_dir="/data/php/lib/php/extensions/no-debug-non-zts-20190902"

[mcrypt]
extension=mcrypt.so

ansible 使用参考

ImageImgick 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
djvulibre-devel


dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y

dnf install ImageMagick

安装:
ImageMagick x86_64 6.9.10.86-1.el8 epel 195 k
安装依赖关系:
ImageMagick-libs x86_64 6.9.10.86-1.el8 epel 2.3 M
atk x86_64 2.28.1-1.el8 AppStream 272 k
gd x86_64 2.2.5-6.el8 AppStream 144 k
gdk-pixbuf2-modules x86_64 2.36.12-5.el8 AppStream 109 k
graphviz x86_64 2.40.1-40.el8 AppStream 1.7 M
gtk-update-icon-cache x86_64 3.22.30-5.el8 AppStream 32 k
gtk2 x86_64 2.24.32-4.el8 AppStream 3.4 M
hicolor-icon-theme noarch 0.17-2.el8 AppStream 49 k
libXaw x86_64 1.0.13-10.el8 AppStream 194 k
libXcomposite x86_64 0.4.4-14.el8 AppStream 28 k
libXdamage x86_64 1.1.4-14.el8 AppStream 27 k
librsvg2 x86_64 2.42.7-3.el8 AppStream 570 k
libtool-ltdl x86_64 2.4.6-25.el8 BaseOS 58 k
xorg-x11-fonts-ISO8859-1-100dpi noarch 7.5-19.el8 AppStream 1.1 M

托管节点

1
yum install -y python2

确认 php 扩展是否成功安装

1
/data/php/bin/php -m | grep "mcrypt\|yaf\|redis\|imagick\|swoole\|inotify"

从托管节点上下载文件至主机

1
scp -P 2222 root@127.0.0.1:"/tmp/*.tgz" ./

jinja2 模板文件中若存在特殊字符: ;# ,需提前进行处理:

1
2
3
4
5
6
7
8
9
10
11
12
sed -i "" 's/^;/{% raw %};/g; s/^{% raw %};.*[^{% endraw %}]$/&{% endraw %}/g' test.conf.j2



sed -i "" 's/^;/{% raw %};/g; s/^{% raw %};.*$/&{% endraw %}\'$'\n/g' test.conf.j2
or
sed -i "" $'s/^;/{% raw %};/g; s/^{% raw %};.*$/&{% endraw %}\\\n/g' test.conf.j2


# nginx

sed -i "" $'s/^[[:space:]]*#/{% raw %}&/g; s/^{% raw %}[[:space:]]*#.*$/&{% endraw %}\\\n/g' nginx.conf.j2

Max-os 换行符问题

新增功能项

  • [可关闭] 建立 php 脚本软连接:ln -s /data/php/bin/php /usr/bin/php
  • [可关闭] 建立 nginx 脚本软连接:ln -s /data/nginx/sbin/nginx /usr/bin/nginx
待完成事项
  • 包源码目录、包压缩文件删除。
  • 增加 handlers,notify 服务启动、重启功能。
  • 整理项目代码:删除无用文件及代码,简洁项目。
  • 禁用 gather_facts ,查找获取 ip 的其他方法。
  • 虚拟机环境配置,base 操作系统镜像 ip 配置。
  • 角色变量整理。

SELinux 命令

  • 查看 SELinux 状态

    1
    2
    3
    4
    /usr/sbin/sestatus -v

    # or
    getenforce
  • 关闭SELinux

    1
    2
    3
    4
    5
    6
    7
    # 临时关闭
    $ setenforce 0

    # 永久关闭
    $ /etc/selinux/config
    # 将SELINUX=enforcing改为SELINUX=disabled
    $ reboot

jinja2 模板处理参考

Mac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
brew create https://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz --force

brew install sshpass


brew tap esolitos/ipa
brew install sshpass

export LC_ALL="en_US.UTF-8"


# 源码方式编译安装 sshpass
curl -O -L https://sourceforge.net/projects/sshpass/files/sshpass/1.06/sshpass-1.06.tar.gz && tar xvzf sshpass-1.06.tar.gz
curl -O -L https://fossies.org/linux/privat/sshpass-1.06.tar.gz && tar xvzf sshpass-1.06.tar.gz
cd sshpass-1.06
./configure
sudo make install
mysql.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service

[Service]
User=mysql
Group=mysql
#systemctl status就是根据pid来判断服务的运行状态的
PIDFile=/var/run/mysqld/mysqld.pid
# 以root权限来启动程序
PermissionsStartOnly=true
# 设置程序启动前的必要操作。例如初始化相关目录等等
ExecStartPre=/usr/bin/mysql-systemd-start pre
# 启动服务
ExecStart=/usr/bin/mysqld_safe
# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post
# Give up if ping don't get an answer
TimeoutSec=600
#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
Restart=always
PrivateTmp=false
nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile={{ NGINX_INSTALL_PATH }}/logs/nginx.pid
ExecStart={{ NGINX_INSTALL_PATH }}/sbin/nginx
ExecReload={{ NGINX_INSTALL_PATH }}/sbin/nginx -s reload
ExecStop={{ NGINX_INSTALL_PATH }}/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sed -i 's/post_max_size =.*/post_max_size = 50M/g' {{ PHP_INSTALL_PATH }}/etc/php.ini
sed -i 's/upload_max_filesize =.*/upload_max_filesize = 50M/g' {{ PHP_INSTALL_PATH }}/etc/php.ini
sed -i 's/;date.timezone =.*/date.timezone = PRC/g' {{ PHP_INSTALL_PATH }}/etc/php.ini
sed -i 's/short_open_tag =.*/short_open_tag = On/g' {{ PHP_INSTALL_PATH }}/etc/php.ini
sed -i 's/;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=0/g' {{ PHP_INSTALL_PATH }}/etc/php.ini
sed -i 's/max_execution_time =.*/max_execution_time = 300/g' {{ PHP_INSTALL_PATH }}/etc/php.ini


#/sbin/iptables -I INPUT 1 -i lo -j ACCEPT
#/sbin/iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT
#/sbin/iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
#/sbin/iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT
#/sbin/iptables -I INPUT 5 -p tcp --dport 443 -j ACCEPT
#/sbin/iptables -I INPUT 6 -p tcp --dport 3306 -j DROP
#/sbin/iptables -I INPUT 7 -p icmp -m icmp --icmp-type 8 -j ACCEPT

php-fpm.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[global]
pid = {{ PHP_INSTALL_PATH }}/var/run/php-fpm.pid
error_log = {{ PHP_INSTALL_PATH }}/var/log/php-fpm.log
log_level = notice

[www]
#listen = /tmp/php-cgi.sock
listen = 127.0.0.1:9000
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = {{ PHP_INSTALL_PATH }}/var/log/slow.log
1
47.104.111.157 ansible_connection=ssh ansible_ssh_user=root ansible_ssh_pass=ZJroot123 ansible_ssh_extra_args='-o StrictHostKeyChecking=no'

2019-11-23 学习 ansible 总结记录

使用 ping 模块测试连接情况

ansible -i ./hosts webservices -m ping

ansible host|all -m 模块 -a “模块参数” -f 一次连接多少个主机

查看涉及的所有主机信息

ansible-playbook ./site.yml -i ./hosts –list-hosts

当第一次连接远程主机,跳过yes/no环节

inventory:
Add the following.
ansible_ssh_common_args=’-o StrictHostKeyChecking=no’
host:
Add the following.
ansible_ssh_extra_args=’-o StrictHostKeyChecking=no’
全局处理:
1. /etc/ansible/ansible.cfg host_key_checking = False
2. ansible-playbook -e ‘host_key_checking=False’ yourplaybook.yml
3. export ANSIBLE_HOST_KEY_CHECKING=False

参考:

帮助类相关命令

查看当前支持的所有模块

ansible-doc -l

查看当前指定模块使用方法

ansible-doc -s 模块名

ansible-playbook 使用:

列出运行任务的主机

ansible-playbook ./site.yml -i ./hosts –list-hosts

列出要运行的任务列表

ansible-playbook ./site.yml -i ./hosts –list-tasks

列出所有可用标签

ansible-playbook ./site.yml -i ./hosts –list-tags

仅执行 download-nginx tag.

ansible-playbook ./site.yml -i ./hosts –tags=”download-nginx”

跳过指定标签任务

ansible-playbook ./site.yml -i ./hosts –skip-tags=make-nginx

检测语法

ansible-playbook ./site.yml -i ./hosts –syntax-check

sed 命令参考

2021-07-14 日志

通过 ansible shell 模块下载最新 nginx 包文件 – 未实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# tasks file for nginx
#- name: Set will be install nginx version.
#shell:
#cmd: |
##!/bin/bash
#set -e
#lf=$'\n';
#curl -s 'https://nginx.org/en/download.html' | sed "s/</\\$lf</g" | sed -n "/>Stable version$/,$ p" | egrep -m1 -o "/download/nginx-.+\.tar\.gz" | sed "s/\/download\/nginx-\([0-9]*\.[0-9]*\.[0-9]*\).tar.gz/\1/g";
##shell: >
##echo 'hello';
##echo 'world';
#register: _nginx_version
#when: _nginx_version == "latest"

#- name: debug nginx version.
#debug: var=_nginx_version

#- name: debug.
#debug: var=ansible_os_family