说我有一台服务器,我想做以下事情:
我对执行这些任务的说明不感兴趣。网上有很多东西。
我的问题是关于最佳做法。
以下是一些问题:
如果我的方法存在一些基本问题,我也会感激。
答案 0 :(得分:2)
就像@mwp一样,我有一个playbook来启动ansible。它创建特殊用户(名为'ansible)以连接到服务器,将它们添加到sudoers。这本剧本尽可能少。
---
# This playbook for prepare server for ansible.
- name: add role ansible_init
hosts: '{{ target }}'
remote_user: root
roles:
- ansible_init
角色'ansible_init'是:
---
- name: install ansible client library
yum: name={{ item }} state=latest
with_items:
- libselinux-python
- policycoreutils-python
- name: useradd ansible
user:
name={{ ansible_init.ansible_user.login }}
password={{ ansible_init.ansible_user.password }}
- name: add default ssh key for ansible user
authorized_key:
user={{ ansible_init.ansible_user.login }}
key="{{ lookup('file', '{{ ansible_init.ansible_user.ssh_key_file }}') }}"
state=present
- name: nopasswd sudo for ansible user
lineinfile: "dest=/etc/sudoers state=present regexp='^{{ ansible_init.ansible_user.login }}' line='{{ ansible_init.ansible_user.login }} ALL=(ALL) NOPASSWD: ALL'"
作为ansible用户执行的其他操作(ansible.cfg中为remote_user = ansible
)。
设置服务器(邮件,数据库,网络等)的数字剧本包括必要的角色,在常见的剧本中分开的常见步骤(包括作为第一步)。常见的playbook设置了sshd,firewalld,fail2ban,安装了额外的repos,服务器的known_hosts等。
典型的剧本看起来像:
# This playbook deploys 'webserver' server.
- include: init_server.yml
- name: deploy 'webserver'
hosts: '{{ target | default("webservers") }}'
become: true
become_user: root
roles:
- git
- nginx
...........
init_server.yml永远不会直接从具体的剧本中调用。
答案 1 :(得分:1)
我维持" bootstrap" playbook,与我的其他playbooks和角色分开,完成安装python 2.x和python-apt(使用local_action和ssh),创建用户和授予sudo访问权限,锁定root和SSH等的初始工作。如果我需要为了引导新的主机,我运行了限制(-l
或--limit
)选项的playbook。如果我需要修改现有主机,例如添加新用户,我运行playbook并传入额外的变量(-e
或--extra-vars
)来覆盖SSH用户名和端口。根据变量定义,我的任务被参数化,使得它们使用sudo(或不使用)或变为(或不变),例如:
become: "{{ 'no' if ansible_ssh_user == 'root' else 'yes' }}"
如果您有其他问题,请告诉我,我会尽力扩展此答案!
答案 2 :(得分:0)
一种方法是在启动之前尽可能多地处理此问题。也就是说,修改您正在启动的图像,以便它已经进行了必要的更改。亚马逊将建立一个定制的AMI;与其他供应方法相比,它将有不同的技术,但原则是相同的。