我正在尝试编写一个 Ansible 剧本来引导我的服务器。默认情况下,在 Linode 上,我只能使用密码以 root 身份登录,因此我的剧本以 root 身份登录,使用 SSH 密钥创建非 root 用户,并禁用 root 和密码 SSH。
这是一个问题,因为我现在无法再次运行该剧本,因为 root 登录已被禁用!我希望剧本是幂等的,并且在引导主机后不必添加和删除主机。
答案1
我喜欢这样做:
- hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Check ansible user
command: ssh -q -o BatchMode=yes -o ConnectTimeout=3 ansible@{{ inventory_hostname }} "echo OK"
delegate_to: 127.0.0.1
changed_when: false
failed_when: false
register: check_ansible_user
- block:
- name: Create Ansible user
user:
name: ansible
comment: "Ansible user"
password: $6$u3GdHI6FzXL01U9q$LENkJYHcA/NbnXAoJ1jzj.n3a7X6W35rj2TU1kSx4cDtgOEV9S6UboZ4BQ414UDjVvpaQhTt8sXVtkPvOuNt.0
shell: /bin/bash
- name: Add authorized key
authorized_key:
user: ansible
key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
exclusive: yes
- name: Allow sudo for ansible
copy:
content: ansible ALL=(ALL) ALL
dest: /etc/sudoers.d/ansible
mode: 0600
when: check_ansible_user | failed
我尝试使用我的 ansible 用户连接到远程主机。如果这不可能(第一次运行时),我会以 root 身份连接并创建 ansible 用户及其authorized_keys
文件和sudo
权限。
在后续运行中,以 ansible 用户身份连接即可,因此可以跳过任务块。
一旦远程主机启动完毕,我就可以使用 ansible 用户继续执行以下操作become
:
- hosts: all
remote_user: ansible
become: yes
roles:
- ...
答案2
如果您使用以下方式在 Linode 上创建服务器linode模块您可以注册return value
任务linode
并包含引导任务,条件是检查 linode 任务的输出。这应该是幂等的。尝试这样做:
- linode:
api_key: 'longStringFromLinodeApi'
name: linode-test1
plan: 1
datacenter: 2
distribution: 99
password: 'superSecureRootPassword'
private_ip: yes
ssh_pub_key: 'ssh-rsa qwerty'
swap: 768
wait: yes
wait_timeout: 600
state: present
register: linode_node
- include: bootstrap.yml
when: linode_node.changed
bootstrap.yml
将包含禁用 ssh root 登录等所需的所有任务。
答案3
我会做以下事情:
- 创建一个角色(类似于“base”),在其中(除其他事项外),创建一个合适的用户(和 sudo 规则)供 ansible 使用
- 创建或调整你的 SSH 角色,进行管理
sshd_config
(我倾向于建议你使用 来管理整个文件template
,但这取决于你),并禁用 root 登录 - 使您的 SSH 角色依赖于基本角色,例如使用元。
对于第一个角色(基础角色),我倾向于使用类似以下内容:
name: base | local ansible user | create user
user:
name: "{{ local_ansible_user }}"
group: "{{ local_ansible_group }}"
home: "/home/{{ local_ansible_user }}"
state: present
generate_ssh_key: "{{ local_ansible_generate_key }}"
ssh_key_bits: 4096
ssh_key_type: rsa
tags:
- ansible
- local_user
- name: base | local ansible user | provision authorised keys
authorized_key:
user: "{{ local_ansible_user }}"
state: present
key: "{{ item }}"
with_items: "{{ local_ansible_authorised_keys }}"
tags:
- ansible
- authorised_keys
对于 SSH 配置,我将使用:
- name: openssh | server | create configuration
template:
src: sshd_config.j2
dest: /etc/ssh/sshd_config
owner: root
group: root
mode: "0640"
validate: "/usr/sbin/sshd -tf %s"
notify:
- openssh | server | restart
tags:
- ssh
- openssh
Ansible 的角色依赖关系已记录这里。
您也可以使用剧本中的排序来执行此操作。
我有一些github 上的 ansible 内容(以上内容摘自此),如果你想在上下文中看到它
答案4
也许你可以ansible_ssh_user
修改存货在您启动主机之后?
[targets]
other1.example.com ansible_connection=ssh ansible_ssh_user=root # new host
other2.example.com ansible_connection=ssh ansible_ssh_user=user # bootstrapped host