Ansible贴士二则

避免主机SSH指纹确认

通常在第一次用SSH连接一台远程主机的时候,都会弹出一个SSH指纹警告,需要人工确认后,把这个指纹加到本地.ssh/knwon_hosts文件中。以后要是同一远程主机的指纹变化了(比如被冒充),就会导致SSH报错后断开连接,除非你能确认这种变化,那就需要从known_hosts里把原来的指纹删除:

ssh-keygen -R remote_host:port

然后再次连接并确认记录新指纹。

手工单次连接时顺手确认一下没什么问题,但是用Ansible连接实际上也是走ssh,也要验证指纹,所以也会有这个交互过程。

但这就麻烦了,因为通常用Ansible跑playbook时都是需要处理一堆主机的,每个都这样人工确认就太麻烦了,所以更好的办法是先批量更新一下known_hosts:

# 主机地址列表
HOSTS=(xxx yyy zzz)

for h in "${HOSTS[@]}"
do
    ssh-keyscan -p 22 $h >> ~/.ssh/knwon_hosts
done

使用指定的key连接

通常用ssh连接时,可以通过-i参数指定key文件,比如:

ssh -i /path_to/your_key_file user@host

Ansible里也可以指定,使用ansible_ssh_private_key_file变量:

ansible_ssh_private_key_file: /path_to/your_key_file

外一则

之前在Ansible中创建用户用的生成密码命令:

python3 -c "import crypt; print(crypt.crypt('{{ plain_password }}'))"

现在会报一个警告:

DeprecationWarning: 'crypt' is deprecated and slated for removal in Python 3.13

从Python3.13开始要移除crypt模块了,所以需要换个方式。

一个方式是使用passlib模块:

python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.hash('your_password'))"

不过更好的方法是使用Ansible内置的过滤器:

- name: 创建用户
  hosts: all
  vars:
    plain_password: "your_password"
  
  tasks:
    - name: 创建用户(使用过滤器生成哈希)
      user:
        name: youruser
        password: "{{ plain_password | password_hash('sha512') }}"
        state: present
      no_log: true

推送到[go4pro.org]