尝试找出让 ansible 在容器内发挥其魔力的最佳方法。考虑过在每个容器中使用 ssh,但那取决于服务器。或者我必须通过代理,这似乎比必要的工作要多。再说一遍,我已经在创建容器、删除容器等了……我说的是使用 ansible 在容器内运行命令,而不是通过 lxc exec containername bash 来运行,我现在可以这样做。有人能找出最好的方法吗?
答案1
您可以尝试以下操作:
- name: Run a complex command within a "running" container
community.general.lxc_container:
name: test-container-started
container_command: |
apt-get update
apt-get install -y curl wget vim apache2
echo 'hello world.' | tee /opt/started
if [[ -f "/opt/started" ]]; then
echo 'hello world.' | tee /opt/found-started
fi
答案2
community.general.lxc_container
肯定已被弃用并且不支持 lxd,因为它指向 bin/lxc-create 硬编码,它不能只运行命令,也许命令只能在创建期间运行。
但仍然是 Ansible 中创建、停止和启动容器的唯一工作工具。
没有修复或者调整为lxd是有原因的。
还有另一种更简单的方法,请参阅这个官方 lxd 演示LXD 和 Ansible。简而言之,它基于连接类型从“ssh”更改为“lxd”。远程连接时需要额外的预配置。
#ansible.cfg
[defaults]
inventory = hosts.yml
#hosts.yml
all:
vars:
ansible_connection: lxd
ansible_user: root
ansible_become: no
children:
local:
vars:
ansible_lxd_remote: local
ansible_lxd_project: demo
hosts:
c1:
v1:
yyy:
vars:
ansible_lxd_remote: tuxedo
hosts:
lxc-tuxedo-1:
xxx:
vars:
ansible_connection: ssh
ansible_user: ada
hosts:
alu-rpi:
#demo.yml
- name: Setup apache
hosts: all
tasks:
- name: install the apache package
apt:
name: apache2
state: present
- name: Make sure apache is running
systemd:
name: apache2.service
state: started
# bash
ansible-playbook demo.yml -l yyy # lxd container via lxd connection
ansible-playbook demo.yml -l xxx # rasberry pi via ssh