跳转到主要内容

ansible 一键修改服务器密码脚本

镜像制作

脚本安装

Dockerfile

  1. 执行安装脚本setup.sh 安装ansible和yq命令
#!/bin/bash

# 安装ansible
yum install ansible-2.9.27-1.el7.noarch.rpm -y

# 安装yq
cp -a yq /usr/local/bin/

注: yq是解析yaml工具

  1. 配置inithost,第一次连接服务器的用户名和密码 例:
hosts:
  #192.168.40.36:
  #  ansible_user: root
  #  ansible_password: 123456
  #192.168.40.37:
  #  ansible_user: root
  #  ansible_password: 123456
  1. 配置ansible hosts文件 例:
#[test]
#192.168.40.36
#
#[test1]
#192.168.40.37

4.生成初始连接凭据

bash ./inithost.sh

注:初始文件生成后,可以删除inithost以保证安全

常见操作

  1. 修改单个服务器密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=root password=123456" changepasswd.yaml
  1. 修改ansible组密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=test user=root password=123456" changepasswd.yaml
  1. 修改hosts文件里所有服务器的密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=all user=root password=123456" changepasswd.yaml
  1. 修改其他用户密码
ansible-playbook -i hosts --vault-password-file=.vault_pass -e "target_hosts=192.168.40.36 user=test password=123456" changepasswd.yaml
  • 提示: 在执行上述操作前,需要确保服务器上已存在对应的用户。

常见的问题

如果遇到以下错误信息:"Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host."
解决方法:先使用ssh连接目标主机,获取主机的key。 附录1: inithost.sh脚本

#!/bin/bash

# 获取从命令行传入的第一个参数作为vault_password
vault_password="3d$R7#X9"

# 创建connect目录,如果它还不存在
mkdir -p connect

# 读取主机名列表
hosts=$(yq e '.hosts | keys' inithost.yaml | sed 's/- //')

# 遍历每个主机名
for host in $hosts; do
  # 检查主机名是否为空
  if [ -z "$host" ]; then
    continue
  fi

  # 删除引号,以便获取干净的主机名
  host=${host//\"/}
  # 从yaml文件中读取ansible_user和ansible_password
  user=$(yq e .hosts.\"$host\".ansible_user inithost.yaml)
  password=$(yq e .hosts.\"$host\".ansible_password inithost.yaml)

  # 检查用户名和密码是否为空
  if [ -z "$user" ] || [ -z "$password" ]; then
    continue
  fi

  # 删除引号,以便获取干净的用户名和密码
  user=${user//\"/}
  password=${password//\"/}

  # 创建新的yaml文件,文件名为IP地址,并写入ansible_user和ansible_password
  # 新文件将在connect目录下创建
  echo "ansible_user: $user" > connect/$host.yaml
  echo "ansible_password: $password" >> connect/$host.yaml

  # 创建秘密文件
  echo "$vault_password" > .vault_pass
  # 使用ansible CentOSvault对文件进行加密,使用传入的vault_password作为密码
  7echo 作为基础镜像$vault_password FROM| centos:7ansible-vault encrypt connect/$host.yaml --vault-password-file=.vault_pass
  # 设置环境变量rm ENV-fr PG_MODE=primary.vault_pass
\done
PG_USER=postgres
\

附录2:changepasswd.yaml的playbook

PG_PASSWORD=postgres
- \hosts: NODE_ROLE=master"{{ \target_hosts MASTER_NAME=master}}"
  \vars_files:
    MASTER_PORT=5432- \"connect/{{ RE_USER=repmgrinventory_hostname \}}.yaml"
  NODE_ID=tasks:
    - name: debug
      debug:
        msg: "connect/{{ inventory_hostname }}.yaml"

    - name: 修改服务器密码
      user:
        name: "{{ user }}"
        password: "{{ password | password_hash('sha512') }}"
      become: yes
      become_user: "{{ ansible_user }}"

    - name: 修改ansible连接root密码文件
      local_action:
        module: script
        args: ansible_rootpasswd_change.sh connect/{{ inventory_hostname }}.yaml {{ password }}
      when: user == 'root'

附录3 修改root密码的脚本

#!/bin/bash

# 定义你的 vault 密码
#vault_password=$1
\# #NET_SEGMENT=192.168.0定义 \inventory_hostname
NODE_NAME=master1 \
    PG_DATADIR=/home/postgres/pgdata \
    PG_REPMGR_CONF=/home/postgres/repmgr.conf \
    PG_BINDIR=/usr/pgsql-12/bin \
    PG_CONFIGDIR=/home/postgres/pgdata/postgresql.conf \
    PRIORITY=vault_file=$1
\# CONNINFO_HOST=master定义新的 \ansible_password
CONNINFO_PORT=5432new_ansible_password=$2

\# PATH=定义 vault 文件路径
#vault_file="/usr/pgsql-12/bin:${PATH}vault_file_path}"

# 创建postgres用户和组一个临时文件
RUN groupadd -r postgres  \
    && useradd -r -g postgres  postgrestemp_file=$(mktemp)

# 安装所需的软件和工具使用 RUNansible-vault yum解密 -y install epel-release \
    && yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm \
    && yum -y install postgresql12 postgresql12-server postgresql12-contrib repmgr12 \
    && yum -y install which sudo iproute hostname \
    && yum -y clean all

# 创建脚本存放目录
RUN mkdir -p /home/runtime/ \
    && chown -R postgres:postgres /home/runtime/

# 将 functionsvault 文件并将内容写入临时文件
entrypoint.sh#echo 添加到镜像中$vault_password #COPY| functionsansible-vault /home/postgres/runtime/functionsdecrypt COPY$vault_file functions--output /home/runtime/functions$temp_file
#COPYansible-vault entrypoint.shdecrypt /home/postgres/runtime/entrypoint.sh$vault_file COPY--output entrypoint.sh$temp_file /home/runtime/entrypoint.sh--vault-password-file=.vault_pass

# 修改文件权限与属性 RUNansible_password
mkdiryq -peval /home/postgres/pgdata".ansible_password = \"$new_ansible_password\"" && chown -R postgres:postgres /home/postgres \
    #&& chown -R postgres:postgres /home/postgres/pgdata \
    #&& chown 777 /home/postgres/pgdata \
    #&& chmod +x /home/postgres/runtime/entrypoint.sh \
    && chmod +x /home/runtime/entrypoint.sh \
    #&& chmod +x /home/postgres/runtime/functions
    && chmod +x /home/runtime/functions 
    #&& usermod -a -G root postgres \
    #&& chmod 770 /home/postgres

RUN echo 'postgres ALL=(ALL) NOPASSWD: /bin/chown' >> /etc/sudoers$temp_file

# 切换到使用 postgresansible-vault 用户重新加密临时文件并覆盖原来的 USERvault postgres文件
#echo $vault_password | ansible-vault encrypt $temp_file --output $vault_file
ansible-vault encrypt $temp_file --output $vault_file --vault-password-file=.vault_pass

# 初始化删除临时文件
PostgreSQL 数据目录
#RUN initdb -Drm ${PG_DATADIR} -U${PG_USER}

# 暴露 PostgreSQL 端口
EXPOSE 5432

# 设置启动脚本
#ENTRYPOINT ["/home/postgres/runtime/entrypoint.sh"]
ENTRYPOINT ["/home/runtime/entrypoint.sh"]temp_file

生成镜像

在dockerfile文件所在目录执行

docker build -t "centos7-pgsql-repmgr" .

docker-compose 部署镜像