说我有一台服务器,我想做以下事情:
我对执行这些任务的说明不感兴趣。 网上有很多东西。
我的问题是关于最佳做法。
这里有几个问题:
如果我的方法存在一些基本问题,我也将不胜感激。
我维护一个“bootstrap”剧本,与我的其他剧本和角色分开,完成安装python 2.x和python-apt或python 3.x和python3-apt(使用local_action和ssh)的初始工作,创建用户和授予sudo访问权限,锁定root和SSH等。如果我需要引导新的主机,我运行带有限制( -l
或--limit
)选项的playbook。 如果我需要修改现有主机,例如添加新用户,我运行playbook并传入额外的变量( -e
或--extra-vars
)来覆盖SSH用户名和端口。 我的任务被参数化,以便他们使用sudo(或不使用)或变为(或不变),具体取决于变量定义,例如:
- hosts: all
vars:
ansible_user: root
become: "{{ ansible_user != 'root' }}"
如果您有其他问题,请告诉我,我会尽力扩展这个答案!
就像@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用户执行的其他操作( remote_user = ansible
ansible.cfg中的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永远不会直接从具体的playbook中调用。
一种方法是在启动之前尽可能多地处理这个问题。 也就是说,修改您正在启动的图像,以便它已经进行了必要的更改。 亚马逊将建立一个定制的AMI; 与其他供应方法相比,它将有不同的技术,但原则是相同的。