В настоящее время я использую ansible для подготовки и настройки нашей aws среды в клиентской среде. Пользователь s sh имеет значение "ansible", доступное для всех экземпляров ec2, работающих в centos, amazon linux, redhat или ubuntu.
Работает нормально, пока я держу ansible Пользователь уполномочен так же, как root. В sudoers, если я упомяну:
ansible ALL=(root) NOPASSWD: ALL
Но это неприемлемое решение, поскольку ansible нужно давать только все, что нужно.
Например, установка агента cloudwatch на centos , он выполняет следующие шаги:
- name: install agent
yum:
name: /tmp/aws-cw-agent/amazon-cloudwatch-agent.rpm
state: present
become: yes
- name: setup agent
copy:
src: amazon-cloudwatch-agent.json
dest: "{{aws_cw_root}}/etc/amazon-cloudwatch-agent.json"
become: yes
- name: configure agent
shell: |
./amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:"{{ aws_cw_root }}/etc/amazon-cloudwatch-agent.json" \
-s
args:
chdir: "{{ aws_cw_root }}/bin"
become: yes
- name: restart agent
service:
name: amazon-cloudwatch-agent
state: restarted
become: yes
Но если я даю явное разрешение, как показано ниже в sudoers для ansible пользователей, он завершается ошибкой:
ansible ALL=(root) NOPASSWD: /usr/bin/yum install -y amazon*
ansible ALL=(root) NOPASSWD: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl *
ansible ALL=(root) NOPASSWD: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent*
ansible ALL=(root) NOPASSWD: /bin/systemctl restart amazon-cloudwatch-agent
Он завершается неудачей со следующим сообщением:
16:59:03 Running yum as the backend for the yum action plugin
16:59:04 Using module file /usr/lib/python3.6/site-packages/ansible/modules/packaging/os/yum.py
16:59:04 Pipelining is enabled.
16:59:04 <10.1.10.2> ESTABLISH SSH CONNECTION FOR USER: ansible
16:59:04 <10.1.10.2> SSH: EXEC sshpass -d10 ssh -vvv -C -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o 'User="ansible"' -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=10 -o ControlPath=/home/jenkins/.ansible/cp/09cfb0f6cd 10.1.10.2 '/bin/sh -c '"'"'sudo -H -S -n -u root /bin/sh -c '"'"'"'"'"'"'"'"'echo BECOME-SUCCESS-wwwwazktxxxxxxxxectin ; /usr/bin/python'"'"'"'"'"'"'"'"' && sleep 0'"'"''
16:59:04 Escalation succeeded
16:59:04 <10.1.10.2> (1, b'', b'OpenSSH_7.9p1, OpenSSL 1.1.1d 10 Sep 2019\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 10.1.10.2 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 112\r\ndebug3: mux_client_request_session: session request sent\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\n')
16:59:04 <10.1.10.2> Failed to connect to the host via ssh: OpenSSH_7.9p1, OpenSSL 1.1.1d
16:59:04 fatal: [qa-pilot-vm]: FAILED! => {
16:59:04 "changed": false,
16:59:04 "module_stderr": "OpenSSH_7.9p1, OpenSSL 1.1.1d 10 Sep 2019\r\ndebug1: Reading configuration data /etc/ssh/ssh_config\r\ndebug2: resolve_canonicalize: hostname 10.1.10.2 is address\r\ndebug1: auto-mux: Trying existing master\r\ndebug2: fd 3 setting O_NONBLOCK\r\ndebug2: mux_client_hello_exchange: master version 4\r\ndebug3: mux_client_forwards: request forwardings: 0 local, 0 remote\r\ndebug3: mux_client_request_session: entering\r\ndebug3: mux_client_request_alive: entering\r\ndebug3: mux_client_request_alive: done pid = 112\r\ndebug3: mux_client_request_session: session request sent\r\ndebug3: mux_client_read_packet: read header failed: Broken pipe\r\ndebug2: Received exit status from master 1\r\n",
16:59:04 "module_stdout": "",
16:59:04 "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error",
16:59:04 "rc": 1
Это показывает, что playbook ломается на установочной части yum, чего не должно быть, потому что у него есть соответствующие права.
Фактически, если я добавлю ниже детали в sudoers, это также не работает, что в идеале мне следует не использовать. Но я попробовал, это не сработало, что должно было работать как и для всех пакетов.
ansible ALL=(root) NOPASSWD: /usr/bin/yum install -y *
Есть идеи, какие права в sudoers будут работать для ansible пользователя?